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)
 |