local QBCore = exports['qb-core']:GetCoreObject() -- Tabelle zum Speichern von geplanten Löschungen local scheduledDeletions = {} -- Standard-Zeit für Mülltonnen-Löschung (2 Tage = 48 Stunden = 172800 Sekunden) local DEFAULT_TRASH_DELETE_TIME = 172800 -- seconds -- Funktion zum Planen der Item-Löschung function ScheduleItemDeletion(containerID, deleteTime) -- Standard-Löschzeit verwenden, wenn nicht angegeben deleteTime = deleteTime or DEFAULT_TRASH_DELETE_TIME -- Bestehenden Timer abbrechen, falls vorhanden if scheduledDeletions[containerID] and scheduledDeletions[containerID].timer then clearTimeout(scheduledDeletions[containerID].timer) end -- Löschung planen scheduledDeletions[containerID] = { deleteAt = os.time() + deleteTime, timer = setTimeout(function() DeleteTrashBinItems(containerID) end, deleteTime * 1000) } print("^3[DISPOSAL]^7 Items in " .. containerID .. " werden in " .. deleteTime .. " Sekunden gelöscht") return deleteTime end -- Funktion zum Löschen von Items aus einer Mülltonne function DeleteTrashBinItems(containerID) -- 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 Keine Items zum Löschen in " .. containerID) scheduledDeletions[containerID] = nil return end local totalItems = 0 local disposedItems = {} -- 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) totalItems = totalItems + item.amount table.insert(disposedItems, {name = item.name, amount = item.amount}) end end print("^3[DISPOSAL]^7 Automatisch " .. totalItems .. " Items aus " .. containerID .. " gelöscht") -- 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', 'Automatische Müllentsorgung', 'yellow', '**Container:** ' .. containerID .. '\n**Anzahl Items:** ' .. totalItems .. '\n**Items:**\n' .. itemList) -- Aus geplanten Löschungen entfernen scheduledDeletions[containerID] = nil end -- Verbleibende Zeit für eine geplante Löschung abrufen function GetTimeRemaining(containerID) if scheduledDeletions[containerID] then local currentTime = os.time() local deleteAt = scheduledDeletions[containerID].deleteAt local remaining = deleteAt - currentTime if remaining < 0 then return 0 else return remaining end end return nil end -- 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 -- 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' }) -- 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) -- 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 -- Nur für Schredder fortfahren if type ~= "shredder" then return end -- Items aus dem Container abrufen local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID) -- Wenn items nil ist, leere Tabelle bereitstellen if items == nil then items = {} end TriggerClientEvent('disposal:client:showMenu', src, items, containerID, type) end) -- 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 -- 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 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', 'Item Vernichtet', 'orange', '**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. '\n**Item:** ' .. amount .. 'x ' .. itemName .. '\n**Aktion:** Item vernichtet') TriggerClientEvent('disposal:client:itemDisposed', src, amount .. 'x ' .. itemName .. ' wurde vernichtet!', type) -- Menü neu laden Wait(1000) TriggerEvent('disposal:server:getItems', containerID, type) else TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Vernichten des Items!', 'error') end end) -- 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 -- 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, 'Der Schredder ist bereits leer!', 'error') return end local disposedItems = {} local totalItems = 0 -- 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) if success then table.insert(disposedItems, {name = item.name, amount = item.amount}) totalItems = totalItems + item.amount end end end if #disposedItems > 0 then -- Log für Admins print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ALLE Items vernichtet (' .. totalItems .. ' Items)') -- 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', 'Alle Items Vernichtet', 'red', '**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. '\n**Aktion:** Alle Items vernichtet' .. '\n**Anzahl Items:** ' .. totalItems .. '\n**Items:**\n' .. itemList) TriggerClientEvent('disposal:client:itemDisposed', src, 'ALLE Items (' .. totalItems .. ' Stück) wurden vernichtet!', type) else TriggerClientEvent('QBCore:Notify', src, 'Keine Items zum Vernichten gefunden!', 'error') end end) -- 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 local savedData = {} for containerID, data in pairs(scheduledDeletions) do savedData[containerID] = { deleteAt = data.deleteAt } end SaveResourceFile(GetCurrentResourceName(), "scheduled_deletions.json", json.encode(savedData), -1) print("^3[DISPOSAL]^7 " .. #savedData .. " geplante Löschungen gespeichert") end) -- Geplante Löschungen wiederherstellen, wenn die Ressource gestartet wird AddEventHandler('onResourceStart', function(resourceName) if resourceName ~= GetCurrentResourceName() then return end local savedData = json.decode(LoadResourceFile(GetCurrentResourceName(), "scheduled_deletions.json") or "{}") local restoredCount = 0 for containerID, data in pairs(savedData) do local currentTime = os.time() local remainingTime = data.deleteAt - currentTime if remainingTime > 0 then ScheduleItemDeletion(containerID, remainingTime) restoredCount = restoredCount + 1 else -- Wenn die Zeit bereits abgelaufen ist, sofort löschen DeleteTrashBinItems(containerID) end end print("^3[DISPOSAL]^7 " .. restoredCount .. " geplante Löschungen wiederhergestellt") end)