- Die Scuba-Lampe funktioniert auch OHNE Scuba-Kleidung am Ped. Meine Annahme aus esx_scuba, das Licht haenge am Kleidungs-Component 8, trifft hier nicht zu - Kommentare und README entsprechend korrigiert. Die Meldung beim Einschalten bleibt als Sicherheitsnetz fuer Ped-Models, bei denen die Native doch nicht anschlaegt - engineDepthLimit auf 160 m, ingame gemessen statt konservativ geschaetzt - damagePerTick ueberall auf 0: Tiefenrausch kostet erstmal nur Sicht, Kontrolle und Luft, kein Leben. In der letzten Stufe wieder aktivierbar - .github entfernt: die Workflows kamen aus dem Original, liefen gegen Qbox' Discord und GitHub-Releases und haetten auf Gitea nur ins Leere gefeuert. Gelintet wird lokal ueber .tools/lint.mjs Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
61 lines
2.2 KiB
Lua
61 lines
2.2 KiB
Lua
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)
|