local config = require 'config.client' -- Tauchlampe über die spieleigene Scuba-Lampe. -- -- GTA bringt seit v1493 (Cayo Perico) eine eigene Lampe an der Tauchausrüstung mit: -- SetEnableScubaGearLight(ped, toggle) 0xEE2476B9EE4A094F -- IsScubaGearLightEnabled(ped) 0x88274C11CF0D866D -- -- Die sitzt an der richtigen Stelle, leuchtet in Blickrichtung und braucht weder -- Prop noch Offsets noch einen eigenen Draw-Thread. -- -- Sie funktioniert auch ohne Scuba-Kleidung am Ped - ingame bestätigt. Der -- Hinweis in wobozkyng/esx_scuba, das Licht haenge am Kleidungs-Component, gilt -- fuer diesen Fall also nicht. -- -- Der Flag ist ein lokaler Ped-Zustand und wird nicht von selbst repliziert. -- Deshalb wie vorher der Umweg über den Statebag: jeder Client setzt den Flag für -- jeden Taucher in seiner Nähe selbst. local STATE_KEY = 'divelight' --- @param ped number --- @param enabled boolean local function applyLight(ped, enabled) if ped == 0 or not DoesEntityExist(ped) then return end -- Nur setzen wenn es sich tatsächlich ändert. Die Native ist billig, aber der -- Aufruf pro Ped und Durchlauf wäre trotzdem unnötig. if IsScubaGearLightEnabled(ped) == enabled then return end SetEnableScubaGearLight(ped, enabled) end --- Reagiert sofort auf Änderungen, auch von entfernten Spielern. AddStateBagChangeHandler(STATE_KEY, nil, function(bagName, _, value) local player = GetPlayerFromStateBagName(bagName) if player == 0 then return end applyLight(GetPlayerPed(player), value == true) end) --- Der Statebag-Handler allein reicht nicht: Peds werden beim Streaming neu --- erzeugt, beim Respawn ausgetauscht und beim Model-Wechsel ersetzt - der Flag --- ist dann wieder weg, ohne dass sich der Statebag geändert hat. Deshalb --- regelmäßig nachziehen. CreateThread(function() while true do local players = GetActivePlayers() for i = 1, #players do local player = players[i] local state = Player(GetPlayerServerId(player)).state applyLight(GetPlayerPed(player), state and state[STATE_KEY] == true) end Wait(config.lampReconcileIntervalMs) end end)