diff --git a/resources/[inventory]/cs_shops/config/config.lua b/resources/[inventory]/cs_shops/config/config.lua index a3d8c0e9e..8a1106939 100644 --- a/resources/[inventory]/cs_shops/config/config.lua +++ b/resources/[inventory]/cs_shops/config/config.lua @@ -1246,7 +1246,12 @@ CodeStudio.Products = { itemPrice = 50, itemInfo = "", }, - + ['vehicletrackertablet'] = { + itemName = "Fahrzeugtracker Tablet", + itemStock = 150, + itemPrice = 50, + itemInfo = "", + }, } }, ['police_weapons'] = { diff --git a/resources/[inventory]/rj-lockers/client.lua b/resources/[inventory]/rj-lockers/client.lua deleted file mode 100644 index 52498a643..000000000 --- a/resources/[inventory]/rj-lockers/client.lua +++ /dev/null @@ -1,59 +0,0 @@ -local QBCore = exports['qb-core']:GetCoreObject() - -Config = {} -Config.lockerProps = {'h4_prop_h4_ld_keypad_01b'} -- Props you can access storage -Config.Locations = { - [1] = { - name = 'SD', - location = vector3(1827.6656, 3680.0276, 34.4050), - radius = 8.0, - maxweight = 30000, - slots = 32.0, - }, - [2] = { - name = 'Lagerhaus Sandy', - location = vector3(182.5523, 2792.6450, 45.6404), - radius = 8.0, - maxweight = 400000, - slots = 32.0, - }, -} - -Citizen.CreateThread(function() - - exports['qb-target']:AddTargetModel(Config.lockerProps, { - options = { - { - id = 1, - icon = "fa-solid fa-lock", - label = "Open personal locker", - action = function(entity) - TriggerEvent('rj-lockers:openLocker', entity) - end, - }, - }, - distance = 1.5 - }) - -end) - -RegisterNetEvent('rj-lockers:openLocker', function(entity) - - local PlayerData = QBCore.Functions.GetPlayerData() - local lockerLoc = GetEntityCoords(entity) - local accessGranted = false - - for x, v in pairs(Config.Locations) do - if GetDistanceBetweenCoords(lockerLoc, v.location) < v.radius then - TriggerServerEvent("inventory:server:OpenInventory", "stash", v.name .. "_" .. PlayerData.citizenid, {maxweight = v.maxweight, slots = v.slots}) - TriggerEvent("inventory:client:SetCurrentStash", v.name .. "_" .. PlayerData.citizenid) - accessGranted = true - break - end - end - - if not accessGranted then - QBCore.Functions.Notify('You cannot access this locker', 'error', 5000) - end - -end) \ No newline at end of file diff --git a/resources/[inventory]/rj-lockers/fxmanifest.lua b/resources/[inventory]/rj-lockers/fxmanifest.lua deleted file mode 100644 index a3cb29408..000000000 --- a/resources/[inventory]/rj-lockers/fxmanifest.lua +++ /dev/null @@ -1,10 +0,0 @@ -fx_version 'cerulean' -game 'gta5' - -author 'RJ-Scripts' -description 'rj-lockers for QBCore' -version '1.0.0' - -client_script { - 'client.lua', -} \ No newline at end of file diff --git a/resources/[tools]/thommie-nightvision/cl_main.lua b/resources/[tools]/thommie-nightvision/cl_main.lua index 1cc9a5b69..5c63eee08 100644 --- a/resources/[tools]/thommie-nightvision/cl_main.lua +++ b/resources/[tools]/thommie-nightvision/cl_main.lua @@ -2,6 +2,45 @@ local QBCore = exports[Config.CoreName]:GetCoreObject() local nvMode = 0 local thermalMode = 0 +-- Cache system for item checks +local itemCheckCache = {} +local lastCheckTime = {} +local checkCooldown = 1000 -- 1 second cooldown between checks for the same item + +-- Function to check if player has an item +local function HasItem(itemName, callback) + -- Check cache first (to avoid spamming the server) + local currentTime = GetGameTimer() + if itemCheckCache[itemName] ~= nil and lastCheckTime[itemName] and + (currentTime - lastCheckTime[itemName]) < checkCooldown then + callback(itemCheckCache[itemName]) + return + end + + -- Set up the callback + local callbackRegistered = false + local eventHandler = RegisterNetEvent('nightvision:itemCheckResult', function(checkedItem, hasItem) + if checkedItem == itemName then + itemCheckCache[itemName] = hasItem + lastCheckTime[itemName] = GetGameTimer() + callback(hasItem) + callbackRegistered = true + RemoveEventHandler(eventHandler) + end + end) + + -- Request the check from server + TriggerServerEvent('nightvision:checkItem', itemName) + + -- Set a timeout to prevent hanging if something goes wrong + SetTimeout(1000, function() + if not callbackRegistered then + RemoveEventHandler(eventHandler) + callback(false) + end + end) +end + -- Funktion zum Prüfen des Charaktergeschlechts local function IsPedMale(ped) return GetEntityModel(ped) == `mp_m_freemode_01` @@ -32,106 +71,110 @@ end RegisterCommand('toggleNV', function() local ped = PlayerPedId() - if QBCore.Functions.HasItem(Config.NVItem) then - local gender = IsPedMale(ped) and "male" or "female" - local glasses = Config.Glasses[gender] - - -- Prüfen, ob der Spieler eine der Brillen trägt - local canToggle = not Config.CheckHelmet - if Config.CheckHelmet then - if IsWearingGlasses(ped, glasses.up) or IsWearingGlasses(ped, glasses.nvDown) then - canToggle = true - end - end - - if canToggle then - -- Deaktiviere zuerst Wärmebild, falls aktiv - if thermalMode > 0 then - SetSeethrough(false) - thermalMode = 0 - -- Wenn die Wärmebildbrille getragen wird, klappe sie hoch - if IsWearingGlasses(ped, glasses.thermalDown) then - SetGlasses(ped, glasses.up) - end - end + HasItem(Config.NVItem, function(hasItem) + if hasItem then + local gender = IsPedMale(ped) and "male" or "female" + local glasses = Config.Glasses[gender] - -- Nachtsicht-Modus umschalten - if nvMode == 0 then - -- Wenn die Brille hochgeklappt ist, klappe sie runter - if IsWearingGlasses(ped, glasses.up) then - SetGlasses(ped, glasses.nvDown) + -- Prüfen, ob der Spieler eine der Brillen trägt + local canToggle = not Config.CheckHelmet + if Config.CheckHelmet then + if IsWearingGlasses(ped, glasses.up) or IsWearingGlasses(ped, glasses.nvDown) then + canToggle = true + end + end + + if canToggle then + -- Deaktiviere zuerst Wärmebild, falls aktiv + if thermalMode > 0 then + SetSeethrough(false) + thermalMode = 0 + -- Wenn die Wärmebildbrille getragen wird, klappe sie hoch + if IsWearingGlasses(ped, glasses.thermalDown) then + SetGlasses(ped, glasses.up) + end + end + + -- Nachtsicht-Modus umschalten + if nvMode == 0 then + -- Wenn die Brille hochgeklappt ist, klappe sie runter + if IsWearingGlasses(ped, glasses.up) then + SetGlasses(ped, glasses.nvDown) + end + QBCore.Functions.Notify('Nachtsicht aktiviert!') + SetNightvision(true) + nvMode = 1 + else + -- Wenn die Brille runtergeklappt ist, klappe sie hoch + if IsWearingGlasses(ped, glasses.nvDown) then + SetGlasses(ped, glasses.up) + end + QBCore.Functions.Notify('Nachtsicht deaktiviert!') + SetNightvision(false) + nvMode = 0 end - QBCore.Functions.Notify('Nachtsicht aktiviert!') - SetNightvision(true) - nvMode = 1 else - -- Wenn die Brille runtergeklappt ist, klappe sie hoch - if IsWearingGlasses(ped, glasses.nvDown) then - SetGlasses(ped, glasses.up) - end - QBCore.Functions.Notify('Nachtsicht deaktiviert!') - SetNightvision(false) - nvMode = 0 + QBCore.Functions.Notify('Du trägst keine Nachtsichtbrille!', 'error') end else - QBCore.Functions.Notify('Du trägst keine Nachtsichtbrille!', 'error') + QBCore.Functions.Notify('Du hast kein Nachtsichtgerät!', 'error') end - else - QBCore.Functions.Notify('Du hast kein Nachtsichtgerät!', 'error') - end + end) end) -- Wärmebild-Befehl RegisterCommand('toggleThermal', function() local ped = PlayerPedId() - if QBCore.Functions.HasItem(Config.ThermalItem) then - local gender = IsPedMale(ped) and "male" or "female" - local glasses = Config.Glasses[gender] - - -- Prüfen, ob der Spieler eine der Brillen trägt - local canToggle = not Config.CheckHelmet - if Config.CheckHelmet then - if IsWearingGlasses(ped, glasses.up) or IsWearingGlasses(ped, glasses.thermalDown) then - canToggle = true - end - end - - if canToggle then - -- Deaktiviere zuerst Nachtsicht, falls aktiv - if nvMode > 0 then - SetNightvision(false) - nvMode = 0 - -- Wenn die Nachtsichtbrille getragen wird, klappe sie hoch - if IsWearingGlasses(ped, glasses.nvDown) then - SetGlasses(ped, glasses.up) - end - end + HasItem(Config.ThermalItem, function(hasItem) + if hasItem then + local gender = IsPedMale(ped) and "male" or "female" + local glasses = Config.Glasses[gender] - -- Wärmebild-Modus umschalten - if thermalMode == 0 then - -- Wenn die Brille hochgeklappt ist, klappe sie runter - if IsWearingGlasses(ped, glasses.up) then - SetGlasses(ped, glasses.thermalDown) + -- Prüfen, ob der Spieler eine der Brillen trägt + local canToggle = not Config.CheckHelmet + if Config.CheckHelmet then + if IsWearingGlasses(ped, glasses.up) or IsWearingGlasses(ped, glasses.thermalDown) then + canToggle = true + end + end + + if canToggle then + -- Deaktiviere zuerst Nachtsicht, falls aktiv + if nvMode > 0 then + SetNightvision(false) + nvMode = 0 + -- Wenn die Nachtsichtbrille getragen wird, klappe sie hoch + if IsWearingGlasses(ped, glasses.nvDown) then + SetGlasses(ped, glasses.up) + end + end + + -- Wärmebild-Modus umschalten + if thermalMode == 0 then + -- Wenn die Brille hochgeklappt ist, klappe sie runter + if IsWearingGlasses(ped, glasses.up) then + SetGlasses(ped, glasses.thermalDown) + end + QBCore.Functions.Notify('Wärmebild aktiviert!') + SetSeethrough(true) + thermalMode = 1 + else + -- Wenn die Brille runtergeklappt ist, klappe sie hoch + if IsWearingGlasses(ped, glasses.thermalDown) then + SetGlasses(ped, glasses.up) + end + QBCore.Functions.Notify('Wärmebild deaktiviert!') + SetSeethrough(false) + thermalMode = 0 end - QBCore.Functions.Notify('Wärmebild aktiviert!') - SetSeethrough(true) - thermalMode = 1 else - -- Wenn die Brille runtergeklappt ist, klappe sie hoch - if IsWearingGlasses(ped, glasses.thermalDown) then - SetGlasses(ped, glasses.up) - end - QBCore.Functions.Notify('Wärmebild deaktiviert!') - SetSeethrough(false) - thermalMode = 0 + QBCore.Functions.Notify('Du trägst keine Wärmebildbrille!', 'error') end else - QBCore.Functions.Notify('Du trägst keine Wärmebildbrille!', 'error') + QBCore.Functions.Notify('Du hast kein Wärmebildgerät!', 'error') end - else - QBCore.Functions.Notify('Du hast kein Wärmebildgerät!', 'error') - end + end) end) -- Tastenbelegungen registrieren @@ -204,3 +247,6 @@ end) RegisterNetEvent('nightvision:toggleHelmet', function() TriggerEvent('nightvision:toggleGlasses', 'nightvision') end) + +-- Register event handler for item check results +RegisterNetEvent('nightvision:itemCheckResult') diff --git a/resources/[tools]/thommie-nightvision/sv_main.lua b/resources/[tools]/thommie-nightvision/sv_main.lua index df9359dc9..e75992ade 100644 --- a/resources/[tools]/thommie-nightvision/sv_main.lua +++ b/resources/[tools]/thommie-nightvision/sv_main.lua @@ -1,8 +1,35 @@ local QBCore = exports[Config.CoreName]:GetCoreObject() +-- Function to check if player has an item +local function HasItem(source, itemName) + local items = exports["tgiann-inventory"]:GetPlayerItems(source) + if not items then return false end + + for _, item in pairs(items) do + if item.name == itemName then + return true + end + end + + return false +end + +-- Event for client to check if player has an item +RegisterNetEvent('nightvision:checkItem', function(itemName) + local src = source + local hasItem = HasItem(src, itemName) + TriggerClientEvent('nightvision:itemCheckResult', src, itemName, hasItem) +end) + +-- Register usable items QBCore.Functions.CreateUseableItem(Config.NVItem, function(source, item) - local Player = QBCore.Functions.GetPlayer(source) - if Player.Functions.GetItemByName(item.name) then + if HasItem(source, item.name) then TriggerClientEvent('nightvision:toggleHelmet', source) end -end) \ No newline at end of file +end) + +QBCore.Functions.CreateUseableItem(Config.ThermalItem, function(source, item) + if HasItem(source, item.name) then + TriggerClientEvent('nightvision:toggleGlasses', source, 'thermal') + end +end)