fix: Erkenntnisse aus dem Ingame-Test

- 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>
This commit is contained in:
2026-08-11 09:42:08 +02:00
co-authored by Claude Opus 5
parent 7c4004a378
commit 64b2549cf9
5 changed files with 31 additions and 57 deletions
-31
View File
@@ -1,31 +0,0 @@
name: Lint
on:
push:
paths:
- '**.lua'
- '.github/workflows/lint.yml'
pull_request_target:
paths:
- '**.lua'
- '.github/workflows/lint.yml'
jobs:
lint:
name: Lint Resource
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Lint
uses: iLLeniumStudios/fivem-lua-lint-action@v2
with:
capture: "junit.xml"
args: "-t --formatter JUnit"
extra_libs: ox_lib+mysql+qblocales+qbox+qbox_playerdata+qbox_lib
- name: Generate Lint Report
if: always()
uses: mikepenz/action-junit-report@v4
with:
report_paths: "**/junit.xml"
check_name: Linting Report
fail_on_failure: false
+18 -13
View File
@@ -169,10 +169,14 @@ FiveM* umlegbar.
|---|---|---| |---|---|---|
| `enabled` | `true` | Komplett abschaltbar | | `enabled` | `true` | Komplett abschaltbar |
| `warnBeforeMeters` | `5.0` | Vorwarnung so viele Meter vor der Grenze | | `warnBeforeMeters` | `5.0` | Vorwarnung so viele Meter vor der Grenze |
| `engineDepthLimit` | `130.0` | Tiefe, ab der **das Spiel selbst** über den Wasserdruck tötet — dagegen hilft keine Flasche | | `engineDepthLimit` | `160.0` | Tiefe, ab der **das Spiel selbst** Schluss macht — ingame gemessen, dagegen hilft keine Flasche |
| `engineWarnBeforeMeters` | `20.0` | Vorwarnung davor | | `engineWarnBeforeMeters` | `20.0` | Vorwarnung davor |
| `stages` | 3 Stufen | Pro Stufe: `over` (Meter unter der Grenze), `timecycle` + `strength`, `shake` + `shakeIntensity`, `drainFactor`, `damagePerTick` | | `stages` | 3 Stufen | Pro Stufe: `over` (Meter unter der Grenze), `timecycle` + `strength`, `shake` + `shakeIntensity`, `drainFactor`, `damagePerTick` |
`damagePerTick` steht überall auf `0` — Tiefenrausch kostet also erstmal nur Sicht,
Kontrolle und Luft, kein Leben. Wer es härter will, setzt es in der letzten Stufe
auf z.B. `2`.
**HUD** **HUD**
| Option | Default | Bedeutung | | Option | Default | Bedeutung |
@@ -239,14 +243,12 @@ Effekte, Stärke, Verbrauchsaufschlag, Schaden. `enabled = false` schaltet es ga
### Die Grenze der Engine ### Die Grenze der Engine
Unabhängig von allem hier tötet **GTA selbst** ab einer bestimmten Tiefe über den Unabhängig von allem hier ist bei **160 m** Schluss — das macht GTA selbst über den
Wasserdruck — beim U-Boot liegt die Grenze bei rund 150 m mit Implosion ab ~168 m, Wasserdruck, dagegen hilft kein Atemgas. Ingame gemessen.
zu Fuß verliert man ebenfalls Leben. Dagegen hilft kein Atemgas, das ist die
Engine und nicht dieses Script.
Deshalb gibt es dafür nur eine Warnung (`engineDepthLimit`, konservativ auf 130 m), Deshalb gibt es dafür nur eine Warnung (`engineDepthLimit`, 20 m vorher). Trimix
und Trimix hört mit 100 m bewusst darüber auf. Der Bereich zwischen den beiden ist hört mit 100 m bewusst darüber auf; dazwischen liegt die Zone, in der es zwar
die Zone, in der keine Ausrüstung mehr hilft. ungemütlich wird, aber noch nichts tödlich ist.
## Exports ## Exports
@@ -272,11 +274,11 @@ IsScubaGearLightEnabled(ped) -- 0x88274C11CF0D866D
Die sitzt an der richtigen Stelle, leuchtet in Blickrichtung und braucht weder Die sitzt an der richtigen Stelle, leuchtet in Blickrichtung und braucht weder
Prop noch Offsets noch einen Draw-Thread. Prop noch Offsets noch einen Draw-Thread.
> **Voraussetzung:** Die Lampe hängt an der echten **Scuba-Kleidung** des Peds Sie funktioniert **auch ohne Scuba-Kleidung** am Ped — ingame bestätigt. Der
> (Component 8). Trägt der Spieler die nicht, tut die Native nichts. Diese Hinweis in [esx_scuba](https://github.com/wobozkyng/esx_scuba), das Licht hänge am
> Resource fasst das Outfit bewusst **nicht** an — das gehört ins Kleidungs-System. Kleidungs-Component, trifft hier also nicht zu. Das Outfit wird nicht angefasst.
> Beim Einschalten ohne passendes Outfit gibt es eine Meldung statt stiller Wirkungslosigkeit. Sollte die Native bei einem Ped-Model doch nicht anschlagen, gibt es beim
> Mit `debug = true` sagt `/divelampcheck`, ob das aktuelle Outfit eine Lampe hat. Einschalten eine Meldung, und `/divelampcheck` (mit `debug = true`) sagt es direkt.
Der Flag ist ein **lokaler** Ped-Zustand und wird nicht von selbst repliziert. Der Flag ist ein **lokaler** Ped-Zustand und wird nicht von selbst repliziert.
Deshalb läuft der Zustand über einen Statebag Deshalb läuft der Zustand über einen Statebag
@@ -287,6 +289,9 @@ Respawn und Model-Wechsel neu erzeugt werden und den Flag dabei verlieren.
## Entwicklung ## Entwicklung
Es gibt bewusst keine CI: die Workflows aus dem Original liefen gegen Qbox'
Discord und GitHub-Releases, und Linting passiert lokal vor dem Commit.
```bash ```bash
node ../.tools/lint.mjs # Lua-Lint, CfxLua-tauglich node ../.tools/lint.mjs # Lua-Lint, CfxLua-tauglich
node ../.tools/nui-preview.mjs nui # HUD im Browser anschauen node ../.tools/nui-preview.mjs nui # HUD im Browser anschauen
+3 -3
View File
@@ -9,9 +9,9 @@ local config = require 'config.client'
-- Die sitzt an der richtigen Stelle, leuchtet in Blickrichtung und braucht weder -- Die sitzt an der richtigen Stelle, leuchtet in Blickrichtung und braucht weder
-- Prop noch Offsets noch einen eigenen Draw-Thread. -- Prop noch Offsets noch einen eigenen Draw-Thread.
-- --
-- WICHTIG: Die Lampe hängt an der echten Scuba-Kleidung des Peds (Component 8). -- Sie funktioniert auch ohne Scuba-Kleidung am Ped - ingame bestätigt. Der
-- Trägt der Spieler die nicht, tut die Native nichts - dieses Script fasst das -- Hinweis in wobozkyng/esx_scuba, das Licht haenge am Kleidungs-Component, gilt
-- Outfit bewusst nicht an. -- fuer diesen Fall also nicht.
-- --
-- Der Flag ist ein lokaler Ped-Zustand und wird nicht von selbst repliziert. -- 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 -- Deshalb wie vorher der Umweg über den Statebag: jeder Client setzt den Flag für
+3 -2
View File
@@ -204,8 +204,9 @@ local function setLamp(state, notifyIfUnavailable)
-- Lokal sofort setzen statt auf den Abgleich-Thread zu warten. -- Lokal sofort setzen statt auf den Abgleich-Thread zu warten.
SetEnableScubaGearLight(cache.ped, state) SetEnableScubaGearLight(cache.ped, state)
-- Die Spiel-Lampe hängt an der Scuba-Kleidung (Component 8). Fehlt die, tut -- Sicherheitsnetz: die Native greift normalerweise auch ohne Scuba-Kleidung,
-- die Native nichts - ohne Hinweis sieht das nach einem kaputten Keybind aus. -- aber falls sie bei einem Ped-Model doch nicht anschlägt, ist eine Meldung
-- besser als ein scheinbar kaputter Keybind.
if state and notifyIfUnavailable and not IsScubaGearLightEnabled(cache.ped) then if state and notifyIfUnavailable and not IsScubaGearLightEnabled(cache.ped) then
exports.qbx_core:Notify(locale('error.no_lamp_on_outfit'), 'error') exports.qbx_core:Notify(locale('error.no_lamp_on_outfit'), 'error')
end end
+7 -8
View File
@@ -76,10 +76,8 @@ return {
--- Tiefe, ab der das Spiel selbst den Spieler über den Wasserdruck tötet. --- Tiefe, ab der das Spiel selbst den Spieler über den Wasserdruck tötet.
--- Dagegen hilft keine Flasche - das ist die Engine, nicht dieses Script. --- Dagegen hilft keine Flasche - das ist die Engine, nicht dieses Script.
--- Deshalb hier nur eine Warnung, kein eigener Effekt. --- Deshalb hier nur eine Warnung, kein eigener Effekt.
--- Referenz: das U-Boot geht bis ~150 m und implodiert ab ~168 m; zu Fuß --- 160 m ist ingame gemessen: darunter ist Schluss.
--- verliert man ebenfalls Leben, sobald es zu tief wird. Der Wert ist engineDepthLimit = 160.0,
--- bewusst konservativ - notfalls anpassen.
engineDepthLimit = 130.0,
engineWarnBeforeMeters = 20.0, engineWarnBeforeMeters = 20.0,
--- Stufen, sobald die Grenze überschritten ist. `over` = Meter unterhalb --- Stufen, sobald die Grenze überschritten ist. `over` = Meter unterhalb
@@ -114,7 +112,9 @@ return {
over = 20.0, over = 20.0,
timecycle = 'drug_wobbly', strength = 1.0, timecycle = 'drug_wobbly', strength = 1.0,
shake = 'DRUNK_SHAKE', shakeIntensity = 0.8, shake = 'DRUNK_SHAKE', shakeIntensity = 0.8,
drainFactor = 3.0, damagePerTick = 2 -- Schaden bewusst auf 0: erstmal nur Effekte und höherer
-- Verbrauch. Auf z.B. 2 setzen, wenn es härter sein soll.
drainFactor = 3.0, damagePerTick = 0
}, },
}, },
}, },
@@ -135,9 +135,8 @@ return {
--- v1493). Sie sitzt an der richtigen Stelle und leuchtet in Blickrichtung - --- v1493). Sie sitzt an der richtigen Stelle und leuchtet in Blickrichtung -
--- deshalb gibt es hier weder Offsets noch Farb- und Kegelwerte. --- deshalb gibt es hier weder Offsets noch Farb- und Kegelwerte.
--- ---
--- ACHTUNG: Sie hängt an der echten Scuba-Kleidung des Peds (Component 8). --- Sie funktioniert auch ohne Scuba-Kleidung am Ped (ingame bestätigt), das
--- Trägt der Spieler die nicht, passiert nichts. Diese Resource fasst das --- Outfit wird also nicht angefasst.
--- Outfit bewusst nicht an - das macht bei Bedarf das Kleidungs-System.
--- Wie oft der Lampen-Zustand auf die Peds in der Nähe nachgezogen wird (ms). --- Wie oft der Lampen-Zustand auf die Peds in der Nähe nachgezogen wird (ms).
--- Nötig, weil Peds beim Streaming, Respawn und Model-Wechsel neu erzeugt --- Nötig, weil Peds beim Streaming, Respawn und Model-Wechsel neu erzeugt