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 |
| `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 |
| `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**
| Option | Default | Bedeutung |
@@ -239,14 +243,12 @@ Effekte, Stärke, Verbrauchsaufschlag, Schaden. `enabled = false` schaltet es ga
### Die Grenze der Engine
Unabhängig von allem hier tötet **GTA selbst** ab einer bestimmten Tiefe über den
Wasserdruck — beim U-Boot liegt die Grenze bei rund 150 m mit Implosion ab ~168 m,
zu Fuß verliert man ebenfalls Leben. Dagegen hilft kein Atemgas, das ist die
Engine und nicht dieses Script.
Unabhängig von allem hier ist bei **160 m** Schluss — das macht GTA selbst über den
Wasserdruck, dagegen hilft kein Atemgas. Ingame gemessen.
Deshalb gibt es dafür nur eine Warnung (`engineDepthLimit`, konservativ auf 130 m),
und Trimix hört mit 100 m bewusst darüber auf. Der Bereich zwischen den beiden ist
die Zone, in der keine Ausrüstung mehr hilft.
Deshalb gibt es dafür nur eine Warnung (`engineDepthLimit`, 20 m vorher). Trimix
hört mit 100 m bewusst darüber auf; dazwischen liegt die Zone, in der es zwar
ungemütlich wird, aber noch nichts tödlich ist.
## Exports
@@ -272,11 +274,11 @@ IsScubaGearLightEnabled(ped) -- 0x88274C11CF0D866D
Die sitzt an der richtigen Stelle, leuchtet in Blickrichtung und braucht weder
Prop noch Offsets noch einen Draw-Thread.
> **Voraussetzung:** Die Lampe hängt an der echten **Scuba-Kleidung** des Peds
> (Component 8). Trägt der Spieler die nicht, tut die Native nichts. Diese
> Resource fasst das Outfit bewusst **nicht** an — das gehört ins Kleidungs-System.
> Beim Einschalten ohne passendes Outfit gibt es eine Meldung statt stiller Wirkungslosigkeit.
> Mit `debug = true` sagt `/divelampcheck`, ob das aktuelle Outfit eine Lampe hat.
Sie funktioniert **auch ohne Scuba-Kleidung** am Ped — ingame bestätigt. Der
Hinweis in [esx_scuba](https://github.com/wobozkyng/esx_scuba), das Licht hänge am
Kleidungs-Component, trifft hier also nicht zu. Das Outfit wird nicht angefasst.
Sollte die Native bei einem Ped-Model doch nicht anschlagen, gibt es beim
Einschalten eine Meldung, und `/divelampcheck` (mit `debug = true`) sagt es direkt.
Der Flag ist ein **lokaler** Ped-Zustand und wird nicht von selbst repliziert.
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
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
node ../.tools/lint.mjs # Lua-Lint, CfxLua-tauglich
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
-- Prop noch Offsets noch einen eigenen Draw-Thread.
--
-- WICHTIG: Die Lampe hängt an der echten Scuba-Kleidung des Peds (Component 8).
-- Trägt der Spieler die nicht, tut die Native nichts - dieses Script fasst das
-- Outfit bewusst nicht an.
-- 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
+3 -2
View File
@@ -204,8 +204,9 @@ local function setLamp(state, notifyIfUnavailable)
-- Lokal sofort setzen statt auf den Abgleich-Thread zu warten.
SetEnableScubaGearLight(cache.ped, state)
-- Die Spiel-Lampe hängt an der Scuba-Kleidung (Component 8). Fehlt die, tut
-- die Native nichts - ohne Hinweis sieht das nach einem kaputten Keybind aus.
-- Sicherheitsnetz: die Native greift normalerweise auch ohne Scuba-Kleidung,
-- 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
exports.qbx_core:Notify(locale('error.no_lamp_on_outfit'), 'error')
end
+7 -8
View File
@@ -76,10 +76,8 @@ return {
--- Tiefe, ab der das Spiel selbst den Spieler über den Wasserdruck tötet.
--- Dagegen hilft keine Flasche - das ist die Engine, nicht dieses Script.
--- Deshalb hier nur eine Warnung, kein eigener Effekt.
--- Referenz: das U-Boot geht bis ~150 m und implodiert ab ~168 m; zu Fuß
--- verliert man ebenfalls Leben, sobald es zu tief wird. Der Wert ist
--- bewusst konservativ - notfalls anpassen.
engineDepthLimit = 130.0,
--- 160 m ist ingame gemessen: darunter ist Schluss.
engineDepthLimit = 160.0,
engineWarnBeforeMeters = 20.0,
--- Stufen, sobald die Grenze überschritten ist. `over` = Meter unterhalb
@@ -114,7 +112,9 @@ return {
over = 20.0,
timecycle = 'drug_wobbly', strength = 1.0,
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 -
--- deshalb gibt es hier weder Offsets noch Farb- und Kegelwerte.
---
--- ACHTUNG: Sie hängt an der echten Scuba-Kleidung des Peds (Component 8).
--- Trägt der Spieler die nicht, passiert nichts. Diese Resource fasst das
--- Outfit bewusst nicht an - das macht bei Bedarf das Kleidungs-System.
--- Sie funktioniert auch ohne Scuba-Kleidung am Ped (ingame bestätigt), das
--- Outfit wird also nicht angefasst.
--- 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