forked from Simnation/Main
333 lines
13 KiB
Lua
333 lines
13 KiB
Lua
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
|
|
Citizen.Wait(0)
|
|
|
|
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
|
|
local range = Config.Flashlight.range
|
|
local intensity = Config.Flashlight.intensity
|
|
|
|
-- Zeichne das Licht in Blickrichtung
|
|
DrawSpotLight(
|
|
pos.x, pos.y, pos.z + 1.0,
|
|
forwardVector.x, forwardVector.y, forwardVector.z,
|
|
c.r, c.g, c.b,
|
|
range, intensity,
|
|
0.0, 1.0, 1.0
|
|
)
|
|
end
|
|
else
|
|
Citizen.Wait(500) -- Längere Wartezeit, wenn keine Lampe aktiv ist
|
|
end
|
|
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)
|