From 07f27b0557a9548a78e8e632ca2f3d6f86e19e5b Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Mon, 28 Jul 2025 23:17:52 +0200 Subject: [PATCH] ed --- resources/[inventory]/nordi_pfand/config.lua | 62 ------ .../[inventory]/nordi_pfand/fxmanifest.lua | 27 --- .../[inventory]/nordi_pfand/server/main.lua | 176 ------------------ .../[inventory]/pickle_consumables/config.lua | 4 + .../modules/pfandsystem/client.lua} | 73 ++------ .../modules/pfandsystem/server.lua | 89 +++++++++ .../modules/pfandsystem/shared.lua | 41 ++++ 7 files changed, 150 insertions(+), 322 deletions(-) delete mode 100644 resources/[inventory]/nordi_pfand/config.lua delete mode 100644 resources/[inventory]/nordi_pfand/fxmanifest.lua delete mode 100644 resources/[inventory]/nordi_pfand/server/main.lua rename resources/[inventory]/{nordi_pfand/client/main.lua => pickle_consumables/modules/pfandsystem/client.lua} (61%) create mode 100644 resources/[inventory]/pickle_consumables/modules/pfandsystem/server.lua create mode 100644 resources/[inventory]/pickle_consumables/modules/pfandsystem/shared.lua diff --git a/resources/[inventory]/nordi_pfand/config.lua b/resources/[inventory]/nordi_pfand/config.lua deleted file mode 100644 index e0efc955c..000000000 --- a/resources/[inventory]/nordi_pfand/config.lua +++ /dev/null @@ -1,62 +0,0 @@ -Config = {} - --- Pfandautomat Props -Config.PfandautomatProps = { - 'as_rv_machine_prop', - -} - --- Konsumierbare Items die Pfand generieren -Config.ConsumableItems = { - ['beer'] = { - pfandItem = 'empty_glasbootle', - label = 'Bier' - }, - ['water_bottle'] = { - pfandItem = 'empty_bottle', - label = 'Wasserflasche' - }, - ['ecola_dose'] = { - pfandItem = 'soda_can', - label = 'Cola' - }, - ['sprunk_dose'] = { - pfandItem = 'soda_can', - label = 'Sprite' - }, -} - --- Pfand Items und ihre Werte (die leeren Behälter) -Config.PfandItems = { - ['empty_bottle'] = { - pfandwert = 25, -- Pfandwert in Cent/Credits - label = 'leere Flasche' - }, - ['empty_can'] = { - pfandwert = 25, - label = 'leere Dose' - }, - ['empty_glasbootle'] = { - pfandwert = 25, - label = 'leere Glasflasche' - } - -} - --- Allgemeine Einstellungen -Config.Currency = 'cash' -- 'cash' oder 'bank' -Config.Debug = true -Config.ShowPfandNotification = true -- Zeige Benachrichtigung wenn Pfand erhalten wird - --- Sprache -Config.Locale = { - ['pfand_menu_title'] = 'Pfandautomat', - ['pfand_menu_description'] = 'Pfandgut einlösen', - ['no_pfand_items'] = 'Du hast keine Pfandartikel bei dir!', - ['pfand_success'] = 'Du hast %s für %d Pfandartikel erhalten!', - ['pfand_error'] = 'Fehler beim Einlösen des Pfands!', - ['processing'] = 'Verarbeite Pfand...', - ['select_items'] = 'Wähle die Artikel aus, die du einlösen möchtest:', - ['pfand_received'] = 'Du hast %s erhalten!', - -} diff --git a/resources/[inventory]/nordi_pfand/fxmanifest.lua b/resources/[inventory]/nordi_pfand/fxmanifest.lua deleted file mode 100644 index ae1509767..000000000 --- a/resources/[inventory]/nordi_pfand/fxmanifest.lua +++ /dev/null @@ -1,27 +0,0 @@ -fx_version 'cerulean' -game 'gta5' -lua54 'yes' - -author 'YourName' -description 'Pfandsystem für QBCore' -version '1.0.0' - -shared_scripts { - '@ox_lib/init.lua', - 'config.lua' -} - -client_scripts { - 'client/main.lua' -} - -server_scripts { - 'server/main.lua' -} - -dependencies { - 'qb-core', - 'qb-target', - 'tgiann-inventory', - 'ox_lib' -} diff --git a/resources/[inventory]/nordi_pfand/server/main.lua b/resources/[inventory]/nordi_pfand/server/main.lua deleted file mode 100644 index 099b00106..000000000 --- a/resources/[inventory]/nordi_pfand/server/main.lua +++ /dev/null @@ -1,176 +0,0 @@ -local QBCore = exports['qb-core']:GetCoreObject() - --- Event wenn ein Item konsumiert wird -RegisterNetEvent('qb-pfandsystem:server:itemConsumed', function(itemName) - local src = source - local Player = QBCore.Functions.GetPlayer(src) - - if not Player then return end - - -- Prüfe ob das konsumierte Item Pfand generiert - if Config.ConsumableItems[itemName] then - local consumableConfig = Config.ConsumableItems[itemName] - local pfandItem = consumableConfig.pfandItem - - -- Warte kurz damit das originale Item erst konsumiert wird - Wait(500) - - -- Verwende Player.Functions.AddItem - local success = Player.Functions.AddItem(pfandItem, 1) - - if success then - -- Trigger inventory update - TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[pfandItem], "add", 1) - - if Config.ShowPfandNotification then - local pfandLabel = Config.PfandItems[pfandItem] and Config.PfandItems[pfandItem].label or pfandItem - - TriggerClientEvent('ox_lib:notify', src, { - title = 'Pfandsystem', - description = string.format(Config.Locale['pfand_received'], pfandLabel), - type = 'success', - duration = 3000 - }) - end - - if Config.Debug then - print(string.format('[Pfandsystem] Spieler %s hat %s konsumiert und %s erhalten', - Player.PlayerData.name, itemName, pfandItem)) - end - else - if Config.Debug then - print(string.format('[Pfandsystem] Fehler beim Hinzufügen von %s für Spieler %s', pfandItem, Player.PlayerData.name)) - end - end - end -end) - --- Pfand einlösen -RegisterNetEvent('qb-pfandsystem:server:redeemPfand', function(selectedItems) - local src = source - local Player = QBCore.Functions.GetPlayer(src) - - if not Player then return end - - local totalPfand = 0 - local totalItems = 0 - local canRedeem = true - - -- Prüfe ob alle Items verfügbar sind - for itemName, quantity in pairs(selectedItems) do - if Config.PfandItems[itemName] then - local item = Player.Functions.GetItemByName(itemName) - if not item or item.amount < quantity then - canRedeem = false - TriggerClientEvent('ox_lib:notify', src, { - title = 'Pfandsystem', - description = 'Du hast nicht genug ' .. (Config.PfandItems[itemName].label or itemName), - type = 'error' - }) - return - end - end - end - - if canRedeem then - -- Entferne Items und berechne Pfand - for itemName, quantity in pairs(selectedItems) do - if Config.PfandItems[itemName] then - local removed = Player.Functions.RemoveItem(itemName, quantity) - if removed then - TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[itemName], "remove", quantity) - - local pfandWert = Config.PfandItems[itemName].pfandwert * quantity - totalPfand = totalPfand + pfandWert - totalItems = totalItems + quantity - end - end - end - - if totalPfand > 0 then - -- Gebe Geld - if Config.Currency == 'cash' then - Player.Functions.AddMoney('cash', totalPfand) - else - Player.Functions.AddMoney('bank', totalPfand) - end - - -- Formatiere Geld für Anzeige - local moneyString = string.format("€%.2f", totalPfand / 100) - - TriggerClientEvent('ox_lib:notify', src, { - title = 'Pfandsystem', - description = string.format(Config.Locale['pfand_success'], moneyString, totalItems), - type = 'success' - }) - - if Config.Debug then - print(string.format('[Pfandsystem] Spieler %s hat %d Items für €%.2f eingelöst', - Player.PlayerData.name, totalItems, totalPfand / 100)) - end - end - end -end) - --- Hole verfügbare Pfand Items des Spielers -QBCore.Functions.CreateCallback('qb-pfandsystem:server:getPfandItems', function(source, cb) - local src = source - local pfandItems = {} - local Player = QBCore.Functions.GetPlayer(src) - - if not Player then - cb(pfandItems) - return - end - - for itemName, itemConfig in pairs(Config.PfandItems) do - local item = Player.Functions.GetItemByName(itemName) - - if item and item.amount > 0 then - pfandItems[itemName] = { - count = item.amount, - label = itemConfig.label, - pfandwert = itemConfig.pfandwert, - totalWert = itemConfig.pfandwert * item.amount - } - end - end - - cb(pfandItems) -end) - --- Zusätzliche Event-Handler für verschiedene Inventarsysteme -RegisterNetEvent('inventory:server:UseItem') -AddEventHandler('inventory:server:UseItem', function(source, item) - local itemName = type(item) == "table" and item.name or item - - if Config.ConsumableItems[itemName] then - SetTimeout(100, function() - TriggerEvent('qb-pfandsystem:server:itemConsumed', itemName) - end) - end -end) - --- Für tgiann-inventory -RegisterNetEvent('tgiann-inventory:itemUsed') -AddEventHandler('tgiann-inventory:itemUsed', function(source, itemName) - if Config.ConsumableItems[itemName] then - SetTimeout(100, function() - TriggerEvent('qb-pfandsystem:server:itemConsumed', itemName) - end) - end -end) - --- Debug-Befehl zum manuellen Auslösen -RegisterCommand('pfanditem', function(source, args) - if Config.Debug then - if args[1] and source > 0 then - TriggerEvent('qb-pfandsystem:server:itemConsumed', args[1]) - end - end -end) - --- Export für andere Scripts -exports('ConsumePfandItem', function(source, itemName) - TriggerEvent('qb-pfandsystem:server:itemConsumed', itemName) -end) diff --git a/resources/[inventory]/pickle_consumables/config.lua b/resources/[inventory]/pickle_consumables/config.lua index b0ac3b00b..071eb4539 100644 --- a/resources/[inventory]/pickle_consumables/config.lua +++ b/resources/[inventory]/pickle_consumables/config.lua @@ -1834,6 +1834,7 @@ Config.Items = { prop = { model = `h4_prop_club_water_bottle`, boneId = 28422, offset = vec3(0.0, 0.00, -0.20), rotation = vec3(0.0, 0.0, 0.0) }, idle = { dict = "amb@code_human_wander_drinking_fat@beer@male@base", anim = "static", time = 2000, params = { nil, nil, nil, 49 } }, animation = { dict = "mini@sprunk", anim = "plyr_buy_drink_pt2", time = 2000, params = { nil, nil, nil, 49 } }, + pfandItem = "empty_bottle", -- Hier wird das Pfand-Item definiert status = { -- Per use. Values are based on percentage of the max value of the status. If below zero, it will remove the status percentage. hunger = 0, thirst = 20, @@ -1848,6 +1849,7 @@ Config.Items = { prop = { model = `sf_prop_sf_can_01a`, boneId = 28422, offset = vec3(0.0, 0.00, -0.07), rotation = vec3(0.0, 0.0, 0.0) }, idle = { dict = "amb@code_human_wander_drinking_fat@beer@male@base", anim = "static", time = 2000, params = { nil, nil, nil, 49 } }, animation = { dict = "mini@sprunk", anim = "plyr_buy_drink_pt2", time = 2000, params = { nil, nil, nil, 49 } }, + pfandItem = "empty_can", -- Hier wird das Pfand-Item definiert status = { -- Per use. Values are based on percentage of the max value of the status. If below zero, it will remove the status percentage. hunger = 0, thirst = 15, @@ -1876,6 +1878,7 @@ Config.Items = { prop = { model = `ng_proc_sodacan_01b`, boneId = 28422, offset = vec3(0.0, 0.00, -0.07), rotation = vec3(0.0, 0.0, 0.0) }, idle = { dict = "amb@code_human_wander_drinking_fat@beer@male@base", anim = "static", time = 2000, params = { nil, nil, nil, 49 } }, animation = { dict = "mini@sprunk", anim = "plyr_buy_drink_pt2", time = 2000, params = { nil, nil, nil, 49 } }, + pfandItem = "empty_can", -- Hier wird das Pfand-Item definiert status = { -- Per use. Values are based on percentage of the max value of the status. If below zero, it will remove the status percentage. hunger = 0, thirst = 10, @@ -1890,6 +1893,7 @@ Config.Items = { prop = { model = `sf_prop_sf_can_01a`, boneId = 28422, offset = vec3(0.0, 0.00, -0.07), rotation = vec3(0.0, 0.0, 0.0) }, idle = { dict = "amb@code_human_wander_drinking_fat@beer@male@base", anim = "static", time = 2000, params = { nil, nil, nil, 49 } }, animation = { dict = "mini@sprunk", anim = "plyr_buy_drink_pt2", time = 2000, params = { nil, nil, nil, 49 } }, + pfandItem = "empty_can", -- Hier wird das Pfand-Item definiert status = { -- Per use. Values are based on percentage of the max value of the status. If below zero, it will remove the status percentage. hunger = 0, thirst = 20, diff --git a/resources/[inventory]/nordi_pfand/client/main.lua b/resources/[inventory]/pickle_consumables/modules/pfandsystem/client.lua similarity index 61% rename from resources/[inventory]/nordi_pfand/client/main.lua rename to resources/[inventory]/pickle_consumables/modules/pfandsystem/client.lua index 6b8d46e94..8c4d6ace5 100644 --- a/resources/[inventory]/nordi_pfand/client/main.lua +++ b/resources/[inventory]/pickle_consumables/modules/pfandsystem/client.lua @@ -1,15 +1,17 @@ -local QBCore = exports['qb-core']:GetCoreObject() +-- modules/pfandsystem/client.lua -- Erstelle Targets für alle Pfandautomaten CreateThread(function() + if not Config.PfandSystem or not Config.PfandSystem.enabled then return end + for _, prop in pairs(Config.PfandautomatProps) do exports['qb-target']:AddTargetModel(prop, { options = { { type = "client", - event = "qb-pfandsystem:client:openPfandMenu", + event = "pickle_consumables:client:openPfandMenu", icon = "fas fa-recycle", - label = "Pfand einlösen", + label = _L('pfand_menu_title'), } }, distance = 2.0 @@ -17,31 +19,11 @@ CreateThread(function() end end) --- Registriere Event für Item-Nutzung (wichtig: das ist der korrekte Event für tgiann-inventory) -RegisterNetEvent('inventory:client:UseItem') -AddEventHandler('inventory:client:UseItem', function(item) - local itemName = item.name - - -- Prüfe ob das verwendete Item Pfand generiert - if Config.ConsumableItems[itemName] then - -- Informiere den Server über die Item-Nutzung - TriggerServerEvent('qb-pfandsystem:server:itemConsumed', itemName) - - if Config.Debug then - print('[Pfandsystem] Item verwendet: ' .. itemName) - end - end -end) - -- Öffne Pfand Menu -RegisterNetEvent('qb-pfandsystem:client:openPfandMenu', function() - QBCore.Functions.TriggerCallback('qb-pfandsystem:server:getPfandItems', function(pfandItems) +RegisterNetEvent('pickle_consumables:client:openPfandMenu', function() + TriggerCallback('pickle_consumables:server:getPfandItems', function(pfandItems) if next(pfandItems) == nil then - lib.notify({ - title = 'Pfandsystem', - description = Config.Locale['no_pfand_items'], - type = 'error' - }) + ShowNotification(_L('no_pfand_items')) return end @@ -68,8 +50,8 @@ function showPfandMenu(pfandItems) -- Option für alle Items table.insert(options, { - title = "Alle Pfandartikel einlösen", - description = "Löse alle verfügbaren Pfandartikel auf einmal ein", + title = _L("Alle Pfandartikel einlösen"), + description = _L("Löse alle verfügbaren Pfandartikel auf einmal ein"), icon = 'coins', onSelect = function() redeemAllItems(pfandItems) @@ -78,7 +60,7 @@ function showPfandMenu(pfandItems) lib.registerContext({ id = 'pfand_menu', - title = Config.Locale['pfand_menu_title'], + title = _L('pfand_menu_title'), options = options }) @@ -87,7 +69,7 @@ end -- Zeige Mengenauswahl function showQuantityInput(itemName, itemData) - local input = lib.inputDialog('Pfand einlösen', { + local input = lib.inputDialog(_L('pfand_menu_title'), { { type = 'slider', label = 'Anzahl (' .. itemData.label .. ')', @@ -111,7 +93,7 @@ function showQuantityInput(itemName, itemData) local moneyString = string.format("€%.2f", totalValue / 100) local confirm = lib.alertDialog({ - header = 'Pfand einlösen', + header = _L('pfand_menu_title'), content = string.format('Möchtest du %d x %s für %s einlösen?', quantity, itemData.label, moneyString), centered = true, @@ -140,7 +122,7 @@ function redeemAllItems(pfandItems) local moneyString = string.format("€%.2f", totalValue / 100) local confirm = lib.alertDialog({ - header = 'Alle Pfandartikel einlösen', + header = _L('pfand_menu_title'), content = string.format('Möchtest du alle %d Pfandartikel für %s einlösen?', totalCount, moneyString), centered = true, @@ -154,29 +136,6 @@ end -- Sende Pfand zum Server function redeemPfand(selectedItems) - lib.notify({ - title = 'Pfandsystem', - description = Config.Locale['processing'], - type = 'inform' - }) - - TriggerServerEvent('qb-pfandsystem:server:redeemPfand', selectedItems) + ShowNotification(_L('processing')) + TriggerServerEvent('pickle_consumables:server:redeemPfand', selectedItems) end - --- Debug Befehle (nur wenn Debug aktiviert) -if Config.Debug then - RegisterCommand('pfandtest', function() - TriggerEvent('qb-pfandsystem:client:openPfandMenu') - end, false) - - RegisterCommand('pfandconsume', function(source, args) - if args[1] then - TriggerServerEvent('qb-pfandsystem:server:itemConsumed', args[1]) - end - end, false) -end - --- Export für andere Scripts -exports('TriggerPfandConsumption', function(itemName) - TriggerServerEvent('qb-pfandsystem:server:itemConsumed', itemName) -end) diff --git a/resources/[inventory]/pickle_consumables/modules/pfandsystem/server.lua b/resources/[inventory]/pickle_consumables/modules/pfandsystem/server.lua new file mode 100644 index 000000000..6775bdadc --- /dev/null +++ b/resources/[inventory]/pickle_consumables/modules/pfandsystem/server.lua @@ -0,0 +1,89 @@ +-- modules/pfandsystem/server.lua + +-- Pfand einlösen +RegisterNetEvent('pickle_consumables:server:redeemPfand', function(selectedItems) + local src = source + local Player = GetPlayer(src) + + if not Player then return end + + local totalPfand = 0 + local totalItems = 0 + local canRedeem = true + + -- Prüfe ob alle Items verfügbar sind + for itemName, quantity in pairs(selectedItems) do + if Config.PfandItems[itemName] then + local hasItem = HasItem(src, itemName, quantity) + if not hasItem then + canRedeem = false + ShowNotification(src, 'Du hast nicht genug ' .. (Config.PfandItems[itemName].label or itemName), "error") + return + end + end + end + + if canRedeem then + -- Entferne Items und berechne Pfand + for itemName, quantity in pairs(selectedItems) do + if Config.PfandItems[itemName] then + local removed = RemoveItem(src, itemName, quantity) + if removed then + local pfandWert = Config.PfandItems[itemName].pfandwert * quantity + totalPfand = totalPfand + pfandWert + totalItems = totalItems + quantity + end + end + end + + if totalPfand > 0 then + -- Gebe Geld + if Config.PfandSystem.currency == 'cash' then + AddMoney(src, 'cash', totalPfand) + else + AddMoney(src, 'bank', totalPfand) + end + + -- Formatiere Geld für Anzeige + local moneyString = string.format("€%.2f", totalPfand / 100) + + ShowNotification(src, string.format(_L('pfand_success'), moneyString, totalItems), "success") + end + end +end) + +-- Hole verfügbare Pfand Items des Spielers +RegisterCallback('pickle_consumables:server:getPfandItems', function(source, cb) + local src = source + local pfandItems = {} + + for itemName, itemConfig in pairs(Config.PfandItems) do + local itemCount = GetItemCount(src, itemName) + + if itemCount > 0 then + pfandItems[itemName] = { + count = itemCount, + label = itemConfig.label, + pfandwert = itemConfig.pfandwert, + totalWert = itemConfig.pfandwert * itemCount + } + end + end + + cb(pfandItems) +end) + +-- Hook für Item-Nutzung +AddEventHandler('pickle_consumables:itemUsed', function(source, itemName, itemData, slot) + -- Prüfe ob das Item ein Pfand-Item generiert + local itemConfig = Config.Items[itemName] + if itemConfig and itemConfig.pfandItem and Config.PfandItems[itemConfig.pfandItem] then + -- Gebe Pfand-Item + AddItem(source, itemConfig.pfandItem, 1) + + if Config.PfandSystem.showNotification then + local pfandLabel = Config.PfandItems[itemConfig.pfandItem].label + ShowNotification(source, string.format(_L('pfand_received'), pfandLabel), "success") + end + end +end) diff --git a/resources/[inventory]/pickle_consumables/modules/pfandsystem/shared.lua b/resources/[inventory]/pickle_consumables/modules/pfandsystem/shared.lua new file mode 100644 index 000000000..e99f445ad --- /dev/null +++ b/resources/[inventory]/pickle_consumables/modules/pfandsystem/shared.lua @@ -0,0 +1,41 @@ +-- modules/pfandsystem/shared.lua + +-- Pfandautomat Props +Config.PfandautomatProps = { + 'as_rv_machine_prop', +} + +-- Pfand Items und ihre Werte (die leeren Behälter) +Config.PfandItems = { + ['empty_bottle'] = { + pfandwert = 25, -- Pfandwert in Cent/Credits + label = 'leere Flasche' + }, + ['empty_can'] = { + pfandwert = 25, + label = 'leere Dose' + }, + ['empty_glasbootle'] = { + pfandwert = 25, + label = 'leere Glasflasche' + } +} + +-- Pfand Einstellungen +Config.PfandSystem = { + enabled = true, + currency = 'cash', -- 'cash' oder 'bank' + showNotification = true +} + +-- Pfand Sprache +if not Language[Config.Language] then Language[Config.Language] = {} end + +Language[Config.Language]['pfand_menu_title'] = 'Pfandautomat' +Language[Config.Language]['pfand_menu_description'] = 'Pfandgut einlösen' +Language[Config.Language]['no_pfand_items'] = 'Du hast keine Pfandartikel bei dir!' +Language[Config.Language]['pfand_success'] = 'Du hast %s für %d Pfandartikel erhalten!' +Language[Config.Language]['pfand_error'] = 'Fehler beim Einlösen des Pfands!' +Language[Config.Language]['processing'] = 'Verarbeite Pfand...' +Language[Config.Language]['select_items'] = 'Wähle die Artikel aus, die du einlösen möchtest:' +Language[Config.Language]['pfand_received'] = 'Du hast %s erhalten!'