feat: Warnung vor der Druck-Grenze der Engine
Lint / Lint Resource (push) Has been cancelled

GTA toetet selbst ab einer bestimmten Tiefe ueber den Wasserdruck - beim U-Boot
bei rund 150 m mit Implosion ab ~168 m, zu Fuss verliert man ebenfalls Leben.
Dagegen hilft kein Atemgas, das ist die Engine.

Deshalb dafuer nur eine Warnung statt eigener Effekte, konservativ auf 130 m mit
20 m Vorwarnung, beides in config.narcosis. Trimix hoert mit 100 m bewusst
darueber auf; dazwischen liegt die Zone, in der keine Ausruestung mehr hilft.

Der genaue Wert fuer Taucher zu Fuss ist nicht belegt und steht als Testpunkt in
TESTING.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 09:13:55 +02:00
co-authored by Claude Opus 5
parent e5f47610a1
commit f88f7bf002
6 changed files with 45 additions and 2 deletions
+13
View File
@@ -169,6 +169,8 @@ 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 |
| `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` |
**HUD** **HUD**
@@ -235,6 +237,17 @@ Effekte, Stärke, Verbrauchsaufschlag, Schaden. `enabled = false` schaltet es ga
> Die `timecycle`-Namen sind Spiel-Effekte, keine Natives. Existiert einer nicht, > Die `timecycle`-Namen sind Spiel-Effekte, keine Natives. Existiert einer nicht,
> passiert einfach nichts — dann einen anderen eintragen. > passiert einfach nichts — dann einen anderen eintragen.
### 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.
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.
## Exports ## Exports
```lua ```lua
+4
View File
@@ -70,6 +70,10 @@ kommt, in `config/client.lua` unter `narcosis.stages` einen anderen eintragen.*
- [ ] ❓ 🟡 Sterben im Tiefenrausch → Effekte weg, kein Timecycle bleibt hängen - [ ] ❓ 🟡 Sterben im Tiefenrausch → Effekte weg, kein Timecycle bleibt hängen
- [ ] ❓ 🟡 `ensure d4rk_divegear` im Tiefenrausch → Effekte weg - [ ] ❓ 🟡 `ensure d4rk_divegear` im Tiefenrausch → Effekte weg
- [ ] 🟢 Auswahlmenü zeigt Gas und Tiefengrenze pro Flasche - [ ] 🟢 Auswahlmenü zeigt Gas und Tiefengrenze pro Flasche
- [ ] ❓ 🟡 Auf ~110 m → Warnung „Lebensgefahr! Ab 130 m zerdrückt dich der
Wasserdruck." *Das ist die Engine-Grenze, dagegen hilft keine Flasche*
- [ ] ❓ 🟢 Prüfen, ab welcher Tiefe GTA tatsächlich Leben abzieht, und
`engineDepthLimit` darauf einstellen
- [ ] 🟢 `narcosis.enabled = false` → nichts davon passiert - [ ] 🟢 `narcosis.enabled = false` → nichts davon passiert
## 6 · HUD ## 6 · HUD
+15
View File
@@ -59,6 +59,7 @@ end
local narcosisStage = 0 local narcosisStage = 0
local narcosisWarned = false local narcosisWarned = false
local narcosisDamageBuffer = 0.0 local narcosisDamageBuffer = 0.0
local engineDepthWarned = false
--- Wie weit die aktuelle Tiefe unter der Grenze der getragenen Flasche liegt. --- Wie weit die aktuelle Tiefe unter der Grenze der getragenen Flasche liegt.
--- @return number Meter unterhalb der Grenze, negativ solange alles gut ist --- @return number Meter unterhalb der Grenze, negativ solange alles gut ist
@@ -251,6 +252,7 @@ local function removeGear(outOfAir, immediateSync)
warned = {} warned = {}
narcosisWarned = false narcosisWarned = false
narcosisDamageBuffer = 0.0 narcosisDamageBuffer = 0.0
engineDepthWarned = false
deleteGear() deleteGear()
disableScuba(outOfAir) disableScuba(outOfAir)
@@ -457,6 +459,19 @@ end
local function updateNarcosis(elapsed) local function updateNarcosis(elapsed)
if not config.narcosis.enabled then return end if not config.narcosis.enabled then return end
-- Die Engine tötet ab einer bestimmten Tiefe über den Wasserdruck. Dagegen hilft
-- kein Atemgas, deshalb warnt das hier unabhängig von der Flasche.
local engineWarnAt = config.narcosis.engineDepthLimit - config.narcosis.engineWarnBeforeMeters
if currentDepth >= engineWarnAt then
if not engineDepthWarned then
engineDepthWarned = true
exports.qbx_core:Notify(locale('error.crush_depth', math.floor(config.narcosis.engineDepthLimit)), 'error')
end
else
engineDepthWarned = false
end
local over = getDepthOverLimit() local over = getDepthOverLimit()
local stages = config.narcosis.stages local stages = config.narcosis.stages
local stage = 0 local stage = 0
+9
View File
@@ -73,6 +73,15 @@ return {
--- Wie viele Meter *vor* der Grenze schon gewarnt wird. --- Wie viele Meter *vor* der Grenze schon gewarnt wird.
warnBeforeMeters = 5.0, warnBeforeMeters = 5.0,
--- 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,
engineWarnBeforeMeters = 20.0,
--- Stufen, sobald die Grenze überschritten ist. `over` = Meter unterhalb --- Stufen, sobald die Grenze überschritten ist. `over` = Meter unterhalb
--- der maxDepth der Flasche. Es gilt jeweils die höchste erreichte Stufe, --- der maxDepth der Flasche. Es gilt jeweils die höchste erreichte Stufe,
--- die Reihenfolge muss also aufsteigend sein. --- die Reihenfolge muss also aufsteigend sein.
+2 -1
View File
@@ -7,7 +7,8 @@
"tank_empty": "Diese Tauchflasche ist leer!", "tank_empty": "Diese Tauchflasche ist leer!",
"tank_already_full": "Diese Tauchflasche ist bereits voll!", "tank_already_full": "Diese Tauchflasche ist bereits voll!",
"out_of_air": "Deine Luft ist alle! Sofort auftauchen!", "out_of_air": "Deine Luft ist alle! Sofort auftauchen!",
"no_lamp_on_outfit": "Deine Tauchausrüstung hat keine Lampe." "no_lamp_on_outfit": "Deine Tauchausrüstung hat keine Lampe.",
"crush_depth": "Lebensgefahr! Ab %d m zerdrückt dich der Wasserdruck."
}, },
"success": { "success": {
"took_out": "Du hast deine Ausrüstung abgelegt!", "took_out": "Du hast deine Ausrüstung abgelegt!",
+2 -1
View File
@@ -7,7 +7,8 @@
"tank_empty": "This air tank is empty!", "tank_empty": "This air tank is empty!",
"tank_already_full": "This air tank is already full!", "tank_already_full": "This air tank is already full!",
"out_of_air": "You're out of air! Surface now!", "out_of_air": "You're out of air! Surface now!",
"no_lamp_on_outfit": "Your diving suit doesn't have a lamp." "no_lamp_on_outfit": "Your diving suit doesn't have a lamp.",
"crush_depth": "Danger! Below %d m the water pressure will crush you."
}, },
"success": { "success": {
"took_out": "You've taken your gear off!", "took_out": "You've taken your gear off!",