local QBCore = exports[Config.CoreName]:GetCoreObject() local nvMode = 0 local thermalMode = 0 local flashlightActive = false local flashlightObject = nil -- 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 Prüfen, ob der Spieler den richtigen Helm trägt local function IsWearingFlashlightHelmet(ped) local gender = IsPedMale(ped) and "male" or "female" local helmetConfig = Config.FlashlightHelmet[gender] local currentDrawable = GetPedPropIndex(ped, 0) -- 0 ist der Index für Helme local currentTexture = GetPedPropTextureIndex(ped, 0) return currentDrawable == helmetConfig.drawable and currentTexture == helmetConfig.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 -- Funktion zum Aktivieren der Helm-Lampe local function ToggleHelmetFlashlight() local ped = PlayerPedId() -- Prüfen, ob der Spieler den richtigen Helm trägt if not IsWearingFlashlightHelmet(ped) then QBCore.Functions.Notify('Du trägst keinen Helm mit Lampe!', 'error') return end if flashlightActive then -- Deaktiviere die Lampe if DoesEntityExist(flashlightObject) then DeleteEntity(flashlightObject) flashlightObject = nil end flashlightActive = false QBCore.Functions.Notify('Helm-Lampe ausgeschaltet!') else -- Aktiviere die Lampe local boneIndex = GetPedBoneIndex(ped, 31086) -- Kopf-Knochen -- Erstelle ein Licht-Objekt local coords = GetEntityCoords(ped) flashlightObject = CreateObject(GetHashKey("prop_cs_police_torch"), coords.x, coords.y, coords.z, true, true, true) -- Mache das Objekt unsichtbar, aber behalte das Licht SetEntityVisible(flashlightObject, false, 0) SetEntityCollision(flashlightObject, false, false) -- Befestige das Objekt am Kopf AttachEntityToEntity( flashlightObject, ped, boneIndex, Config.Flashlight.offset.x, Config.Flashlight.offset.y, Config.Flashlight.offset.z, 0.0, 0.0, 0.0, true, true, false, true, 0, true ) -- Erstelle ein Licht local c = Config.Flashlight.color local range = Config.Flashlight.range local intensity = Config.Flashlight.intensity -- Verwende natives Licht-System SetEntityLights(flashlightObject, false) flashlightActive = true QBCore.Functions.Notify('Helm-Lampe eingeschaltet!') end end -- Thread für das Licht-Update Citizen.CreateThread(function() while true do if flashlightActive and DoesEntityExist(flashlightObject) then local ped = PlayerPedId() -- Prüfen, ob der Spieler noch den richtigen Helm trägt if not IsWearingFlashlightHelmet(ped) then -- Deaktiviere die Lampe, wenn der Helm abgenommen wurde if DoesEntityExist(flashlightObject) then DeleteEntity(flashlightObject) flashlightObject = nil end flashlightActive = false QBCore.Functions.Notify('Helm-Lampe ausgeschaltet, da der Helm abgenommen wurde!', 'error') Citizen.Wait(500) else local pos = GetEntityCoords(ped) local forwardVector = GetEntityForwardVector(ped) local c = Config.Flashlight.color -- Berechne die Zielposition für das Licht (weiter vorne) local targetPos = vector3( pos.x + forwardVector.x * 10.0, pos.y + forwardVector.y * 10.0, pos.z + forwardVector.z * 10.0 ) -- Zeichne das Licht mit DrawSpotlightWithShadow für bessere Sichtbarkeit DrawSpotlightWithShadow( pos.x, pos.y, pos.z + 1.0, -- Startposition (über dem Kopf) forwardVector.x, forwardVector.y, forwardVector.z, -- Richtung c.r, c.g, c.b, -- Farbe Config.Flashlight.range, -- Reichweite Config.Flashlight.intensity, -- Helligkeit Config.Flashlight.range / 2, -- Radius Config.Flashlight.range * 1.5, -- Falloff 0.0, -- Rundheit GetHashKey("FLASH_TORCH_LIGHT") -- Shadow ID ) -- Zusätzlich einen helleren Punkt am Ziel zeichnen DrawLightWithRange( targetPos.x, targetPos.y, targetPos.z, c.r, c.g, c.b, 3.0, -- Radius Config.Flashlight.intensity / 2 -- Intensität ) end Citizen.Wait(0) -- Jedes Frame aktualisieren else Citizen.Wait(500) -- Längere Wartezeit, wenn keine Lampe aktiv ist end end end) -- Funktion zum Aktivieren der Helm-Lampe local function ToggleHelmetFlashlight() local ped = PlayerPedId() -- Prüfen, ob der Spieler den richtigen Helm trägt if not IsWearingFlashlightHelmet(ped) then QBCore.Functions.Notify('Du trägst keinen Helm mit Lampe!', 'error') return end if flashlightActive then -- Deaktiviere die Lampe if DoesEntityExist(flashlightObject) then DeleteEntity(flashlightObject) flashlightObject = nil end flashlightActive = false QBCore.Functions.Notify('Helm-Lampe ausgeschaltet!') else -- Aktiviere die Lampe local boneIndex = GetPedBoneIndex(ped, 31086) -- Kopf-Knochen -- Erstelle ein Licht-Objekt local coords = GetEntityCoords(ped) flashlightObject = CreateObject(GetHashKey("prop_cs_police_torch"), coords.x, coords.y, coords.z, true, true, true) -- Mache das Objekt unsichtbar, aber behalte das Licht SetEntityVisible(flashlightObject, false, 0) SetEntityCollision(flashlightObject, false, false) -- Befestige das Objekt am Kopf AttachEntityToEntity( flashlightObject, ped, boneIndex, Config.Flashlight.offset.x, Config.Flashlight.offset.y, Config.Flashlight.offset.z, 0.0, 0.0, 0.0, true, true, false, true, 0, true ) flashlightActive = true QBCore.Functions.Notify('Helm-Lampe eingeschaltet!') end end -- Nachtsicht-Befehl 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 -- 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) -- 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 -- 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) -- Helm-Lampe-Befehl RegisterCommand('toggleHelmetLight', function() ToggleHelmetFlashlight() end) -- Tastenbelegungen registrieren RegisterKeyMapping('toggleNV', 'Nachtsicht umschalten', 'keyboard', Config.NVKey) RegisterKeyMapping('toggleThermal', 'Wärmebild umschalten', 'keyboard', Config.ThermalKey) RegisterKeyMapping('toggleHelmetLight', 'Helm-Lampe umschalten', 'keyboard', Config.FlashlightKey) -- 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) -- Cleanup beim Ressource-Stop AddEventHandler('onResourceStop', function(resourceName) if (GetCurrentResourceName() ~= resourceName) then return end -- Deaktiviere alle Effekte und entferne Objekte DisableAllVisionModes() if DoesEntityExist(flashlightObject) then DeleteEntity(flashlightObject) flashlightObject = nil end end)