From b02007598e2f498d447f4a9ab8ada4d126aceade Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Mon, 28 Jul 2025 01:20:56 +0200 Subject: [PATCH] ed --- .../[inventory]/nordi_schredder/client.lua | 169 +++++++------- .../[inventory]/nordi_schredder/server.lua | 213 +++++++++--------- 2 files changed, 186 insertions(+), 196 deletions(-) diff --git a/resources/[inventory]/nordi_schredder/client.lua b/resources/[inventory]/nordi_schredder/client.lua index 6f0fb0fb5..ee4025ce8 100644 --- a/resources/[inventory]/nordi_schredder/client.lua +++ b/resources/[inventory]/nordi_schredder/client.lua @@ -1,12 +1,12 @@ local QBCore = exports['qb-core']:GetCoreObject() --- List of prop models that should be targetable as immediate shredders +-- Liste der Prop-Modelle für sofortige Schredder local shredderPropModels = { 'p_secret_weapon_02', 'prop_bin_08a' } --- List of prop models that should be targetable as trash bins with delayed deletion +-- Liste der Prop-Modelle für zeitverzögerte Mülltonnen local trashBinPropModels = { 'prop_bin_01a', 'prop_bin_03a', @@ -18,13 +18,13 @@ local trashBinPropModels = { 'prop_dumpster_3a' } --- Variable to store the current entity being interacted with +-- Variable zum Speichern der aktuellen Entität local currentEntity = nil local currentType = nil --- Add QB-Target to all matching props in the world +-- QB-Target zu allen passenden Props in der Welt hinzufügen Citizen.CreateThread(function() - -- Add target to shredder props + -- Für sofortige Schredder exports['qb-target']:AddTargetModel(shredderPropModels, { options = { { @@ -59,7 +59,7 @@ Citizen.CreateThread(function() distance = 2.0 }) - -- Add target to trash bin props + -- Für zeitverzögerte Mülltonnen - nur eine Option zum Öffnen exports['qb-target']:AddTargetModel(trashBinPropModels, { options = { { @@ -75,29 +75,15 @@ Citizen.CreateThread(function() canInteract = function() return true end, - }, - { - type = "client", - event = "disposal:openMenu", - icon = "fas fa-clock", - label = "Müll entsorgen", - action = function(entity) - currentEntity = entity - currentType = "trash" - TriggerEvent('disposal:openMenu') - end, - canInteract = function() - return true - end, } }, distance = 2.0 }) - print("^2[DISPOSAL]^7 Added QB-Target to " .. #shredderPropModels .. " shredder models and " .. #trashBinPropModels .. " trash bin models") + print("^2[DISPOSAL]^7 QB-Target zu " .. #shredderPropModels .. " Schredder-Modellen und " .. #trashBinPropModels .. " Mülltonnen-Modellen hinzugefügt") end) --- Function to get container ID from entity +-- Funktion zum Abrufen der Container-ID aus der Entität function GetContainerIDFromEntity(entity, type) if not entity or not DoesEntityExist(entity) then return nil end @@ -106,7 +92,7 @@ function GetContainerIDFromEntity(entity, type) return type .. "_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) end --- Open container inventory +-- Container-Inventar öffnen RegisterNetEvent('disposal:openInventory', function() local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) @@ -120,46 +106,49 @@ RegisterNetEvent('disposal:openInventory', function() return end - -- Get container ID + -- Container-ID abrufen local containerID = GetContainerIDFromEntity(currentEntity, currentType) if not containerID then return end - -- Open inventory with this unique ID + -- Inventar mit dieser eindeutigen ID öffnen TriggerServerEvent('disposal:server:openInventory', containerID, currentType) end) --- Open disposal menu +-- Vernichtungsmenü öffnen (nur für Schredder) RegisterNetEvent('disposal:openMenu', function() local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) - if not currentEntity or not DoesEntityExist(currentEntity) then + if not currentEntity or not DoesEntityExist(currentEntity) or currentType ~= "shredder" then lib.notify({ - title = currentType == "shredder" and 'Müllschredder' or 'Mülltonne', - description = currentType == "shredder" and 'Kein Schredder gefunden!' or 'Keine Mülltonne gefunden!', + title = 'Müllschredder', + description = 'Kein Schredder gefunden!', type = 'error' }) return end - -- Get container ID + -- Container-ID abrufen local containerID = GetContainerIDFromEntity(currentEntity, currentType) if not containerID then return end - -- Get items in this container + -- Items in diesem Container abrufen TriggerServerEvent('disposal:server:getItems', containerID, currentType) end) --- Show menu with items +-- Menü mit Items anzeigen (nur für Schredder) RegisterNetEvent('disposal:client:showMenu', function(items, containerID, type, timeRemaining) - -- Make sure items is a table + -- Nur für Schredder fortfahren + if type ~= "shredder" then return end + + -- Sicherstellen, dass items eine Tabelle ist items = items or {} - -- Check if items is empty + -- Prüfen, ob items leer ist if next(items) == nil then lib.notify({ - title = type == "shredder" and 'Müllschredder' or 'Mülltonne', - description = type == "shredder" and 'Der Schredder ist leer!' or 'Die Mülltonne ist leer!', + title = 'Müllschredder', + description = 'Der Schredder ist leer!', type = 'error' }) return @@ -167,40 +156,23 @@ RegisterNetEvent('disposal:client:showMenu', function(items, containerID, type, local menuOptions = {} - -- All items action option - local actionText = type == "shredder" and "ALLE ITEMS VERNICHTEN" or "ALLE ITEMS ENTSORGEN" - local actionDesc = type == "shredder" - and 'Vernichtet alle Items im Schredder permanent!' - or 'Entsorgt alle Items in der Mülltonne (automatische Löschung nach Zeit)!' - + -- Alle Items vernichten Option table.insert(menuOptions, { - title = '🔥 ' .. actionText, - description = actionDesc, - icon = type == "shredder" and 'fire' or 'trash', + title = '🔥 ALLE ITEMS VERNICHTEN', + description = 'Vernichtet alle Items im Schredder permanent!', + icon = 'fire', onSelect = function() - confirmDestroyAll(containerID, type) + confirmDestroyAll(containerID) end }) - -- If it's a trash bin with scheduled deletion, show the time remaining - if type == "trash" and timeRemaining then - local minutes = math.floor(timeRemaining / 60) - local seconds = timeRemaining % 60 - - table.insert(menuOptions, { - title = '⏱️ Automatische Leerung', - description = string.format('In %d Minuten und %d Sekunden', minutes, seconds), - disabled = true - }) - end - table.insert(menuOptions, { title = '─────────────────', description = 'Einzelne Items:', disabled = true }) - -- Add individual items to menu + -- Einzelne Items zum Menü hinzufügen local hasItems = false for slot, item in pairs(items) do if item and item.amount and item.amount > 0 then @@ -210,7 +182,7 @@ RegisterNetEvent('disposal:client:showMenu', function(items, containerID, type, description = 'Anzahl: ' .. item.amount .. ' | Slot: ' .. slot, icon = 'trash', onSelect = function() - confirmDestroySingle(item.name, item.amount, slot, containerID, type) + confirmDestroySingle(item.name, item.amount, slot, containerID) end }) end @@ -218,8 +190,8 @@ RegisterNetEvent('disposal:client:showMenu', function(items, containerID, type, if not hasItems then lib.notify({ - title = type == "shredder" and 'Müllschredder' or 'Mülltonne', - description = type == "shredder" and 'Der Schredder ist leer!' or 'Die Mülltonne ist leer!', + title = 'Müllschredder', + description = 'Der Schredder ist leer!', type = 'error' }) return @@ -227,30 +199,25 @@ RegisterNetEvent('disposal:client:showMenu', function(items, containerID, type, lib.registerContext({ id = 'disposal_menu', - title = type == "shredder" and '🗑️ Müllschredder Verwaltung' or '🗑️ Mülltonne Verwaltung', + title = '🗑️ Müllschredder Verwaltung', options = menuOptions }) lib.showContext('disposal_menu') end) --- Confirm single item disposal -function confirmDestroySingle(itemName, amount, slot, containerID, type) - local actionText = type == "shredder" and "vernichten" or "entsorgen" - local actionDesc = type == "shredder" - and (itemName .. ' (' .. amount .. 'x) wird permanent gelöscht!') - or (itemName .. ' (' .. amount .. 'x) wird entsorgt und nach Zeit gelöscht!') - +-- Einzelnes Item vernichten bestätigen (nur für Schredder) +function confirmDestroySingle(itemName, amount, slot, containerID) lib.registerContext({ id = 'dispose_single_confirm', - title = '⚠️ Item ' .. actionText .. '?', + title = '⚠️ Item vernichten?', options = { { - title = type == "shredder" and '🔥 Ja, vernichten' or '🗑️ Ja, entsorgen', - description = actionDesc, - icon = 'check', + title = '🔥 Ja, vernichten', + description = itemName .. ' (' .. amount .. 'x) wird permanent gelöscht!', + icon = 'fire', onSelect = function() - TriggerServerEvent('disposal:server:disposeSingle', itemName, amount, slot, containerID, type) + TriggerServerEvent('disposal:server:disposeSingle', itemName, amount, slot, containerID, "shredder") end }, { @@ -258,7 +225,7 @@ function confirmDestroySingle(itemName, amount, slot, containerID, type) description = 'Zurück zum Hauptmenü', icon = 'times', onSelect = function() - TriggerServerEvent('disposal:server:getItems', containerID, type) + TriggerServerEvent('disposal:server:getItems', containerID, "shredder") end } } @@ -267,23 +234,18 @@ function confirmDestroySingle(itemName, amount, slot, containerID, type) lib.showContext('dispose_single_confirm') end --- Confirm all items disposal -function confirmDestroyAll(containerID, type) - local actionText = type == "shredder" and "VERNICHTEN" or "ENTSORGEN" - local actionDesc = type == "shredder" - and 'ALLE Items im Schredder werden permanent gelöscht!' - or 'ALLE Items in der Mülltonne werden nach Zeit automatisch gelöscht!' - +-- Alle Items vernichten bestätigen (nur für Schredder) +function confirmDestroyAll(containerID) lib.registerContext({ id = 'dispose_all_confirm', title = '⚠️ WARNUNG ⚠️', options = { { - title = type == "shredder" and '🔥 JA, ALLES VERNICHTEN' or '🗑️ JA, ALLES ENTSORGEN', - description = actionDesc, - icon = type == "shredder" and 'fire' or 'trash', + title = '🔥 JA, ALLES VERNICHTEN', + description = 'ALLE Items im Schredder werden permanent gelöscht!', + icon = 'fire', onSelect = function() - TriggerServerEvent('disposal:server:disposeAll', containerID, type) + TriggerServerEvent('disposal:server:disposeAll', containerID, "shredder") end }, { @@ -291,7 +253,7 @@ function confirmDestroyAll(containerID, type) description = 'Zurück zum Hauptmenü', icon = 'times', onSelect = function() - TriggerServerEvent('disposal:server:getItems', containerID, type) + TriggerServerEvent('disposal:server:getItems', containerID, "shredder") end } } @@ -300,7 +262,7 @@ function confirmDestroyAll(containerID, type) lib.showContext('dispose_all_confirm') end --- Success notification with effect +-- Erfolgs-Notification mit Effekt RegisterNetEvent('disposal:client:itemDisposed', function(message, type) lib.notify({ title = type == "shredder" and 'Müllschredder' or 'Mülltonne', @@ -309,7 +271,7 @@ RegisterNetEvent('disposal:client:itemDisposed', function(message, type) duration = 4000 }) - -- Particle effect + -- Partikel-Effekt local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) @@ -320,14 +282,35 @@ RegisterNetEvent('disposal:client:itemDisposed', function(message, type) UseParticleFxAssetNextCall("core") - -- Different effects for shredder vs trash + -- Unterschiedliche Effekte je nach Typ if type == "shredder" then - -- More intense effect for shredder + -- Intensiverer Effekt für Schredder StartParticleFxNonLoopedAtCoord("ent_sht_flame", coords.x, coords.y, coords.z + 1.0, 0.0, 0.0, 0.0, 1.0, false, false, false) PlaySoundFrontend(-1, "CHECKPOINT_PERFECT", "HUD_MINI_GAME_SOUNDSET", 1) else - -- Subtle effect for trash + -- Subtiler Effekt für Mülltonnen StartParticleFxNonLoopedAtCoord("ent_sht_dust", coords.x, coords.y, coords.z + 0.5, 0.0, 0.0, 0.0, 1.0, false, false, false) PlaySoundFrontend(-1, "PICK_UP", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end end) + +-- Informationen über zeitverzögerte Löschung anzeigen +RegisterNetEvent('disposal:client:showTrashInfo', function(deleteTime) + local days = math.floor(deleteTime / 86400) + local hours = math.floor((deleteTime % 86400) / 3600) + local minutes = math.floor((deleteTime % 3600) / 60) + + local timeString = "" + if days > 0 then + timeString = days .. " Tag" .. (days > 1 and "e" or "") .. ", " + end + timeString = timeString .. hours .. " Stunde" .. (hours > 1 and "n" or "") .. ", " + timeString = timeString .. minutes .. " Minute" .. (minutes > 1 and "n" or "") + + lib.notify({ + title = 'Mülltonne', + description = 'Items werden in ' .. timeString .. ' automatisch gelöscht!', + type = 'info', + duration = 6000 + }) +end) diff --git a/resources/[inventory]/nordi_schredder/server.lua b/resources/[inventory]/nordi_schredder/server.lua index 35c3a34a1..9b08219a3 100644 --- a/resources/[inventory]/nordi_schredder/server.lua +++ b/resources/[inventory]/nordi_schredder/server.lua @@ -1,22 +1,22 @@ local QBCore = exports['qb-core']:GetCoreObject() --- Table to store items scheduled for deletion +-- Tabelle zum Speichern von geplanten Löschungen local scheduledDeletions = {} --- Default time for trash bin deletion (30 minutes) -local DEFAULT_TRASH_DELETE_TIME = 1800 -- seconds +-- Standard-Zeit für Mülltonnen-Löschung (2 Tage = 48 Stunden = 172800 Sekunden) +local DEFAULT_TRASH_DELETE_TIME = 172800 -- seconds --- Function to schedule item deletion +-- Funktion zum Planen der Item-Löschung function ScheduleItemDeletion(containerID, deleteTime) - -- Use default time if not specified + -- Standard-Löschzeit verwenden, wenn nicht angegeben deleteTime = deleteTime or DEFAULT_TRASH_DELETE_TIME - -- Cancel existing timer if there is one + -- Bestehenden Timer abbrechen, falls vorhanden if scheduledDeletions[containerID] and scheduledDeletions[containerID].timer then clearTimeout(scheduledDeletions[containerID].timer) end - -- Schedule the deletion + -- Löschung planen scheduledDeletions[containerID] = { deleteAt = os.time() + deleteTime, timer = setTimeout(function() @@ -24,16 +24,18 @@ function ScheduleItemDeletion(containerID, deleteTime) end, deleteTime * 1000) } - print("^3[DISPOSAL]^7 Items in " .. containerID .. " scheduled for deletion in " .. deleteTime .. " seconds") + print("^3[DISPOSAL]^7 Items in " .. containerID .. " werden in " .. deleteTime .. " Sekunden gelöscht") + + return deleteTime end --- Function to delete items from a trash bin +-- Funktion zum Löschen von Items aus einer Mülltonne function DeleteTrashBinItems(containerID) - -- Get all items in the trash bin + -- Alle Items in der Mülltonne abrufen local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) if not items or next(items) == nil then - print("^3[DISPOSAL]^7 No items to delete in " .. containerID) + print("^3[DISPOSAL]^7 Keine Items zum Löschen in " .. containerID) scheduledDeletions[containerID] = nil return end @@ -41,7 +43,7 @@ function DeleteTrashBinItems(containerID) local totalItems = 0 local disposedItems = {} - -- Delete all items + -- Alle Items löschen for slot, item in pairs(items) do if item and item.amount and item.amount > 0 then exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", containerID, item.name, item.amount, slot) @@ -50,22 +52,22 @@ function DeleteTrashBinItems(containerID) end end - print("^3[DISPOSAL]^7 Automatically deleted " .. totalItems .. " items from " .. containerID) + print("^3[DISPOSAL]^7 Automatisch " .. totalItems .. " Items aus " .. containerID .. " gelöscht") - -- Log the automatic deletion + -- Log der automatischen Löschung local itemList = "" for _, item in pairs(disposedItems) do itemList = itemList .. '• ' .. item.amount .. 'x ' .. item.name .. '\n' end - TriggerEvent('qb-log:server:CreateLog', 'disposal', 'Automatic Trash Deletion', 'yellow', + TriggerEvent('qb-log:server:CreateLog', 'disposal', 'Automatische Müllentsorgung', 'yellow', '**Container:** ' .. containerID .. '\n**Anzahl Items:** ' .. totalItems .. '\n**Items:**\n' .. itemList) - -- Remove from scheduled deletions + -- Aus geplanten Löschungen entfernen scheduledDeletions[containerID] = nil end --- Get time remaining for a scheduled deletion +-- Verbleibende Zeit für eine geplante Löschung abrufen function GetTimeRemaining(containerID) if scheduledDeletions[containerID] then local currentTime = os.time() @@ -81,121 +83,131 @@ function GetTimeRemaining(containerID) return nil end --- Container inventory open +-- Container-Inventar öffnen RegisterNetEvent('disposal:server:openInventory', function(containerID, type) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player then return end - -- Open the inventory + -- Inventar öffnen exports["tgiann-inventory"]:OpenInventory(src, "stash", containerID, { maxweight = 50000, -- 50kg max slots = 20, -- 20 Slots label = type == "shredder" and 'Müllschredder' or 'Mülltonne' }) - -- If it's a trash bin, schedule deletion if not already scheduled - if type == "trash" and not scheduledDeletions[containerID] then - -- Check if there are items in the container - local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) - if items and next(items) then - ScheduleItemDeletion(containerID) - end + -- Wenn es eine Mülltonne ist, nach Items prüfen und Löschung planen + if type == "trash" then + -- Kurze Verzögerung, um sicherzustellen, dass das Inventar geladen ist + SetTimeout(500, function() + -- Prüfen, ob Items in der Mülltonne sind + local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) + if items and next(items) then + -- Nur planen, wenn noch nicht geplant + if not scheduledDeletions[containerID] then + local deleteTime = ScheduleItemDeletion(containerID) + + -- Spieler über die geplante Löschung informieren + local days = math.floor(deleteTime / 86400) + local hours = math.floor((deleteTime % 86400) / 3600) + local minutes = math.floor((deleteTime % 3600) / 60) + + local timeString = "" + if days > 0 then + timeString = days .. " Tag" .. (days > 1 and "e" or "") .. ", " + end + timeString = timeString .. hours .. " Stunde" .. (hours > 1 and "n" or "") .. ", " + timeString = timeString .. minutes .. " Minute" .. (minutes > 1 and "n" or "") + + TriggerClientEvent('disposal:client:showTrashInfo', src, deleteTime) + else + -- Wenn bereits geplant, verbleibende Zeit anzeigen + local remainingTime = GetTimeRemaining(containerID) + if remainingTime then + TriggerClientEvent('disposal:client:showTrashInfo', src, remainingTime) + end + end + end + end) end end) --- Get items from container +-- Items aus Container abrufen (nur für Schredder) RegisterNetEvent('disposal:server:getItems', function(containerID, type) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player then return end - -- Get items from the container + -- Nur für Schredder fortfahren + if type ~= "shredder" then return end + + -- Items aus dem Container abrufen local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) - -- If items is nil, provide an empty table + -- Wenn items nil ist, leere Tabelle bereitstellen if items == nil then items = {} end - -- Get time remaining for trash bins - local timeRemaining = nil - if type == "trash" then - timeRemaining = GetTimeRemaining(containerID) - end - - TriggerClientEvent('disposal:client:showMenu', src, items, containerID, type, timeRemaining) + TriggerClientEvent('disposal:client:showMenu', src, items, containerID, type) end) --- Dispose single item +-- Einzelnes Item entsorgen (nur für Schredder) RegisterNetEvent('disposal:server:disposeSingle', function(itemName, amount, slot, containerID, type) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player then return end - -- Remove the item from the container + -- Nur für Schredder fortfahren + if type ~= "shredder" then return end + + -- Item aus dem Container entfernen local success = exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", containerID, itemName, amount, slot) if success then - -- Log for admins - print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') has ' .. - (type == "shredder" and 'destroyed' or 'disposed') .. ' ' .. amount .. 'x ' .. itemName) + -- Log für Admins + print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ' .. amount .. 'x ' .. itemName .. ' vernichtet') -- Discord Webhook - TriggerEvent('qb-log:server:CreateLog', 'disposal', - type == "shredder" and 'Item Destroyed' or 'Item Disposed', - type == "shredder" and 'orange' or 'blue', - '**Player:** ' .. GetPlayerName(src) .. + TriggerEvent('qb-log:server:CreateLog', 'disposal', 'Item Vernichtet', 'orange', + '**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. '\n**Item:** ' .. amount .. 'x ' .. itemName .. - '\n**Action:** ' .. (type == "shredder" and 'Item destroyed' or 'Item disposed')) + '\n**Aktion:** Item vernichtet') - -- Different messages based on type - local message = "" - if type == "shredder" then - message = amount .. 'x ' .. itemName .. ' wurde vernichtet!' - else - message = amount .. 'x ' .. itemName .. ' wurde entsorgt!' - - -- Schedule deletion if this is the first item in the trash bin - local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) - if items and next(items) and not scheduledDeletions[containerID] then - ScheduleItemDeletion(containerID) - end - end + TriggerClientEvent('disposal:client:itemDisposed', src, amount .. 'x ' .. itemName .. ' wurde vernichtet!', type) - TriggerClientEvent('disposal:client:itemDisposed', src, message, type) - - -- Reload menu + -- Menü neu laden Wait(1000) TriggerEvent('disposal:server:getItems', containerID, type) else - TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Entsorgen des Items!', 'error') + TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Vernichten des Items!', 'error') end end) --- Dispose all items +-- Alle Items entsorgen (nur für Schredder) RegisterNetEvent('disposal:server:disposeAll', function(containerID, type) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player then return end - -- Get all items in the container + -- Nur für Schredder fortfahren + if type ~= "shredder" then return end + + -- Alle Items im Container abrufen local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) if not items or next(items) == nil then - TriggerClientEvent('QBCore:Notify', src, - type == "shredder" and 'Der Schredder ist bereits leer!' or 'Die Mülltonne ist bereits leer!', - 'error') + TriggerClientEvent('QBCore:Notify', src, 'Der Schredder ist bereits leer!', 'error') return end local disposedItems = {} local totalItems = 0 - -- Dispose all items + -- Alle Items entsorgen for slot, item in pairs(items) do if item and item.amount and item.amount > 0 then local success = exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", containerID, item.name, item.amount, slot) @@ -207,50 +219,45 @@ RegisterNetEvent('disposal:server:disposeAll', function(containerID, type) end if #disposedItems > 0 then - -- Log for admins - print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') has ' .. - (type == "shredder" and 'destroyed' or 'disposed') .. ' ALL items (' .. totalItems .. ' items)') + -- Log für Admins + print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ALLE Items vernichtet (' .. totalItems .. ' Items)') - -- Discord Webhook with item list + -- Discord Webhook mit Item-Liste local itemList = "" for _, item in pairs(disposedItems) do itemList = itemList .. '• ' .. item.amount .. 'x ' .. item.name .. '\n' end - TriggerEvent('qb-log:server:CreateLog', 'disposal', - type == "shredder" and 'All Items Destroyed' or 'All Items Disposed', - type == "shredder" and 'red' or 'green', - '**Player:** ' .. GetPlayerName(src) .. + TriggerEvent('qb-log:server:CreateLog', 'disposal', 'Alle Items Vernichtet', 'red', + '**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. - '\n**Action:** ' .. (type == "shredder" and 'All items destroyed' or 'All items disposed') .. - '\n**Total Items:** ' .. totalItems .. + '\n**Aktion:** Alle Items vernichtet' .. + '\n**Anzahl Items:** ' .. totalItems .. '\n**Items:**\n' .. itemList) - -- Different messages based on type - local message = "" - if type == "shredder" then - message = 'ALLE Items (' .. totalItems .. ' Stück) wurden vernichtet!' - else - message = 'ALLE Items (' .. totalItems .. ' Stück) wurden entsorgt!' - - -- For trash bins, schedule deletion if not already scheduled - if not scheduledDeletions[containerID] then - ScheduleItemDeletion(containerID) - end - end - - TriggerClientEvent('disposal:client:itemDisposed', src, message, type) + TriggerClientEvent('disposal:client:itemDisposed', src, 'ALLE Items (' .. totalItems .. ' Stück) wurden vernichtet!', type) else - TriggerClientEvent('QBCore:Notify', src, 'Keine Items zum Entsorgen gefunden!', 'error') + TriggerClientEvent('QBCore:Notify', src, 'Keine Items zum Vernichten gefunden!', 'error') end end) --- Save scheduled deletions when resource stops +-- Export-Funktion, die von tgiann-inventory aufgerufen werden kann, wenn Items hinzugefügt werden +exports('OnItemAddedToStash', function(stashId, itemName, amount, slot, metadata) + -- Prüfen, ob dies eine Mülltonne ist + if string.find(stashId, "trash_") then + -- Löschung planen, wenn noch nicht geplant + if not scheduledDeletions[stashId] then + ScheduleItemDeletion(stashId) + print("^3[DISPOSAL]^7 Timer für " .. stashId .. " gestartet, nachdem Item hinzugefügt wurde") + end + end + return true +end) + +-- Geplante Löschungen speichern, wenn die Ressource gestoppt wird AddEventHandler('onResourceStop', function(resourceName) if resourceName ~= GetCurrentResourceName() then return end - -- Here you could save scheduledDeletions to a database - -- Example with KVP: local savedData = {} for containerID, data in pairs(scheduledDeletions) do savedData[containerID] = { @@ -259,16 +266,15 @@ AddEventHandler('onResourceStop', function(resourceName) end SaveResourceFile(GetCurrentResourceName(), "scheduled_deletions.json", json.encode(savedData), -1) - print("^3[DISPOSAL]^7 Saved " .. #savedData .. " scheduled deletions") + print("^3[DISPOSAL]^7 " .. #savedData .. " geplante Löschungen gespeichert") end) --- Restore scheduled deletions when resource starts +-- Geplante Löschungen wiederherstellen, wenn die Ressource gestartet wird AddEventHandler('onResourceStart', function(resourceName) if resourceName ~= GetCurrentResourceName() then return end - -- Here you could load scheduled deletions from a database - -- Example with KVP: local savedData = json.decode(LoadResourceFile(GetCurrentResourceName(), "scheduled_deletions.json") or "{}") + local restoredCount = 0 for containerID, data in pairs(savedData) do local currentTime = os.time() @@ -276,11 +282,12 @@ AddEventHandler('onResourceStart', function(resourceName) if remainingTime > 0 then ScheduleItemDeletion(containerID, remainingTime) + restoredCount = restoredCount + 1 else - -- If the time has already passed, delete immediately + -- Wenn die Zeit bereits abgelaufen ist, sofort löschen DeleteTrashBinItems(containerID) end end - print("^3[DISPOSAL]^7 Restored " .. #savedData .. " scheduled deletions") + print("^3[DISPOSAL]^7 " .. restoredCount .. " geplante Löschungen wiederhergestellt") end)