1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-07-28 01:05:18 +02:00
parent 2834b543f4
commit 6c5c142a0d
3 changed files with 393 additions and 146 deletions

View file

@ -1,9 +1,13 @@
local QBCore = exports['qb-core']:GetCoreObject() local QBCore = exports['qb-core']:GetCoreObject()
-- List of prop models that should be targetable as shredders -- List of prop models that should be targetable as immediate shredders
local shredderPropModels = { local shredderPropModels = {
'p_secret_weapon_02', 'p_secret_weapon_02',
'prop_bin_08a', 'prop_bin_08a'
}
-- List of prop models that should be targetable as trash bins with delayed deletion
local trashBinPropModels = {
'prop_bin_01a', 'prop_bin_01a',
'prop_bin_03a', 'prop_bin_03a',
'prop_bin_04a', 'prop_bin_04a',
@ -15,23 +19,23 @@ local shredderPropModels = {
} }
-- Variable to store the current entity being interacted with -- Variable to store the current entity being interacted with
local currentShredderEntity = nil local currentEntity = nil
local currentType = nil
-- Add QB-Target to all matching props in the world -- Add QB-Target to all matching props in the world
Citizen.CreateThread(function() Citizen.CreateThread(function()
-- Add target to all existing props -- Add target to shredder props
for _, model in ipairs(shredderPropModels) do exports['qb-target']:AddTargetModel(shredderPropModels, {
-- Add QB-Target to this model
exports['qb-target']:AddTargetModel(model, {
options = { options = {
{ {
type = "client", type = "client",
event = "shredder:openInventory", event = "disposal:openInventory",
icon = "fas fa-dumpster", icon = "fas fa-dumpster",
label = "Müllschredder öffnen", label = "Müllschredder öffnen",
action = function(entity) action = function(entity)
currentShredderEntity = entity currentEntity = entity
TriggerEvent('shredder:openInventory') currentType = "shredder"
TriggerEvent('disposal:openInventory')
end, end,
canInteract = function() canInteract = function()
return true return true
@ -39,12 +43,13 @@ Citizen.CreateThread(function()
}, },
{ {
type = "client", type = "client",
event = "shredder:openMenu", event = "disposal:openMenu",
icon = "fas fa-fire", icon = "fas fa-fire",
label = "Items vernichten", label = "Items vernichten",
action = function(entity) action = function(entity)
currentShredderEntity = entity currentEntity = entity
TriggerEvent('shredder:openMenu') currentType = "shredder"
TriggerEvent('disposal:openMenu')
end, end,
canInteract = function() canInteract = function()
return true return true
@ -53,74 +58,108 @@ Citizen.CreateThread(function()
}, },
distance = 2.0 distance = 2.0
}) })
end
print("^2[SHREDDER]^7 Added QB-Target to " .. #shredderPropModels .. " shredder prop models") -- Add target to trash bin props
exports['qb-target']:AddTargetModel(trashBinPropModels, {
options = {
{
type = "client",
event = "disposal:openInventory",
icon = "fas fa-trash",
label = "Mülltonne öffnen",
action = function(entity)
currentEntity = entity
currentType = "trash"
TriggerEvent('disposal:openInventory')
end,
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")
end) end)
-- Function to get shredder ID from entity -- Function to get container ID from entity
function GetShredderIDFromEntity(entity) function GetContainerIDFromEntity(entity, type)
if not entity or not DoesEntityExist(entity) then return nil end if not entity or not DoesEntityExist(entity) then return nil end
local model = GetEntityModel(entity) local model = GetEntityModel(entity)
local entityCoords = GetEntityCoords(entity) local entityCoords = GetEntityCoords(entity)
return "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) return type .. "_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z)
end end
-- Schredder Inventar öffnen -- Open container inventory
RegisterNetEvent('shredder:openInventory', function() RegisterNetEvent('disposal:openInventory', function()
local playerPed = PlayerPedId() local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed) local coords = GetEntityCoords(playerPed)
if not currentShredderEntity or not DoesEntityExist(currentShredderEntity) then if not currentEntity or not DoesEntityExist(currentEntity) then
lib.notify({ lib.notify({
title = 'Müllschredder', title = currentType == "shredder" and 'Müllschredder' or 'Mülltonne',
description = 'Kein Schredder gefunden!', description = currentType == "shredder" and 'Kein Schredder gefunden!' or 'Keine Mülltonne gefunden!',
type = 'error' type = 'error'
}) })
return return
end end
-- Get shredder ID -- Get container ID
local shredderID = GetShredderIDFromEntity(currentShredderEntity) local containerID = GetContainerIDFromEntity(currentEntity, currentType)
if not shredderID then return end if not containerID then return end
-- Open inventory with this unique ID -- Open inventory with this unique ID
TriggerServerEvent('shredder:server:openInventory', shredderID) TriggerServerEvent('disposal:server:openInventory', containerID, currentType)
end) end)
-- Vernichtungsmenü öffnen -- Open disposal menu
RegisterNetEvent('shredder:openMenu', function() RegisterNetEvent('disposal:openMenu', function()
local playerPed = PlayerPedId() local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed) local coords = GetEntityCoords(playerPed)
if not currentShredderEntity or not DoesEntityExist(currentShredderEntity) then if not currentEntity or not DoesEntityExist(currentEntity) then
lib.notify({ lib.notify({
title = 'Müllschredder', title = currentType == "shredder" and 'Müllschredder' or 'Mülltonne',
description = 'Kein Schredder gefunden!', description = currentType == "shredder" and 'Kein Schredder gefunden!' or 'Keine Mülltonne gefunden!',
type = 'error' type = 'error'
}) })
return return
end end
-- Get shredder ID -- Get container ID
local shredderID = GetShredderIDFromEntity(currentShredderEntity) local containerID = GetContainerIDFromEntity(currentEntity, currentType)
if not shredderID then return end if not containerID then return end
-- Get items in this shredder -- Get items in this container
TriggerServerEvent('shredder:server:getItems', shredderID) TriggerServerEvent('disposal:server:getItems', containerID, currentType)
end) end)
-- Menü mit Items anzeigen -- Show menu with items
RegisterNetEvent('shredder:client:showMenu', function(items, shredderID) RegisterNetEvent('disposal:client:showMenu', function(items, containerID, type, timeRemaining)
-- Make sure items is a table -- Make sure items is a table
items = items or {} items = items or {}
-- Check if items is empty -- Check if items is empty
if next(items) == nil then if next(items) == nil then
lib.notify({ lib.notify({
title = 'Müllschredder', title = type == "shredder" and 'Müllschredder' or 'Mülltonne',
description = 'Der Schredder ist leer!', description = type == "shredder" and 'Der Schredder ist leer!' or 'Die Mülltonne ist leer!',
type = 'error' type = 'error'
}) })
return return
@ -128,23 +167,40 @@ RegisterNetEvent('shredder:client:showMenu', function(items, shredderID)
local menuOptions = {} local menuOptions = {}
-- Alle Items vernichten Option -- 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)!'
table.insert(menuOptions, { table.insert(menuOptions, {
title = '🔥 ALLE ITEMS VERNICHTEN', title = '🔥 ' .. actionText,
description = 'Vernichtet alle Items im Schredder permanent!', description = actionDesc,
icon = 'fire', icon = type == "shredder" and 'fire' or 'trash',
onSelect = function() onSelect = function()
confirmDestroyAll(shredderID) confirmDestroyAll(containerID, type)
end 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, { table.insert(menuOptions, {
title = '─────────────────', title = '─────────────────',
description = 'Einzelne Items:', description = 'Einzelne Items:',
disabled = true disabled = true
}) })
-- Einzelne Items zum Menü hinzufügen -- Add individual items to menu
local hasItems = false local hasItems = false
for slot, item in pairs(items) do for slot, item in pairs(items) do
if item and item.amount and item.amount > 0 then if item and item.amount and item.amount > 0 then
@ -154,7 +210,7 @@ RegisterNetEvent('shredder:client:showMenu', function(items, shredderID)
description = 'Anzahl: ' .. item.amount .. ' | Slot: ' .. slot, description = 'Anzahl: ' .. item.amount .. ' | Slot: ' .. slot,
icon = 'trash', icon = 'trash',
onSelect = function() onSelect = function()
confirmDestroySingle(item.name, item.amount, slot, shredderID) confirmDestroySingle(item.name, item.amount, slot, containerID, type)
end end
}) })
end end
@ -162,34 +218,39 @@ RegisterNetEvent('shredder:client:showMenu', function(items, shredderID)
if not hasItems then if not hasItems then
lib.notify({ lib.notify({
title = 'Müllschredder', title = type == "shredder" and 'Müllschredder' or 'Mülltonne',
description = 'Der Schredder ist leer!', description = type == "shredder" and 'Der Schredder ist leer!' or 'Die Mülltonne ist leer!',
type = 'error' type = 'error'
}) })
return return
end end
lib.registerContext({ lib.registerContext({
id = 'shredder_menu', id = 'disposal_menu',
title = '🗑️ Müllschredder Verwaltung', title = type == "shredder" and '🗑️ Müllschredder Verwaltung' or '🗑️ Mülltonne Verwaltung',
options = menuOptions options = menuOptions
}) })
lib.showContext('shredder_menu') lib.showContext('disposal_menu')
end) end)
-- Einzelnes Item vernichten bestätigen -- Confirm single item disposal
function confirmDestroySingle(itemName, amount, slot, shredderID) 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!')
lib.registerContext({ lib.registerContext({
id = 'shred_single_confirm', id = 'dispose_single_confirm',
title = '⚠️ Item vernichten?', title = '⚠️ Item ' .. actionText .. '?',
options = { options = {
{ {
title = '🔥 Ja, vernichten', title = type == "shredder" and '🔥 Ja, vernichten' or '🗑️ Ja, entsorgen',
description = itemName .. ' (' .. amount .. 'x) wird permanent gelöscht!', description = actionDesc,
icon = 'check', icon = 'check',
onSelect = function() onSelect = function()
TriggerServerEvent('shredder:server:destroySingle', itemName, amount, slot, shredderID) TriggerServerEvent('disposal:server:disposeSingle', itemName, amount, slot, containerID, type)
end end
}, },
{ {
@ -197,27 +258,32 @@ function confirmDestroySingle(itemName, amount, slot, shredderID)
description = 'Zurück zum Hauptmenü', description = 'Zurück zum Hauptmenü',
icon = 'times', icon = 'times',
onSelect = function() onSelect = function()
TriggerServerEvent('shredder:server:getItems', shredderID) TriggerServerEvent('disposal:server:getItems', containerID, type)
end end
} }
} }
}) })
lib.showContext('shred_single_confirm') lib.showContext('dispose_single_confirm')
end end
-- Alle Items vernichten bestätigen -- Confirm all items disposal
function confirmDestroyAll(shredderID) 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!'
lib.registerContext({ lib.registerContext({
id = 'shred_all_confirm', id = 'dispose_all_confirm',
title = '⚠️ WARNUNG ⚠️', title = '⚠️ WARNUNG ⚠️',
options = { options = {
{ {
title = '🔥 JA, ALLES VERNICHTEN', title = type == "shredder" and '🔥 JA, ALLES VERNICHTEN' or '🗑️ JA, ALLES ENTSORGEN',
description = 'ALLE Items im Schredder werden permanent gelöscht!', description = actionDesc,
icon = 'fire', icon = type == "shredder" and 'fire' or 'trash',
onSelect = function() onSelect = function()
TriggerServerEvent('shredder:server:destroyAll', shredderID) TriggerServerEvent('disposal:server:disposeAll', containerID, type)
end end
}, },
{ {
@ -225,25 +291,25 @@ function confirmDestroyAll(shredderID)
description = 'Zurück zum Hauptmenü', description = 'Zurück zum Hauptmenü',
icon = 'times', icon = 'times',
onSelect = function() onSelect = function()
TriggerServerEvent('shredder:server:getItems', shredderID) TriggerServerEvent('disposal:server:getItems', containerID, type)
end end
} }
} }
}) })
lib.showContext('shred_all_confirm') lib.showContext('dispose_all_confirm')
end end
-- Erfolgs-Notification mit Effekt -- Success notification with effect
RegisterNetEvent('shredder:client:itemDestroyed', function(message) RegisterNetEvent('disposal:client:itemDisposed', function(message, type)
lib.notify({ lib.notify({
title = 'Müllschredder', title = type == "shredder" and 'Müllschredder' or 'Mülltonne',
description = message, description = message,
type = 'success', type = 'success',
duration = 4000 duration = 4000
}) })
-- Partikel-Effekt -- Particle effect
local playerPed = PlayerPedId() local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed) local coords = GetEntityCoords(playerPed)
@ -253,8 +319,15 @@ RegisterNetEvent('shredder:client:itemDestroyed', function(message)
end end
UseParticleFxAssetNextCall("core") UseParticleFxAssetNextCall("core")
StartParticleFxNonLoopedAtCoord("ent_sht_steam", coords.x, coords.y, coords.z + 1.0, 0.0, 0.0, 0.0, 2.0, false, false, false)
-- Sound Effect -- Different effects for shredder vs trash
if type == "shredder" then
-- More intense effect for shredder
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) PlaySoundFrontend(-1, "CHECKPOINT_PERFECT", "HUD_MINI_GAME_SOUNDSET", 1)
else
-- Subtle effect for trash
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) end)

View file

@ -3,7 +3,7 @@ game 'gta5'
lua54 'yes' lua54 'yes'
author 'YourName' author 'YourName'
description 'Müllschredder mit separatem Inventar für tgiann-inventory' description 'Müllschredder und Mülltonne System mit separatem Inventar für tgiann-inventory'
version '1.0.0' version '1.0.0'
shared_scripts { shared_scripts {

View file

@ -1,112 +1,286 @@
local QBCore = exports['qb-core']:GetCoreObject() local QBCore = exports['qb-core']:GetCoreObject()
-- Schredder Inventar öffnen -- Table to store items scheduled for deletion
RegisterNetEvent('shredder:server:openInventory', function(shredderID) local scheduledDeletions = {}
-- Default time for trash bin deletion (30 minutes)
local DEFAULT_TRASH_DELETE_TIME = 1800 -- seconds
-- Function to schedule item deletion
function ScheduleItemDeletion(containerID, deleteTime)
-- Use default time if not specified
deleteTime = deleteTime or DEFAULT_TRASH_DELETE_TIME
-- Cancel existing timer if there is one
if scheduledDeletions[containerID] and scheduledDeletions[containerID].timer then
clearTimeout(scheduledDeletions[containerID].timer)
end
-- Schedule the deletion
scheduledDeletions[containerID] = {
deleteAt = os.time() + deleteTime,
timer = setTimeout(function()
DeleteTrashBinItems(containerID)
end, deleteTime * 1000)
}
print("^3[DISPOSAL]^7 Items in " .. containerID .. " scheduled for deletion in " .. deleteTime .. " seconds")
end
-- Function to delete items from a trash bin
function DeleteTrashBinItems(containerID)
-- Get all items in the trash bin
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)
scheduledDeletions[containerID] = nil
return
end
local totalItems = 0
local disposedItems = {}
-- Delete all items
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 Automatically deleted " .. totalItems .. " items from " .. containerID)
-- Log the automatic deletion
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',
'**Container:** ' .. containerID .. '\n**Anzahl Items:** ' .. totalItems .. '\n**Items:**\n' .. itemList)
-- Remove from scheduled deletions
scheduledDeletions[containerID] = nil
end
-- Get time remaining for a scheduled deletion
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 inventory open
RegisterNetEvent('disposal:server:openInventory', function(containerID, type)
local src = source local src = source
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end if not Player then return end
-- Use the correct export for opening inventory -- Open the inventory
-- According to docs: OpenInventory(src, invType, invId, invData, openType) exports["tgiann-inventory"]:OpenInventory(src, "stash", containerID, {
exports["tgiann-inventory"]:OpenInventory(src, "stash", shredderID, {
maxweight = 50000, -- 50kg max maxweight = 50000, -- 50kg max
slots = 20, -- 20 Slots slots = 20, -- 20 Slots
label = 'Müllschredder' 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
end
end) end)
-- Items aus Schredder abrufen -- Get items from container
RegisterNetEvent('shredder:server:getItems', function(shredderID) RegisterNetEvent('disposal:server:getItems', function(containerID, type)
local src = source local src = source
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end if not Player then return end
-- Use the correct export for getting secondary inventory items -- Get items from the container
-- According to docs: GetSecondaryInventoryItems(invType, invName) local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID)
local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", shredderID)
-- If items is nil, provide an empty table -- If items is nil, provide an empty table
if items == nil then items = {} end if items == nil then items = {} end
TriggerClientEvent('shredder:client:showMenu', src, items, shredderID) -- 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)
end) end)
-- Einzelnes Item vernichten -- Dispose single item
RegisterNetEvent('shredder:server:destroySingle', function(itemName, amount, slot, shredderID) RegisterNetEvent('disposal:server:disposeSingle', function(itemName, amount, slot, containerID, type)
local src = source local src = source
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end if not Player then return end
-- Use the correct export for removing item from secondary inventory -- Remove the item from the container
-- According to docs: RemoveItemFromSecondaryInventory(invType, invName, item, amount, slot, metadata) local success = exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", containerID, itemName, amount, slot)
local success = exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", shredderID, itemName, amount, slot)
if success then if success then
-- Log für Admins -- Log for admins
print('^3[SHREDDER]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ' .. amount .. 'x ' .. itemName .. ' vernichtet') print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') has ' ..
(type == "shredder" and 'destroyed' or 'disposed') .. ' ' .. amount .. 'x ' .. itemName)
-- Discord Webhook -- Discord Webhook
TriggerEvent('qb-log:server:CreateLog', 'shredder', 'Item Vernichtet', 'orange', TriggerEvent('qb-log:server:CreateLog', 'disposal',
'**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. '\n**Item:** ' .. amount .. 'x ' .. itemName .. '\n**Aktion:** Einzelnes Item vernichtet') type == "shredder" and 'Item Destroyed' or 'Item Disposed',
type == "shredder" and 'orange' or 'blue',
'**Player:** ' .. GetPlayerName(src) ..
'\n**Citizen ID:** ' .. Player.PlayerData.citizenid ..
'\n**Item:** ' .. amount .. 'x ' .. itemName ..
'\n**Action:** ' .. (type == "shredder" and 'Item destroyed' or 'Item disposed'))
TriggerClientEvent('shredder:client:itemDestroyed', src, amount .. 'x ' .. itemName .. ' wurde vernichtet!') -- Different messages based on type
local message = ""
-- Menü neu laden if type == "shredder" then
Wait(1000) message = amount .. 'x ' .. itemName .. ' wurde vernichtet!'
TriggerServerEvent('shredder:server:getItems', shredderID)
else else
TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Vernichten des Items!', 'error') 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, message, type)
-- Reload menu
Wait(1000)
TriggerEvent('disposal:server:getItems', containerID, type)
else
TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Entsorgen des Items!', 'error')
end end
end) end)
-- Alle Items vernichten -- Dispose all items
RegisterNetEvent('shredder:server:destroyAll', function(shredderID) RegisterNetEvent('disposal:server:disposeAll', function(containerID, type)
local src = source local src = source
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end if not Player then return end
-- Use the correct export for getting secondary inventory items -- Get all items in the container
local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", shredderID) local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID)
if not items or next(items) == nil then if not items or next(items) == nil then
TriggerClientEvent('QBCore:Notify', src, 'Der Schredder ist bereits leer!', 'error') TriggerClientEvent('QBCore:Notify', src,
type == "shredder" and 'Der Schredder ist bereits leer!' or 'Die Mülltonne ist bereits leer!',
'error')
return return
end end
local destroyedItems = {} local disposedItems = {}
local totalItems = 0 local totalItems = 0
-- Alle Items vernichten -- Dispose all items
for slot, item in pairs(items) do for slot, item in pairs(items) do
if item and item.amount and item.amount > 0 then if item and item.amount and item.amount > 0 then
-- Use the correct export for removing item from secondary inventory local success = exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", containerID, item.name, item.amount, slot)
local success = exports["tgiann-inventory"]:RemoveItemFromSecondaryInventory("stash", shredderID, item.name, item.amount, slot)
if success then if success then
table.insert(destroyedItems, {name = item.name, amount = item.amount}) table.insert(disposedItems, {name = item.name, amount = item.amount})
totalItems = totalItems + item.amount totalItems = totalItems + item.amount
end end
end end
end end
if #destroyedItems > 0 then if #disposedItems > 0 then
-- Log für Admins -- Log for admins
print('^3[SHREDDER]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ALLE Items vernichtet (' .. totalItems .. ' Items)') print('^3[DISPOSAL]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') has ' ..
(type == "shredder" and 'destroyed' or 'disposed') .. ' ALL items (' .. totalItems .. ' items)')
-- Discord Webhook mit Item Liste -- Discord Webhook with item list
local itemList = "" local itemList = ""
for _, item in pairs(destroyedItems) do for _, item in pairs(disposedItems) do
itemList = itemList .. '' .. item.amount .. 'x ' .. item.name .. '\n' itemList = itemList .. '' .. item.amount .. 'x ' .. item.name .. '\n'
end end
TriggerEvent('qb-log:server:CreateLog', 'shredder', 'Alle Items Vernichtet', 'red', TriggerEvent('qb-log:server:CreateLog', 'disposal',
'**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. '\n**Aktion:** Alle Items vernichtet\n**Anzahl Items:** ' .. totalItems .. '\n**Items:**\n' .. itemList) type == "shredder" and 'All Items Destroyed' or 'All Items Disposed',
type == "shredder" and 'red' or 'green',
'**Player:** ' .. 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**Items:**\n' .. itemList)
TriggerClientEvent('shredder:client:itemDestroyed', src, 'ALLE Items (' .. totalItems .. ' Stück) wurden vernichtet!') -- Different messages based on type
local message = ""
if type == "shredder" then
message = 'ALLE Items (' .. totalItems .. ' Stück) wurden vernichtet!'
else else
TriggerClientEvent('QBCore:Notify', src, 'Keine Items zum Vernichten gefunden!', 'error') 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)
else
TriggerClientEvent('QBCore:Notify', src, 'Keine Items zum Entsorgen gefunden!', 'error')
end end
end) end)
-- Save scheduled deletions when resource stops
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] = {
deleteAt = data.deleteAt
}
end
SaveResourceFile(GetCurrentResourceName(), "scheduled_deletions.json", json.encode(savedData), -1)
print("^3[DISPOSAL]^7 Saved " .. #savedData .. " scheduled deletions")
end)
-- Restore scheduled deletions when resource starts
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 "{}")
for containerID, data in pairs(savedData) do
local currentTime = os.time()
local remainingTime = data.deleteAt - currentTime
if remainingTime > 0 then
ScheduleItemDeletion(containerID, remainingTime)
else
-- If the time has already passed, delete immediately
DeleteTrashBinItems(containerID)
end
end
print("^3[DISPOSAL]^7 Restored " .. #savedData .. " scheduled deletions")
end)