diff --git a/resources/[inventory]/inventory_images/images/marble_pop_limo.png b/resources/[inventory]/inventory_images/images/marble_pop_limo.png index 0ea46d0cf..eb0fd2e54 100644 Binary files a/resources/[inventory]/inventory_images/images/marble_pop_limo.png and b/resources/[inventory]/inventory_images/images/marble_pop_limo.png differ diff --git a/resources/[inventory]/nordi_schredder/client.lua b/resources/[inventory]/nordi_schredder/client.lua index c4af2bd2d..bcd42b9ce 100644 --- a/resources/[inventory]/nordi_schredder/client.lua +++ b/resources/[inventory]/nordi_schredder/client.lua @@ -1,41 +1,27 @@ 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 - } +-- List of prop models that should be targetable as shredders +local shredderPropModels = { + 'p_secret_weapon_02', + 'prop_bin_08a', + 'prop_bin_01a', + 'prop_bin_03a', + 'prop_bin_04a', + 'prop_bin_07a', + 'prop_dumpster_01a', + 'prop_dumpster_02a', + 'prop_dumpster_02b', + 'prop_dumpster_3a' } -local createdProps = {} - --- Erstelle Müllschredder Props und Targets +-- Add QB-Target to all matching props in the world 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 + -- Add target to all existing props + for _, model in ipairs(shredderPropModels) do + local modelHash = GetHashKey(model) - -- 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, { + -- Add QB-Target to this model + exports['qb-target']:AddTargetModel(model, { options = { { type = "client", @@ -59,6 +45,8 @@ Citizen.CreateThread(function() distance = 2.0 }) end + + print("^2[SHREDDER]^7 Added QB-Target to " .. #shredderPropModels .. " shredder prop models") end) -- Schredder Inventar öffnen @@ -66,27 +54,25 @@ 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 + -- Get the entity player is targeting + local entity = exports['qb-target']:GetCurrentEntity() - if not nearShredder then + if not entity or not DoesEntityExist(entity) then lib.notify({ title = 'Müllschredder', - description = 'Du bist zu weit vom Schredder entfernt!', + description = 'Kein Schredder gefunden!', type = 'error' }) return end - -- Schredder Inventar öffnen - TriggerServerEvent('shredder:server:openInventory') + -- Get entity model and position for unique ID + local model = GetEntityModel(entity) + local entityCoords = GetEntityCoords(entity) + local shredderID = "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) + + -- Open inventory with this unique ID + TriggerServerEvent('shredder:server:openInventory', shredderID) end) -- Vernichtungsmenü öffnen @@ -94,26 +80,25 @@ 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 + -- Get the entity player is targeting + local entity = exports['qb-target']:GetCurrentEntity() - if not nearShredder then + if not entity or not DoesEntityExist(entity) then lib.notify({ title = 'Müllschredder', - description = 'Du bist zu weit vom Schredder entfernt!', + description = 'Kein Schredder gefunden!', type = 'error' }) return end - TriggerServerEvent('shredder:server:getItems') + -- Get entity model and position for unique ID + local model = GetEntityModel(entity) + local entityCoords = GetEntityCoords(entity) + local shredderID = "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) + + -- Get items in this shredder + TriggerServerEvent('shredder:server:getItems', shredderID) end) -- Menü mit Items anzeigen @@ -179,7 +164,15 @@ function confirmDestroySingle(itemName, amount, slot) description = itemName .. ' (' .. amount .. 'x) wird permanent gelöscht!', icon = 'check', onSelect = function() - TriggerServerEvent('shredder:server:destroySingle', itemName, amount, slot) + -- Get the entity player is targeting for the unique ID + local entity = exports['qb-target']:GetCurrentEntity() + if entity and DoesEntityExist(entity) then + local model = GetEntityModel(entity) + local entityCoords = GetEntityCoords(entity) + local shredderID = "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) + + TriggerServerEvent('shredder:server:destroySingle', itemName, amount, slot, shredderID) + end end }, { @@ -187,7 +180,15 @@ function confirmDestroySingle(itemName, amount, slot) description = 'Zurück zum Hauptmenü', icon = 'times', onSelect = function() - TriggerServerEvent('shredder:server:getItems') + -- Get the entity player is targeting for the unique ID + local entity = exports['qb-target']:GetCurrentEntity() + if entity and DoesEntityExist(entity) then + local model = GetEntityModel(entity) + local entityCoords = GetEntityCoords(entity) + local shredderID = "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) + + TriggerServerEvent('shredder:server:getItems', shredderID) + end end } } @@ -207,7 +208,15 @@ function confirmDestroyAll() description = 'ALLE Items im Schredder werden permanent gelöscht!', icon = 'fire', onSelect = function() - TriggerServerEvent('shredder:server:destroyAll') + -- Get the entity player is targeting for the unique ID + local entity = exports['qb-target']:GetCurrentEntity() + if entity and DoesEntityExist(entity) then + local model = GetEntityModel(entity) + local entityCoords = GetEntityCoords(entity) + local shredderID = "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) + + TriggerServerEvent('shredder:server:destroyAll', shredderID) + end end }, { @@ -215,7 +224,15 @@ function confirmDestroyAll() description = 'Zurück zum Hauptmenü', icon = 'times', onSelect = function() - TriggerServerEvent('shredder:server:getItems') + -- Get the entity player is targeting for the unique ID + local entity = exports['qb-target']:GetCurrentEntity() + if entity and DoesEntityExist(entity) then + local model = GetEntityModel(entity) + local entityCoords = GetEntityCoords(entity) + local shredderID = "shredder_" .. model .. "_" .. math.floor(entityCoords.x) .. "_" .. math.floor(entityCoords.y) .. "_" .. math.floor(entityCoords.z) + + TriggerServerEvent('shredder:server:getItems', shredderID) + end end } } @@ -248,14 +265,3 @@ RegisterNetEvent('shredder:client:itemDestroyed', function(message) -- 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/server.lua b/resources/[inventory]/nordi_schredder/server.lua index 051fc2c0d..147ac34f9 100644 --- a/resources/[inventory]/nordi_schredder/server.lua +++ b/resources/[inventory]/nordi_schredder/server.lua @@ -1,14 +1,14 @@ local QBCore = exports['qb-core']:GetCoreObject() -- Schredder Inventar öffnen -RegisterNetEvent('shredder:server:openInventory', function() +RegisterNetEvent('shredder:server:openInventory', function(shredderID) 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, { + exports['tgiann-inventory']:OpenInventory(src, 'stash', shredderID, { maxweight = 50000, -- 50kg max slots = 20, -- 20 Slots label = 'Müllschredder' @@ -16,30 +16,27 @@ RegisterNetEvent('shredder:server:openInventory', function() end) -- Items aus Schredder abrufen -RegisterNetEvent('shredder:server:getItems', function() +RegisterNetEvent('shredder:server:getItems', function(shredderID) 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) + local items = exports['tgiann-inventory']:GetInventory(shredderID) TriggerClientEvent('shredder:client:showMenu', src, items or {}) end) -- Einzelnes Item vernichten -RegisterNetEvent('shredder:server:destroySingle', function(itemName, amount, slot) +RegisterNetEvent('shredder:server:destroySingle', function(itemName, amount, slot, shredderID) 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) + local success = exports['tgiann-inventory']:RemoveItemFromInventory(shredderID, itemName, amount, slot) if success then -- Log für Admins @@ -53,21 +50,20 @@ RegisterNetEvent('shredder:server:destroySingle', function(itemName, amount, slo -- Menü neu laden Wait(1000) - TriggerEvent('shredder:server:getItems', src) + TriggerEvent('shredder:server:getItems', src, shredderID) else TriggerClientEvent('QBCore:Notify', src, 'Fehler beim Vernichten des Items!', 'error') end end) -- Alle Items vernichten -RegisterNetEvent('shredder:server:destroyAll', function() +RegisterNetEvent('shredder:server:destroyAll', function(shredderID) 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) + local items = exports['tgiann-inventory']:GetInventory(shredderID) if not items or next(items) == nil then TriggerClientEvent('QBCore:Notify', src, 'Der Schredder ist bereits leer!', 'error') @@ -80,7 +76,7 @@ RegisterNetEvent('shredder:server:destroyAll', function() -- 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) + local success = exports['tgiann-inventory']:RemoveItemFromInventory(shredderID, item.name, item.amount, slot) if success then table.insert(destroyedItems, {name = item.name, amount = item.amount}) totalItems = totalItems + item.amount