From 90d92129ee2c5590dbdfb76909ff6b19316dfd5f Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Tue, 29 Jul 2025 07:51:42 +0200 Subject: [PATCH] ed --- .../[inventory]/nordi_vending/client.lua | 135 ++++++++++++------ .../[inventory]/nordi_vending/config.lua | 2 +- 2 files changed, 94 insertions(+), 43 deletions(-) diff --git a/resources/[inventory]/nordi_vending/client.lua b/resources/[inventory]/nordi_vending/client.lua index 610f6bfd0..acabc33d3 100644 --- a/resources/[inventory]/nordi_vending/client.lua +++ b/resources/[inventory]/nordi_vending/client.lua @@ -1,4 +1,6 @@ local QBCore = exports['qb-core']:GetCoreObject() +local machineCache = {} -- Cache für registrierte Maschinen +local ownerCache = {} -- Cache für Besitzer -- Add targets to all vending machine props CreateThread(function() @@ -6,6 +8,52 @@ CreateThread(function() refreshTargets() end) +-- Update cache periodically +CreateThread(function() + while true do + updateCache() + Wait(5000) -- Update every 5 seconds + end +end) + +-- Update machine and owner cache +function updateCache() + local playerPed = PlayerPedId() + local playerCoords = GetEntityCoords(playerPed) + + -- Clear old cache + machineCache = {} + ownerCache = {} + + -- Check all vending machine props in range + for i = 1, #Config.VendingProps do + local hash = GetHashKey(Config.VendingProps[i]) + local objects = GetGamePool('CObject') + + for j = 1, #objects do + local obj = objects[j] + if GetEntityModel(obj) == hash then + local objCoords = GetEntityCoords(obj) + local distance = #(playerCoords - objCoords) + + if distance < 50.0 then -- Only check nearby objects + -- Check if machine exists + QBCore.Functions.TriggerCallback('vending:server:machineExists', function(exists) + machineCache[obj] = exists + + if exists then + -- Check if player is owner + QBCore.Functions.TriggerCallback('vending:server:isOwner', function(isOwner) + ownerCache[obj] = isOwner + end, objCoords) + end + end, objCoords) + end + end + end + end +end + -- Refresh all targets function refreshTargets() -- Remove old targets first @@ -22,7 +70,7 @@ function refreshTargets() icon = "fas fa-dollar-sign", label = "Automaten kaufen ($" .. Config.VendingMachinePrice .. ")", canInteract = function(entity) - return not isMachineRegistered(entity) + return not (machineCache[entity] == true) end }, { @@ -31,7 +79,7 @@ function refreshTargets() icon = "fas fa-shopping-cart", label = "Kaufen", canInteract = function(entity) - return isMachineRegistered(entity) + return machineCache[entity] == true end }, { @@ -40,7 +88,7 @@ function refreshTargets() icon = "fas fa-cog", label = "Verwalten", canInteract = function(entity) - return isMachineRegistered(entity) and isOwner(entity) + return machineCache[entity] == true and ownerCache[entity] == true end }, { @@ -49,7 +97,7 @@ function refreshTargets() icon = "fas fa-mask", label = "Aufbrechen", canInteract = function(entity) - return isMachineRegistered(entity) and hasRobberyItem() and not isOwner(entity) + return machineCache[entity] == true and ownerCache[entity] ~= true and hasRobberyItem() end } }, @@ -57,43 +105,11 @@ function refreshTargets() }) end --- Check if machine is registered -function isMachineRegistered(entity) - local coords = GetEntityCoords(entity) - local registered = false - - QBCore.Functions.TriggerCallback('vending:server:machineExists', function(exists) - registered = exists - end, coords) - - -- Wait for callback (not ideal but necessary for sync check) - while registered == false do - Wait(10) - end - - return registered -end - --- Check if player is owner -function isOwner(entity) - local coords = GetEntityCoords(entity) - local owner = false - - QBCore.Functions.TriggerCallback('vending:server:isOwner', function(isOwner) - owner = isOwner - end, coords) - - -- Wait for callback - while owner == false do - Wait(10) - end - - return owner -end - -- Check if player has robbery item function hasRobberyItem() local PlayerData = QBCore.Functions.GetPlayerData() + if not PlayerData or not PlayerData.items then return false end + for k, v in pairs(PlayerData.items) do if v.name == Config.RobberyItem and v.amount > 0 then return true @@ -158,8 +174,9 @@ RegisterNetEvent('vending:client:openBuyMenu', function(data) for i = 1, #items do local item = items[i] if item.amount > 0 then + local itemLabel = QBCore.Shared.Items[item.name] and QBCore.Shared.Items[item.name].label or item.name table.insert(options, { - title = QBCore.Shared.Items[item.name].label, + title = itemLabel, description = 'Preis: $' .. item.price .. ' | Verfügbar: ' .. item.amount, icon = 'nui://qb-inventory/html/images/' .. item.name .. '.png', onSelect = function() @@ -169,6 +186,11 @@ RegisterNetEvent('vending:client:openBuyMenu', function(data) end end + if #options == 0 then + QBCore.Functions.Notify('Keine verfügbaren Items!', 'error') + return + end + lib.registerContext({ id = 'vending_buy_menu', title = 'Verkaufsautomat', @@ -238,8 +260,9 @@ function openPriceMenu(coords) for i = 1, #items do local item = items[i] + local itemLabel = QBCore.Shared.Items[item.name] and QBCore.Shared.Items[item.name].label or item.name table.insert(options, { - title = QBCore.Shared.Items[item.name].label, + title = itemLabel, description = 'Aktueller Preis: $' .. item.price, icon = 'nui://qb-inventory/html/images/' .. item.name .. '.png', onSelect = function() @@ -260,10 +283,12 @@ end -- Set price for specific item function setPriceForItem(coords, itemName, currentPrice) + local itemLabel = QBCore.Shared.Items[itemName] and QBCore.Shared.Items[itemName].label or itemName + local input = lib.inputDialog('Preis festlegen', { { type = 'number', - label = 'Neuer Preis für ' .. (QBCore.Shared.Items[itemName] and QBCore.Shared.Items[itemName].label or itemName), + label = 'Neuer Preis für ' .. itemLabel, description = 'Aktueller Preis: $' .. currentPrice, required = true, min = 1, @@ -280,7 +305,15 @@ end -- Open withdraw menu function openWithdrawMenu(coords) QBCore.Functions.TriggerCallback('vending:server:getMachineByCoords', function(machine) - if not machine then return end + if not machine then + QBCore.Functions.Notify('Automat nicht gefunden!', 'error') + return + end + + if machine.money <= 0 then + QBCore.Functions.Notify('Kein Geld im Automaten!', 'error') + return + end local input = lib.inputDialog('Geld abheben', { { @@ -408,5 +441,23 @@ end) -- Refresh targets when called from server RegisterNetEvent('vending:client:refreshTargets', function() + updateCache() + Wait(1000) refreshTargets() end) + +-- Update cache when player data changes +RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() + Wait(2000) + updateCache() + refreshTargets() +end) + +-- Debug command to check targets +RegisterCommand('checktargets', function() + print('Refreshing vending machine targets...') + updateCache() + Wait(1000) + refreshTargets() + print('Targets refreshed!') +end, false) diff --git a/resources/[inventory]/nordi_vending/config.lua b/resources/[inventory]/nordi_vending/config.lua index fd5610ab7..58841c498 100644 --- a/resources/[inventory]/nordi_vending/config.lua +++ b/resources/[inventory]/nordi_vending/config.lua @@ -2,7 +2,7 @@ Config = {} -- Vending Machine Settings Config.VendingProps = { - 'prop_boxpile_03a', + 'bzzz_vending_candy_a', }