diff --git a/resources/[inventory]/nordi_schredder/client.lua b/resources/[inventory]/nordi_schredder/client.lua new file mode 100644 index 000000000..c4af2bd2d --- /dev/null +++ b/resources/[inventory]/nordi_schredder/client.lua @@ -0,0 +1,261 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +-- Müllschredder Locations mit Props +local shredderLocations = { + { + coords = vector3(287.5, -1334.5, 29.3), + heading = 0.0, + prop = 'prop_dumpster_4' -- Ändere hier das Prop + }, + { + coords = vector3(148.54, 269.21, 109.97), + heading = 90.0, + prop = 'prop_bin_08a' -- Anderes Prop Beispiel + } +} + +local createdProps = {} + +-- Erstelle Müllschredder Props und Targets +Citizen.CreateThread(function() + for i, location in ipairs(shredderLocations) do + -- Prop Model laden + local model = GetHashKey(location.prop) + RequestModel(model) + while not HasModelLoaded(model) do + Wait(1) + end + + -- Prop erstellen + local shredder = CreateObject(model, location.coords.x, location.coords.y, location.coords.z, false, false, false) + SetEntityHeading(shredder, location.heading) + FreezeEntityPosition(shredder, true) + SetEntityInvincible(shredder, true) + + table.insert(createdProps, shredder) + + -- QB-Target hinzufügen + exports['qb-target']:AddTargetEntity(shredder, { + options = { + { + type = "client", + event = "shredder:openInventory", + icon = "fas fa-dumpster", + label = "Müllschredder öffnen", + canInteract = function() + return true + end, + }, + { + type = "client", + event = "shredder:openMenu", + icon = "fas fa-fire", + label = "Items vernichten", + canInteract = function() + return true + end, + } + }, + distance = 2.0 + }) + end +end) + +-- Schredder Inventar öffnen +RegisterNetEvent('shredder:openInventory', function() + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + -- Prüfen ob Spieler nah genug an einem Schredder ist + local nearShredder = false + for i, location in ipairs(shredderLocations) do + local distance = #(coords - location.coords) + if distance <= 3.0 then + nearShredder = true + break + end + end + + if not nearShredder then + lib.notify({ + title = 'Müllschredder', + description = 'Du bist zu weit vom Schredder entfernt!', + type = 'error' + }) + return + end + + -- Schredder Inventar öffnen + TriggerServerEvent('shredder:server:openInventory') +end) + +-- Vernichtungsmenü öffnen +RegisterNetEvent('shredder:openMenu', function() + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + -- Prüfen ob Spieler nah genug an einem Schredder ist + local nearShredder = false + for i, location in ipairs(shredderLocations) do + local distance = #(coords - location.coords) + if distance <= 3.0 then + nearShredder = true + break + end + end + + if not nearShredder then + lib.notify({ + title = 'Müllschredder', + description = 'Du bist zu weit vom Schredder entfernt!', + type = 'error' + }) + return + end + + TriggerServerEvent('shredder:server:getItems') +end) + +-- Menü mit Items anzeigen +RegisterNetEvent('shredder:client:showMenu', function(items) + if not items or #items == 0 then + lib.notify({ + title = 'Müllschredder', + description = 'Der Schredder ist leer!', + type = 'error' + }) + return + end + + local menuOptions = {} + + -- Alle Items vernichten Option + table.insert(menuOptions, { + title = '🔥 ALLE ITEMS VERNICHTEN', + description = 'Vernichtet alle Items im Schredder permanent!', + icon = 'fire', + onSelect = function() + confirmDestroyAll() + end + }) + + table.insert(menuOptions, { + title = '─────────────────', + description = 'Einzelne Items:', + disabled = true + }) + + -- Einzelne Items zum Menü hinzufügen + for slot, item in pairs(items) do + if item and item.amount and item.amount > 0 then + table.insert(menuOptions, { + title = (item.label or item.name), + description = 'Anzahl: ' .. item.amount .. ' | Slot: ' .. slot, + icon = 'trash', + onSelect = function() + confirmDestroySingle(item.name, item.amount, slot) + end + }) + end + end + + lib.registerContext({ + id = 'shredder_menu', + title = '🗑️ Müllschredder Verwaltung', + options = menuOptions + }) + + lib.showContext('shredder_menu') +end) + +-- Einzelnes Item vernichten bestätigen +function confirmDestroySingle(itemName, amount, slot) + lib.registerContext({ + id = 'shred_single_confirm', + title = '⚠️ Item vernichten?', + options = { + { + title = '🔥 Ja, vernichten', + description = itemName .. ' (' .. amount .. 'x) wird permanent gelöscht!', + icon = 'check', + onSelect = function() + TriggerServerEvent('shredder:server:destroySingle', itemName, amount, slot) + end + }, + { + title = '❌ Abbrechen', + description = 'Zurück zum Hauptmenü', + icon = 'times', + onSelect = function() + TriggerServerEvent('shredder:server:getItems') + end + } + } + }) + + lib.showContext('shred_single_confirm') +end + +-- Alle Items vernichten bestätigen +function confirmDestroyAll() + lib.registerContext({ + id = 'shred_all_confirm', + title = '⚠️ WARNUNG ⚠️', + options = { + { + title = '🔥 JA, ALLES VERNICHTEN', + description = 'ALLE Items im Schredder werden permanent gelöscht!', + icon = 'fire', + onSelect = function() + TriggerServerEvent('shredder:server:destroyAll') + end + }, + { + title = '❌ Abbrechen', + description = 'Zurück zum Hauptmenü', + icon = 'times', + onSelect = function() + TriggerServerEvent('shredder:server:getItems') + end + } + } + }) + + lib.showContext('shred_all_confirm') +end + +-- Erfolgs-Notification mit Effekt +RegisterNetEvent('shredder:client:itemDestroyed', function(message) + lib.notify({ + title = 'Müllschredder', + description = message, + type = 'success', + duration = 4000 + }) + + -- Partikel-Effekt + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + RequestNamedPtfxAsset("core") + while not HasNamedPtfxAssetLoaded("core") do + Wait(1) + end + + 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 + PlaySoundFrontend(-1, "CHECKPOINT_PERFECT", "HUD_MINI_GAME_SOUNDSET", 1) +end) + +-- Cleanup beim Resource Stop +AddEventHandler('onResourceStop', function(resourceName) + if GetCurrentResourceName() == resourceName then + for _, prop in pairs(createdProps) do + if DoesEntityExist(prop) then + DeleteEntity(prop) + end + end + end +end) diff --git a/resources/[inventory]/nordi_schredder/fxmanifest.lua b/resources/[inventory]/nordi_schredder/fxmanifest.lua new file mode 100644 index 000000000..24ce28025 --- /dev/null +++ b/resources/[inventory]/nordi_schredder/fxmanifest.lua @@ -0,0 +1,25 @@ +fx_version 'cerulean' +game 'gta5' + +author 'YourName' +description 'Müllschredder mit separatem Inventar für tgiann-inventory' +version '1.0.0' + +shared_scripts { + '@ox_lib/init.lua' +} + +client_scripts { + 'client.lua' +} + +server_scripts { + 'server.lua' +} + +dependencies { + 'qb-core', + 'qb-target', + 'ox_lib', + 'tgiann-inventory' +} diff --git a/resources/[inventory]/nordi_schredder/server.lua b/resources/[inventory]/nordi_schredder/server.lua new file mode 100644 index 000000000..051fc2c0d --- /dev/null +++ b/resources/[inventory]/nordi_schredder/server.lua @@ -0,0 +1,108 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +-- Schredder Inventar öffnen +RegisterNetEvent('shredder:server:openInventory', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + -- Schredder Inventar öffnen (tgiann-inventory) + exports['tgiann-inventory']:OpenInventory(src, 'stash', 'shredder_' .. src, { + maxweight = 50000, -- 50kg max + slots = 20, -- 20 Slots + label = 'Müllschredder' + }) +end) + +-- Items aus Schredder abrufen +RegisterNetEvent('shredder:server:getItems', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + -- Schredder Inventar Items abrufen + local stashId = 'shredder_' .. src + local items = exports['tgiann-inventory']:GetInventory(stashId) + + TriggerClientEvent('shredder:client:showMenu', src, items or {}) +end) + +-- Einzelnes Item vernichten +RegisterNetEvent('shredder:server:destroySingle', function(itemName, amount, slot) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + local stashId = 'shredder_' .. src + + -- Item aus Schredder entfernen + local success = exports['tgiann-inventory']:RemoveItemFromInventory(stashId, itemName, amount, slot) + + if success then + -- Log für Admins + print('^3[SHREDDER]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ' .. amount .. 'x ' .. itemName .. ' vernichtet') + + -- Discord Webhook + TriggerEvent('qb-log:server:CreateLog', 'shredder', 'Item Vernichtet', 'orange', + '**Spieler:** ' .. GetPlayerName(src) .. '\n**Citizen ID:** ' .. Player.PlayerData.citizenid .. '\n**Item:** ' .. amount .. 'x ' .. itemName .. '\n**Aktion:** Einzelnes Item vernichtet') + + TriggerClientEvent('shredder:client:itemDestroyed', src, amount .. 'x ' .. itemName .. ' wurde vernichtet!') + + -- Menü neu laden + Wait(1000) + TriggerEvent('shredder:server:getItems', src) + else + TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Vernichten des Items!', 'error') + end +end) + +-- Alle Items vernichten +RegisterNetEvent('shredder:server:destroyAll', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + local stashId = 'shredder_' .. src + local items = exports['tgiann-inventory']:GetInventory(stashId) + + if not items or next(items) == nil then + TriggerClientEvent('QBCore:Notify', src, 'Der Schredder ist bereits leer!', 'error') + return + end + + local destroyedItems = {} + local totalItems = 0 + + -- Alle Items vernichten + for slot, item in pairs(items) do + if item and item.amount and item.amount > 0 then + local success = exports['tgiann-inventory']:RemoveItemFromInventory(stashId, item.name, item.amount, slot) + if success then + table.insert(destroyedItems, {name = item.name, amount = item.amount}) + totalItems = totalItems + item.amount + end + end + end + + if #destroyedItems > 0 then + -- Log für Admins + print('^3[SHREDDER]^7 ' .. GetPlayerName(src) .. ' (' .. Player.PlayerData.citizenid .. ') hat ALLE Items vernichtet (' .. totalItems .. ' Items)') + + -- Discord Webhook mit Item Liste + local itemList = "" + for _, item in pairs(destroyedItems) do + itemList = itemList .. '• ' .. item.amount .. 'x ' .. item.name .. '\n' + end + + TriggerEvent('qb-log:server:CreateLog', 'shredder', '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('shredder:client:itemDestroyed', src, 'ALLE Items (' .. totalItems .. ' Stück) wurden vernichtet!') + else + TriggerClientEvent('QBCore:Notify', src, 'Keine Items zum Vernichten gefunden!', 'error') + end +end)