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 -- Create a unique event name for this check local uniqueEventName = 'nightvision:itemCheckResult:' .. math.random(100000, 999999) -- Set up the callback local callbackRegistered = false -- Register the event handler local eventHandler = RegisterNetEvent(uniqueEventName) AddEventHandler(uniqueEventName, function(hasItem) itemCheckCache[itemName] = hasItem lastCheckTime[itemName] = GetGameTimer() callback(hasItem) callbackRegistered = true end) -- Request the check from server with our unique event name TriggerServerEvent('nightvision:checkItem', itemName, uniqueEventName) -- Set a timeout to prevent hanging if something goes wrong SetTimeout(1000, function() if not callbackRegistered then callback(false) end end) end -- Funktion zum Prüfen des Charaktergeschlechts local function IsPedMale(ped) return GetEntityModel(ped) == `mp_m_freemode_01` end -- Funktion zum Vergleichen der aktuellen Brille mit einer Konfigurationsbrille local function IsWearingGlasses(ped, glassesConfig) local currentDrawable = GetPedPropIndex(ped, 1) local currentTexture = GetPedPropTextureIndex(ped, 1) return currentDrawable == glassesConfig.drawable and currentTexture == glassesConfig.texture end -- Funktion zum Setzen einer Brille aus der Konfiguration local function SetGlasses(ped, glassesConfig) SetPedPropIndex(ped, 1, glassesConfig.drawable, glassesConfig.texture, true) end -- Funktion zum Deaktivieren aller Sichtmodi local function DisableAllVisionModes() SetNightvision(false) SetSeethrough(false) nvMode = 0 thermalMode = 0 end -- Nachtsicht-Befehl RegisterCommand('toggleNV', function() local ped = PlayerPedId() HasItem(Config.NVItem, function(hasItem) if hasItem 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 -- 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 else QBCore.Functions.Notify('Du trägst keine Nachtsichtbrille!', 'error') end else QBCore.Functions.Notify('Du hast kein Nachtsichtgerät!', 'error') end end) end) -- Wärmebild-Befehl RegisterCommand('toggleThermal', function() local ped = PlayerPedId() HasItem(Config.ThermalItem, function(hasItem) if hasItem 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 -- 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 else QBCore.Functions.Notify('Du trägst keine Wärmebildbrille!', 'error') end else QBCore.Functions.Notify('Du hast kein Wärmebildgerät!', 'error') end end) end) -- Tastenbelegungen registrieren RegisterKeyMapping('toggleNV', 'Nachtsicht umschalten', 'keyboard', Config.NVKey) RegisterKeyMapping('toggleThermal', 'Wärmebild umschalten', 'keyboard', Config.ThermalKey) -- Event zum Umschalten der Brille RegisterNetEvent('nightvision:toggleGlasses', function(mode) local ped = PlayerPedId() local gender = IsPedMale(ped) and "male" or "female" local glasses = Config.Glasses[gender] -- Alle Sichtmodi deaktivieren DisableAllVisionModes() if mode == 'nightvision' then -- Wenn keine der konfigurierten Brillen getragen wird, setze hochgeklappte Version auf if not (IsWearingGlasses(ped, glasses.up) or IsWearingGlasses(ped, glasses.nvDown) or IsWearingGlasses(ped, glasses.thermalDown)) then SetGlasses(ped, glasses.up) QBCore.Functions.Notify('Nachtsichtbrille aufgesetzt!') -- Wenn hochgeklappte Brille getragen wird, klappe sie runter und aktiviere Nachtsicht elseif IsWearingGlasses(ped, glasses.up) then SetGlasses(ped, glasses.nvDown) QBCore.Functions.Notify('Nachtsicht aktiviert!') SetNightvision(true) nvMode = 1 -- Wenn runtergeklappte Nachtsichtbrille getragen wird, klappe sie hoch und deaktiviere Nachtsicht elseif IsWearingGlasses(ped, glasses.nvDown) then SetGlasses(ped, glasses.up) QBCore.Functions.Notify('Nachtsicht deaktiviert!') nvMode = 0 -- Wenn Wärmebildbrille getragen wird, wechsle zu Nachtsichtbrille elseif IsWearingGlasses(ped, glasses.thermalDown) then SetGlasses(ped, glasses.nvDown) QBCore.Functions.Notify('Nachtsicht aktiviert!') SetNightvision(true) nvMode = 1 end elseif mode == 'thermal' then -- Wenn keine der konfigurierten Brillen getragen wird, setze hochgeklappte Version auf if not (IsWearingGlasses(ped, glasses.up) or IsWearingGlasses(ped, glasses.nvDown) or IsWearingGlasses(ped, glasses.thermalDown)) then SetGlasses(ped, glasses.up) QBCore.Functions.Notify('Wärmebildbrille aufgesetzt!') -- Wenn hochgeklappte Brille getragen wird, klappe sie runter und aktiviere Wärmebild elseif IsWearingGlasses(ped, glasses.up) then SetGlasses(ped, glasses.thermalDown) QBCore.Functions.Notify('Wärmebild aktiviert!') SetSeethrough(true) thermalMode = 1 -- Wenn runtergeklappte Wärmebildbrille getragen wird, klappe sie hoch und deaktiviere Wärmebild elseif IsWearingGlasses(ped, glasses.thermalDown) then SetGlasses(ped, glasses.up) QBCore.Functions.Notify('Wärmebild deaktiviert!') thermalMode = 0 -- Wenn Nachtsichtbrille getragen wird, wechsle zu Wärmebildbrille elseif IsWearingGlasses(ped, glasses.nvDown) then SetGlasses(ped, glasses.thermalDown) QBCore.Functions.Notify('Wärmebild aktiviert!') SetSeethrough(true) thermalMode = 1 end end end) -- Behalte den alten Event-Namen für Kompatibilität RegisterNetEvent('nightvision:toggleHelmet', function() TriggerEvent('nightvision:toggleGlasses', 'nightvision') end)