251 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 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)
 | 
