229 lines
		
	
	
	
		
			8.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
	
		
			8.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local QBCore = exports['qb-core']:GetCoreObject()
 | |
| 
 | |
| -- Table to track all trash cans in the world
 | |
| local trashCans = {}
 | |
| 
 | |
| -- Initialize the script
 | |
| Citizen.CreateThread(function()
 | |
|     print("^2[TRASH-SYSTEM]^7 Initializing trash can emptying system...")
 | |
|     -- Load existing trash cans from database if needed
 | |
|     InitializeTrashCans()
 | |
|     
 | |
|     -- Start the emptying cycle
 | |
|     StartEmptyingCycle()
 | |
| end)
 | |
| 
 | |
| -- Initialize trash cans
 | |
| function InitializeTrashCans()
 | |
|     -- You could load from database here if you want persistence between server restarts
 | |
|     -- For now, we'll just initialize an empty table
 | |
|     trashCans = {}
 | |
|     print("^2[TRASH-SYSTEM]^7 Trash cans initialized")
 | |
| end
 | |
| 
 | |
| -- Register a new trash can when it's first used
 | |
| RegisterNetEvent('trash:server:registerTrashCan', function(containerID)
 | |
|     if not trashCans[containerID] then
 | |
|         trashCans[containerID] = {
 | |
|             lastEmptied = os.time(),
 | |
|             nextEmptyTime = os.time() + (Config.EmptyInterval * 60)
 | |
|         }
 | |
|         print("^2[TRASH-SYSTEM]^7 New trash can registered: " .. containerID)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| -- Container inventory open
 | |
| RegisterNetEvent('trash:server:openInventory', function(containerID)
 | |
|     local src = source
 | |
|     local Player = QBCore.Functions.GetPlayer(src)
 | |
|     
 | |
|     if not Player then return end
 | |
|     
 | |
|     -- Register this trash can if it's new
 | |
|     TriggerEvent('trash:server:registerTrashCan', containerID)
 | |
|     
 | |
|     -- Open the inventory
 | |
|     exports["tgiann-inventory"]:OpenInventory(src, "stash", containerID, {
 | |
|         maxweight = Config.TrashCanInventory.maxweight,
 | |
|         slots = Config.TrashCanInventory.slots,
 | |
|         label = Config.TrashCanInventory.label
 | |
|     })
 | |
| end)
 | |
| 
 | |
| -- Start the emptying cycle
 | |
| function StartEmptyingCycle()
 | |
|     Citizen.CreateThread(function()
 | |
|         while true do
 | |
|             -- Check based on configured frequency
 | |
|             Citizen.Wait(Config.CheckFrequency * 60 * 1000)
 | |
|             EmptyTrashCans()
 | |
|         end
 | |
|     end)
 | |
|     print("^2[TRASH-SYSTEM]^7 Trash emptying cycle started - will check every " .. Config.CheckFrequency .. " minutes")
 | |
| end
 | |
| 
 | |
| -- Empty trash cans that are due
 | |
| function EmptyTrashCans()
 | |
|     local currentTime = os.time()
 | |
|     local emptiedCount = 0
 | |
|     
 | |
|     for containerID, data in pairs(trashCans) do
 | |
|         if currentTime >= data.nextEmptyTime then
 | |
|             -- Empty this trash can
 | |
|             EmptyTrashCan(containerID)
 | |
|             
 | |
|             -- Update the timing
 | |
|             trashCans[containerID] = {
 | |
|                 lastEmptied = currentTime,
 | |
|                 nextEmptyTime = currentTime + (Config.EmptyInterval * 60)
 | |
|             }
 | |
|             
 | |
|             -- Spawn random items if enabled
 | |
|             if Config.RandomItems.enabled then
 | |
|                 SpawnRandomItems(containerID)
 | |
|             end
 | |
|             
 | |
|             emptiedCount = emptiedCount + 1
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     if emptiedCount > 0 then
 | |
|         print("^2[TRASH-SYSTEM]^7 Emptied " .. emptiedCount .. " trash cans")
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Empty a specific trash can
 | |
| function EmptyTrashCan(containerID)
 | |
|     -- Get all items in the container
 | |
|     local items = exports["tgiann-inventory"]:GetSecondaryInventoryItems("stash", containerID)
 | |
|     
 | |
|     if not items or next(items) == nil then
 | |
|         return -- No items to remove
 | |
|     end
 | |
|     
 | |
|     local disposedItems = {}
 | |
|     local totalItems = 0
 | |
|     
 | |
|     -- Dispose all items
 | |
|     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 the emptying
 | |
|         print("^3[TRASH-SYSTEM]^7 Automatically emptied trash can " .. containerID .. " (" .. totalItems .. " items)")
 | |
|         
 | |
|         -- Discord Webhook with item list if enabled
 | |
|         if Config.Logs.enabled then
 | |
|             local itemList = ""
 | |
|             for _, item in pairs(disposedItems) do
 | |
|                 itemList = itemList .. '• ' .. item.amount .. 'x ' .. item.name .. '\n'
 | |
|             end
 | |
|             
 | |
|             TriggerEvent('qb-log:server:CreateLog', Config.Logs.webhookName, 
 | |
|                 Config.Logs.emptyTitle, 
 | |
|                 Config.Logs.emptyColor, 
 | |
|                 '**Trash Can:** ' .. containerID .. 
 | |
|                 '\n**Action:** Automatic emptying' .. 
 | |
|                 '\n**Total Items:** ' .. totalItems .. 
 | |
|                 '\n**Items:**\n' .. itemList)
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Spawn random items in a trash can with simplified probability system
 | |
| function SpawnRandomItems(containerID)
 | |
|     -- Check if we should spawn items based on chance
 | |
|     if math.random(1, 100) > Config.RandomItems.chanceToSpawn then
 | |
|         return
 | |
|     end
 | |
|     
 | |
|     -- Determine how many items to spawn
 | |
|     local itemCount = math.random(Config.RandomItems.minItems, Config.RandomItems.maxItems)
 | |
|     local spawnedItems = {}
 | |
|     
 | |
|     -- Try to spawn each item based on its individual chance
 | |
|     for i = 1, itemCount do
 | |
|         -- Randomly select an item to try spawning
 | |
|         local itemToTry = Config.RandomItems.items[math.random(1, #Config.RandomItems.items)]
 | |
|         
 | |
|         -- Check if this item should spawn based on its chance
 | |
|         if math.random(1, 100) <= itemToTry.chance then
 | |
|             -- Determine amount
 | |
|             local amount = math.random(itemToTry.amount[1], itemToTry.amount[2])
 | |
|             
 | |
|             -- Add to inventory
 | |
|             exports["tgiann-inventory"]:AddItemToSecondaryInventory("stash", containerID, itemToTry.name, amount)
 | |
|             
 | |
|             -- Track for logging
 | |
|             table.insert(spawnedItems, {name = itemToTry.name, amount = amount})
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     -- Log the spawned items
 | |
|     if #spawnedItems > 0 and Config.Logs.enabled then
 | |
|         local itemList = ""
 | |
|         for _, item in pairs(spawnedItems) do
 | |
|             itemList = itemList .. '• ' .. item.amount .. 'x ' .. item.name .. '\n'
 | |
|         end
 | |
|         
 | |
|         TriggerEvent('qb-log:server:CreateLog', Config.Logs.webhookName, 
 | |
|             Config.Logs.spawnTitle, 
 | |
|             Config.Logs.spawnColor, 
 | |
|             '**Trash Can:** ' .. containerID .. 
 | |
|             '\n**Action:** Random items spawned' .. 
 | |
|             '\n**Total Items:** ' .. #spawnedItems .. 
 | |
|             '\n**Items:**\n' .. itemList)
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Command to manually trigger trash emptying (admin only)
 | |
| QBCore.Commands.Add('emptytrash', 'Empty all trash cans (Admin Only)', {}, false, function(source, args)
 | |
|     local Player = QBCore.Functions.GetPlayer(source)
 | |
|     if Player.PlayerData.permission == "admin" or Player.PlayerData.permission == "god" then
 | |
|         EmptyTrashCans()
 | |
|         TriggerClientEvent('ox_lib:notify', source, Config.Notifications.manualEmptySuccess)
 | |
|     else
 | |
|         TriggerClientEvent('ox_lib:notify', source, Config.Notifications.noPermission)
 | |
|     end
 | |
| end, 'admin')
 | |
| 
 | |
| -- Command to manually spawn items in a trash can (admin only)
 | |
| QBCore.Commands.Add('filltrash', 'Fill trash can with random items (Admin Only)', {}, false, function(source, args)
 | |
|     local Player = QBCore.Functions.GetPlayer(source)
 | |
|     if Player.PlayerData.permission == "admin" or Player.PlayerData.permission == "god" then
 | |
|         -- Get the trash can the player is looking at
 | |
|         TriggerClientEvent('trash:client:getTargetTrashCan', source)
 | |
|     else
 | |
|         TriggerClientEvent('ox_lib:notify', source, Config.Notifications.noPermission)
 | |
|     end
 | |
| end, 'admin')
 | |
| 
 | |
| -- Receive the target trash can from client
 | |
| RegisterNetEvent('trash:server:fillTargetTrashCan', function(containerID)
 | |
|     local src = source
 | |
|     local Player = QBCore.Functions.GetPlayer(src)
 | |
|     
 | |
|     if not Player or not containerID then return end
 | |
|     
 | |
|     if Player.PlayerData.permission == "admin" or Player.PlayerData.permission == "god" then
 | |
|         -- Register this trash can if it's new
 | |
|         if not trashCans[containerID] then
 | |
|             TriggerEvent('trash:server:registerTrashCan', containerID)
 | |
|         end
 | |
|         
 | |
|         -- Spawn items in it
 | |
|         SpawnRandomItems(containerID)
 | |
|         TriggerClientEvent('ox_lib:notify', src, {
 | |
|             title = 'System',
 | |
|             description = 'Mülltonne wurde mit zufälligen Items gefüllt',
 | |
|             type = 'success'
 | |
|         })
 | |
|     end
 | |
| end)
 | 
