Commit Graph
88 Commits
Author SHA1 Message Date
D4rkst3randClaude Opus 5 d59abe8d55 fix(client): Absturz im updateInventory-Handler beim Ablegen
attempt to index a nil value (local 'expected')

Die Pruefung stand vor dem CreateThread, der Block laeuft aber erst im naechsten
Tick - bis dahin war activeTank schon nil. Ausgeloest hat es das Ablegen selbst:
removeGear sichert die Restluft, das ist eine Inventar-Aenderung, die feuert
updateInventory, und der Thread lief in die abgeraeumte Ausruestung.

Die Pruefung wiederholt sich jetzt innerhalb des Threads. Alle uebrigen
activeTank-Zugriffe wurden gegengeprueft: entweder ohne Yield hinter ihrer
Pruefung oder bereits abgesichert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:36:58 +02:00
D4rkst3randClaude Opus 5 08f8f34b31 docs: Referenz ins Wiki, README entschlankt
Die README war auf 300 Zeilen gewachsen und enthielt die komplette
Config-Referenz, alle Item-Tabellen und drei Erklaerkapitel. Das gehoert ins
Wiki, wo es sich navigieren laesst.

Neun Wiki-Seiten angelegt: Home, Installation, Items, Bedienung, Konfiguration,
Tiefe und Atemgas, Lampe, Exports, Entwicklung. Jede mit Navigationsleiste.

README behaelt, was jemand in den ersten dreissig Sekunden braucht: was es ist,
ein Bild, die Features, die Abhaengigkeiten, drei Installationsschritte und die
Wegweiser. Von 300 auf 65 Zeilen.

ENTSCHEIDUNGEN.md bleibt bewusst im Repo statt im Wiki - es erklaert, warum der
Code so aussieht, und gehoert damit neben den Code und in dessen Historie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:29:15 +02:00
D4rkst3randClaude Opus 5 0f4754a3e8 docs: Versionsparameter an den HUD-Bildern
Gleicher Dateiname bei neuem Inhalt bleibt im Browser-Cache haengen - beim
Layout-Wechsel sah man weiter die alte Zweispalten-Version. Der Parameter
erzwingt einen frischen Abruf. Bei der naechsten Layout-Aenderung mitziehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:20:03 +02:00
D4rkst3randClaude Opus 5 1ed6a924f8 chore: aufgeraeumt nach der Abnahme
Lampen-Prop entfernt. Seit der Umstellung auf die spieleigene Scuba-Lampe war es
funktionslos: standardmaessig aus, nie verifiziert, und eine Polizei-Taschenlampe
am Kopf haette neben dem nativen Licht nur Deko gespielt. Damit fallen auch die
Debug-Befehle /divelamp und /divelampcheck weg, samt config.debug und vier
Config-Werten.

Zwoelf Upstream-Locales geloescht. Sie hatten 8 von 26 Keys - im Spiel waeren
dort rohe Key-Namen erschienen. Gepflegt werden DE und EN.

PLAN.md war ein Vorab-Plan mit Phasen und Aufwandsschaetzungen und damit
erledigt. Ersetzt durch ENTSCHEIDUNGEN.md: warum die Dinge so gebaut sind und
welche Fallstricke dahinterstecken - onCache-Timing, consume, decay,
SetMetadata, die Atemgas-Grenze, das transform-origin am Zeiger. Also das, was
beim naechsten Anfassen wirklich hilft.

README von den Abschnitten befreit, die es nicht mehr gibt. Bilder und Icons neu
erzeugt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:16:04 +02:00
D4rkst3randClaude Opus 5 a49e6d0f6a fix: weggegebene Ausruestung beendet den Tauchgang
Gleiche Bug-Klasse wie bei der Flasche, nur hatte mein Fix davor ausschliesslich
die Flasche geprueft: wer diving_gear im Tauchgang weggab, blieb ausgeruestet
und atmete weiter.

Die Besitzpruefung deckt jetzt beides ab. verifyTank heisst verifyGear und gibt
{ gear, tank } zurueck - fehlt eines von beidem, kommt die Ausruestung ab, mit
der passenden Meldung. Umsortieren im Inventar bindet weiterhin nur auf den
neuen Slot um.

Die Item-Namen stehen jetzt als gearItem/fillItem in config/shared.lua, statt
verteilt als Zeichenketten im Server-Code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:08:00 +02:00
D4rkst3randClaude Opus 5 fcca73bc7a fix: weggegebene Flasche beendet den Tauchgang + HUD-Feinschliff
Bug: wer die getragene Flasche im Tauchgang weggab, konnte unbegrenzt
weiteratmen. Der Client hielt nur eine Slot-Nummer, die niemand mehr
gegenpruefte, und der Sync lief ins Leere. ox_inventory feuert clientseitig bei
jeder Inventar-Aenderung - dort wird jetzt beim Server nachgefragt. Ist die
Flasche weg, kommt die Ausruestung ab; wurde sie nur umsortiert, bindet der
Client auf den neuen Slot um, damit Aufraeumen im Inventar nichts kostet.

HUD:
- Werte aus den Uhren heraus in eine zweite Zeile: Druck, Lampe und Tiefe
  liegen jetzt auf einer Linie. In der Skala kollidierte die Zahl mit
  Strichen, Zeiger und rotem Bereich
- Skaliert mit der Bildschirmhoehe (entworfen auf 1080p), sonst waere das in
  festen Pixeln gebaute HUD auf 1440p und 4K deutlich zu klein.
  config.hudScale kommt als Geschmacksregler obendrauf
- Zustandsklassen sitzen jetzt am HUD statt an den Uhren, weil Instrument und
  Wert in getrennten Grid-Zellen liegen

README-Renderings nachgezogen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:04:08 +02:00
D4rkst3randClaude Opus 5 30c40c9f69 feat(hud): Dreier-Konsole mit Finimeter und Tiefenmesser
Statt zweier Zahlenfelder jetzt zwei Zeigerinstrumente links und rechts vom
Luft-Ring - wie eine echte Tauchkonsole. Der Ring bleibt in der Mitte, weil die
Restzeit die Zahl ist, auf die es ankommt.

- Finimeter 0-300 bar, roter Bereich = Reserve unter reservePressure
- Tiefenmesser 0-depthDialMax, roter Bereich = Tiefengrenze des Atemgases. Der
  faengt bei Pressluft bei 45 m an und bei Trimix erst bei 100 m - der
  Gefahrenbereich haengt also an der getragenen Flasche. Gibt es real nicht,
  hilft im Spiel aber sofort beim Einschaetzen
- Skalenzahlen bewusst weggelassen: bei 96 px kollidieren sie mit allem und
  liest ohnehin niemand. Zeiger zeigt die Tendenz, die Zahl in der Uhr den Wert
- Zeiger und Wert faerben sich rot, sobald der rote Bereich erreicht ist

Beim Bauen gefunden: CSS transform-origin auf dem Zeiger wird zusaetzlich zum
rotate(winkel 50 50) im Attribut angewendet, der Drehpunkt wandert dadurch
doppelt und der Zeiger landet ausserhalb der Uhr. transform-origin ist raus.

README-Renderings auf die Konsole umgebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:55:45 +02:00
D4rkst3randClaude Opus 5 64b2549cf9 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>
2026-08-11 09:42:08 +02:00
D4rkst3randClaude Opus 5 7c4004a378 docs: Testliste durch Issues ersetzt
TESTING.md war nicht filterbar, nicht zuweisbar und haette neben den Issues als
zweite Quelle gedriftet. Jetzt ein Issue pro Testbereich mit Labels (test,
prio:kritisch/mittel/niedrig, ungeprueft), plus bug und doku fuer spaeter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:20:27 +02:00
D4rkst3randClaude Opus 5 f88f7bf002 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>
2026-08-11 09:13:55 +02:00
D4rkst3randClaude Opus 5 e5f47610a1 feat: Tiefengrenze ueber das Atemgas
Lint / Lint Resource (push) Has been cancelled
Macht ein Tiefenlimit mechanisch statt zur Absprache - und oeffnet die tiefen
Spots fuer den, der die richtige Flasche dabei hat.

Der Grund fuer die realen 40-45 m ist nicht der Druck, sondern der Stickstoff in
der Pressluft: tiefer wirkt er narkotisch, ab ~56 m wird auch der Sauerstoff
giftig. Wer tiefer will, atmet Trimix, wo Helium einen Teil des Stickstoffs
ersetzt. Genau so umgesetzt:

- maxDepth und gas pro Flasche in config/shared.lua; Pressluft 45 m,
  neues diving_tank_trimix 100 m
- Darunter Tiefenrausch in drei Stufen: Bildschirmeffekt, Kamerawackeln,
  hoeherer Luftverbrauch, in der letzten Stufe Schaden. Schwellen, Effekte,
  Staerken und Schaden komplett in config.narcosis
- Vorwarnung 5 m vor der Grenze, Tiefenanzeige im HUD wird rot und pulsiert
- Effekte werden beim Auftauchen, Ablegen, Tod und Resource-Stop aufgeraeumt
- Auswahlmenue zeigt Gas und Tiefengrenze pro Flasche
- Icon fuer die Trimix-Flasche, violett abgesetzt

Keine Dekompression - auf Wunsch bewusst weggelassen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:11:12 +02:00
D4rkst3randClaude Opus 5 e8ffe8870d docs: README an die neuen Defaults angepasst
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:02:54 +02:00
D4rkst3randClaude Opus 5 d296aca2f8 feat(hud): Anzeige schon an Land, Tiefenverbrauch per Default aus
Lint / Lint Resource (push) Has been cancelled
- hudOnlyUnderwater = false: das HUD ist sichtbar sobald die Ausruestung
  angelegt ist, nicht erst unter Wasser. Damit laesst sich der Flaschendruck
  am Finimeter ablesen, ohne das Inventar zu oeffnen
- depthDecayEnabled = false: die angegebenen 5/10/15/20 Minuten stimmen damit
  exakt und bleiben fuer Spieler berechenbar

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:02:37 +02:00
D4rkst3randClaude Opus 5 da0e43a1fd docs: Testliste
Nach Bereichen gruppiert, mit Prioritaet und Kennzeichnung dessen, was ohne
laufendes Spiel gar nicht pruefbar war (Scuba-Lampe, IsHudHidden, Sync zu
zweit). Abgehakt ist nur, was tatsaechlich lief.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:58:01 +02:00
D4rkst3randClaude Opus 5 edeb8d9d76 docs: Stand nach dem Ingame-Test nachgezogen
Die Lampen-Phase im Plan beschrieb noch den DrawSpotLight-Eigenbau, und die
offenen Punkte listeten Unsicherheiten (Prop-Name, Leuchtrichtung), die mit der
Umstellung auf die native Scuba-Lampe hinfaellig sind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:54:12 +02:00
D4rkst3randClaude Opus 5 d2f6e3cd30 feat(light): auf die spieleigene Scuba-Lampe umgestellt
Lint / Lint Resource (push) Has been cancelled
GTA bringt seit v1493 eine eigene Lampe an der Tauchausruestung 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 Draw-Thread. Damit faellt der komplette
DrawSpotLight-Aufbau weg: Kegelwerte, Farbe, Schatten, Distanzfilter,
Lichter-Limit, die bone-relative Richtungsrechnung und das Sortieren der
Kandidaten pro Frame. client/light.lua schrumpft von ~110 auf ~55 Zeilen.

Gefunden ueber wobozkyng/esx_scuba.

- Der Flag ist ein lokaler Ped-Zustand, der Statebag bleibt also. Gesetzt wird
  er per AddStateBagChangeHandler und zusaetzlich alle 500ms nachgezogen, weil
  Peds beim Streaming, Respawn und Model-Wechsel neu erzeugt werden
- Die Lampe haengt an der Scuba-Kleidung (Component 8). Das Outfit wird bewusst
  nicht angefasst; wer sie nicht traegt, bekommt beim Einschalten eine Meldung
  statt stiller Wirkungslosigkeit
- /divelampcheck sagt, ob das aktuelle Outfit eine Lampe hat
- Prop ist jetzt optional und per Default aus

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:45:02 +02:00
D4rkst3randClaude Opus 5 037acf1bfe fix(light): Lampen-Sitz konfigurierbar + Debug-Befehle
Lint / Lint Resource (push) Has been cancelled
Offset und Rotation des Lampen-Props waren hart im Code, und die Rotation
(180, 90, 0) war stumpf von der Maske uebernommen - daher stand die Lampe quer
im Gesicht. d4rk_phone haengt sein Prop mit komplett null Offset und Rotation
an, das ist der bessere Ausgangspunkt.

- lampBone, lampPropOffset, lampPropRotation in die Config; Prop und Licht
  haengen jetzt am selben Bone, damit der Strahl aus der Lampe kommt
- lampProp = '' erlaubt, dann nur Licht ohne Prop
- Lichtwerte (Farbe, Reichweite, Helligkeit, Kegel) aus d4rk_phone uebernommen
  statt neu geraten; lampShadows wie dort auf false
- /divelamp und /divelight stellen beides im laufenden Spiel ein und geben die
  Config-Zeile zum Uebernehmen aus (config.debug)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:41:22 +02:00
D4rkst3randClaude Opus 5 043450c54c fix(items): consume entfernt - diving_gear reagierte nicht auf Benutzen
Lint / Lint Resource (push) Has been cancelled
ox_inventory ruft den qbx-Useable-Item-Callback nur auf, wenn consume nicht
gesetzt ist (server.lua):

    elseif consume then                              -- interner Pfad
    elseif not item.weapon and server.UseItem then   -- hier erst CreateUseableItem

In Lua ist 0 wahr, das consume = 0 aus dem Snippet landete also im ersten Zweig.
server.UseItem wurde nie erreicht, beim Benutzen passierte gar nichts - ohne
Fehlermeldung. Das Original hatte kein consume.

consume ist jetzt bei allen sechs Items raus, mit Kommentar im Snippet, damit es
nicht wieder reinwandert. Steht so nicht in der ox-Doku, nur im Quellcode.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:20:01 +02:00
D4rkst3randClaude Opus 5 3ab70d44ef fix(server): frisch gekaufte Flaschen sind nicht mehr leer
Lint / Lint Resource (push) Has been cancelled
Eine Flasche ohne gesetzte Metadata - aus dem Shop, per AddItem oder per
Admin-Befehl - wurde in getTankList als 0 gelesen. Anlegen scheiterte damit an
"Diese Tauchflasche ist leer!", man haette also erst eine Kartusche verbrauchen
muessen, um ueberhaupt tauchen zu koennen.

Dazu waren sich die beiden Codepfade uneinig: syncTank hat denselben Fall auf
capacity zurueckfallen lassen, also als voll behandelt.

Beide gehen jetzt ueber readOxygen(), gesteuert von shared.newTanksFull
(default true = neue Flasche ist voll).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 00:31:37 +02:00
D4rkst3randClaude Opus 5 c264872007 docs: Herkunft der Items in der README festgehalten
diving_gear und diving_fill stammen aus dem Original (Diving Gear / Diving
Tube), neu sind nur die vier Flaschen. Im Original gab es keine
Sauerstoffflasche als Item - die Luft hing an gar nichts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 00:29:55 +02:00
D4rkst3randClaude Opus 5 0d538157f9 chore: versehentlich committete Testdateien entfernt
t1/t2.svg waren ein Minimaltest fuer die librsvg-Warnung und sind durch ein
fehlgeschlagenes cd in den Temp-Ordner im Repo gelandet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 00:25:54 +02:00
D4rkst3randClaude Opus 5 6432550f68 feat(icons): Item-Icons fuer alle sechs Items
Lint / Lint Resource (push) Has been cancelled
128x128 PNG mit transparentem Hintergrund, aus SVG-Quellen per ImageMagick
(librsvg) erzeugt und damit reproduzierbar statt handgemalt.

- Tauchmaske, quer liegende Pressluft-Kartusche mit Manometer, drei
  Einzelflaschen und die Doppelflasche fuer XL
- Laufzeit als Zahl auf dem Farbband: ohne die waren die Einzelflaschen bei
  Slot-Groesse nur noch an der Bandfarbe zu unterscheiden, im 56px-Test gar
  nicht mehr
- Kartusche bewusst liegend statt hochkant, damit sie sich von den Flaschen
  abhebt - die erste Fassung las sich wie eine Flasche mit Download-Pfeil
- client.image faellt weg: ox_inventory laedt <imagepath>/<itemname>.png, und
  die Dateien heissen genau wie die Items

gen-icons.mjs schreibt zusaetzlich ein Kontrollblatt (Schachbrett, Slot-Groesse,
klein), mit dem die Icons gegengeprueft wurden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 00:25:39 +02:00
D4rkst3randClaude Opus 5 ce0f693266 docs: vollstaendige README mit HUD-Renderings, Luft-Ring mittig
Lint / Lint Resource (push) Has been cancelled
HUD-Layout symmetrisch: Tiefe links, Luft-Ring mittig, Druck rechts, Lampe
zentriert darunter. Umgestellt auf Grid, damit die drei Werte garantiert auf
einer Mittelachse sitzen und die Lampen-Leiste ohne Ausgleichs-Margins in einer
zweiten Zeile haengt.

README:
- Drei HUD-Renderings (normal, Warnung, kritisch) als SVG. Keine In-Game-Bilder -
  hier laeuft kein GTA -, sondern massstabsgetreu aus denselben Werten wie
  style.css erzeugt, per docs/gen-hud-svg.mjs reproduzierbar
- Vollstaendige Config-Referenz fuer client.lua und shared.lua
- Item-Tabelle mit Laufzeit, Fuelldruck, Gewicht, dazu die Metadata-Keys und
  warum kein decay gesetzt werden darf
- Installation, Bedienung, Exports, Balancing-Hinweis
- Bekannte Unsicherheiten offen benannt

Item-Snippet mit klarem Copy-Paste-Header. Bewusst keine fertige items.lua zum
Ersetzen: die wuerde die restlichen Items des Servers mitloeschen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 00:13:06 +02:00
D4rkst3randClaude Opus 5 5a59fc513f feat(hud): Manometer in bar und ausblendbares HUD
Lint / Lint Resource (push) Has been cancelled
Druckanzeige:
- pressure * (Restluft / capacity). Bei konstantem Volumen ist der Druck
  proportional zur verbliebenen Gasmenge, die lineare Abbildung stimmt also
- Fuelldruck pro Flasche in config/shared.lua, alle bei 300 bar. Dass die grosse
  Flasche denselben Druck zeigt wie die kleine ist gewollt - in echt macht das
  Volumen die Laufzeit, nicht der Druck
- Unter config.reservePressure (50 bar) rot: in der Tauchpraxis die Schwelle,
  ab der man den Aufstieg einleitet

HUD ausblenden fuer Unterwasser-Screenshots. qbx_core hat selbst keinen
HUD-Toggle, es feuert nur hud:client:* an eine separate HUD-Resource - deshalb
drei voneinander unabhaengige Wege:
- IsHudHidden() folgen, greift bei allem was DisplayHud(false) setzt
- eigene Taste, standardmaessig unbelegt
- Export setHudVisible(bool) / isHudVisible() fuer andere Resources

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 00:06:58 +02:00
D4rkst3randClaude Opus 5 e5af47da66 docs: README auf den Fork umgeschrieben
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:57:22 +02:00
D4rkst3randClaude Opus 5 d9643620ff feat(light): gesyncte Tauchlampe
Lint / Lint Resource (push) Has been cancelled
Licht ist in GTA nie synchronisiert - DrawSpotLight zeichnet nur lokal fuer den
aktuellen Frame. "Gesynct" heisst deshalb: der Zustand wird als Statebag
repliziert und jeder Client zeichnet die Lampen aller Taucher in seiner Naehe
selbst. Muster uebernommen aus d4rk_phone (Statebag, adaptives Polling,
Distanzfilter).

client/light.lua ist ein reiner Renderer ohne gemeinsamen Zustand mit main.lua -
er kommt mit dem Statebag allein aus und kennt weder Ausruestung noch Flasche.

- Richtung ueber zwei bone-relative Punkte am Kopf-Bone statt ueber
  GetEntityForwardVector: beim Tauchen liegt der Ped waagerecht im Wasser, der
  Entity-Forward wuerde stur horizontal leuchten. Die Offsets von
  GetPedBoneCoords sind laut Native-Doku "relative to the bone's rotation",
  die Differenz zweier solcher Punkte enthaelt also den Pitch
- Toggle per lib.addKeybind, Standard L, vom Spieler umlegbar
- Distanzfilter und Limit auf die naechsten N Lampen, Schatten abschaltbar
- Prop-Model wird vorher mit IsModelValid geprueft: lib.requestModel wirft bei
  ungueltigen Models einen Error, der sonst die ganze Ausruestung lahmlegt
- Lampen-Status im HUD

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:56:40 +02:00
D4rkst3randClaude Opus 5 28ab8e796c feat(hud): NUI-Overlay mit Luft und Tauchtiefe
Lint / Lint Resource (push) Has been cancelled
Ersetzt die qbx.drawText2d-Anzeige (rohe Zahl plus Uhr-Emoji in der Ecke, jeden
Frame neu gezeichnet) durch ein NUI-Overlay.

- Luft als Ring mit mm:ss, Farbstufen aus config.warnAtSeconds abgeleitet,
  Pulsieren im kritischen Bereich
- Tiefe in Metern ueber GetWaterHeight, geglaettet damit Wellengang die Zahl
  nicht zappeln laesst; Einfaerbung ab config.deepWarningDepth
- Platz fuer den Lampen-Status, wird in Phase 5 befuellt
- Sichtbar nur mit angelegter Ausruestung unter Wasser, mit Fade
- Updates gedrosselt auf 4/s statt jeden Frame
- Kein backdrop-filter (bekannter FiveM-Bug)

Die geglaettete Tiefe speist auch den tiefenabhaengigen Verbrauch, der bisher
bei jedem Tick neu und ungeglaettet gemessen wurde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:49:03 +02:00
D4rkst3randClaude Opus 5 d661152bc9 feat: Flaschengroessen mit echter Laufzeit und persistenter Restluft
Lint / Lint Resource (push) Has been cancelled
Der Sauerstoff war eine lokale Client-Variable: nicht persistent, an kein Item
gebunden, weg bei Relog. Dazu ergab startingOxygenLevel=100 bei decayRate=1/s
genau 100 Sekunden Tauchzeit statt Minuten.

Sauerstoff-Logik:
- Restsekunden statt Punkte, Verbrauch ueber GetGameTimer-Delta statt gezaehlter
  Wait(1000) - ein Tick laeuft unter Last laenger als eine Sekunde, was sich
  ueber einen langen Tauchgang aufsummiert
- Float-Vergleiche (oxygenLevel % 10 == 0, == 0) raus, Warnschwellen als
  config.warnAtSeconds, jede Schwelle einmal pro Tauchgang
- Verbrauch steigt mit der Tiefe (1 + tiefe/30, gedeckelt), abschaltbar
- Anzeige als mm:ss

Flaschen:
- Vier Items mit capacity in Sekunden (300/600/900/1200) in config/shared.lua
- Restluft in metadata.oxygen, Fuellstand zusaetzlich in metadata.durability,
  damit der Balken direkt im Inventar-Slot sichtbar ist
- Kein decay auf den Items: ox_inventory loescht sonst die leere Flasche
- Auswahlmenue beim Anlegen und Auffuellen (entfaellt bei nur einer Flasche)
- diving_fill fuellt bis capacity statt auf einen Fixwert, verweigert volle
  Flaschen und verbraucht sich nur bei Erfolg
- items_for_ox_inventory.lua zum Reinkopieren

Server:
- getTanks/syncTank als Callbacks, Restluft kann nur sinken und nicht schneller
  als maxDrainPerSecond pro echter Sekunde
- SetMetadata ersetzt die Metadata-Tabelle komplett, daher wird der bestehende
  Inhalt kopiert statt nur oxygen gesetzt

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:45:11 +02:00
D4rkst3randClaude Opus 5 58f31adfa9 fix(client): onCache('ped') haengt Props an den neuen Ped
Lint / Lint Resource (push) Has been cancelled
ox_lib feuert die onCache-Callbacks ueber Citizen.CreateThreadNow, bevor der
neue Wert in den Cache geschrieben wird (ox_lib/init.lua:188-199). cache.ped
zeigt im Callback also noch auf den alten, bereits verschwundenen Ped - die
Props waeren an genau den Ped gegangen, dessen Verschwinden der Handler
abfangen soll.

enableScuba, disableScuba, attachProp und attachGear nehmen den Ped jetzt als
Parameter (default cache.ped), der onCache-Handler reicht den Callback-Wert
durch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:34:24 +02:00
D4rkst3randClaude Opus 5 e0f758161d docs: Attach-Parameter gegen die Native-Doku korrigiert
Lint / Lint Resource (push) Has been cancelled
Der 15. Parameter heisst syncRot, nicht fixedRot. useSoftPinning=false ist
laut Doku korrekt fuer eine Attachment, die sich nicht loesen soll.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:27:59 +02:00
D4rkst3randClaude Opus 5 921d9c89c8 fix(client): Ausruestung verschwindet nicht mehr bei Animationen
Lint / Lint Resource (push) Has been cancelled
Die Props waren soft-pinned angehaengt (useSoftPinning = true), wodurch die
Physik-Engine die Attachment bei Ragdoll und harten Anim-Uebergaengen loesen
darf. Dazu kam, dass ein Ped-Model-Wechsel und aufraeumende Fremd-Scripts
(Emotes, Handcuffs) gar nicht abgefangen wurden.

- attachProp() Helper mit harter Attachment (useSoftPinning = false)
- Watchdog-Thread prueft jede Sekunde, ob beide Props noch am aktuellen Ped
  haengen, und haengt sie sonst neu an
- Scuba-Flags werden im Watchdog neu gesetzt, weil das Spiel sie bei Respawn
  und Fahrzeugausstieg zuruecksetzt
- lib.onCache('ped') haengt die Props nach einem Model-Wechsel neu an
- Ausruestung wird beim Tod abgenommen (removeGearOnDeath, default true)
- removeGear() als gemeinsamer Teardown fuer Ablegen, leere Flasche und Tod
- onResourceStop raeumt Props und Scuba-Flags auf
- maxTimeUnderwater / maxTimeUnderwaterOutOfAir statt Magic Numbers

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:24:39 +02:00
D4rkst3randClaude Opus 5 c6b35ebe28 chore: fork als d4rk_divegear aufsetzen
Lint / Lint Resource (push) Has been cancelled
- Umbauplan (PLAN.md) mit 5 Phasen: Gear-Persistenz, Sauerstoff-Logik,
  Flaschengroessen, NUI-HUD (Tiefe + O2), gesyncte Taschenlampe
- fxmanifest auf D4rkst3r/Gitea umgestellt
- Qbox-spezifische CI entfernt (Discord-Webhooks, GitHub-Releases,
  Issue-Projektzuordnung) - laeuft auf Gitea ins Leere bzw. gegen fremde
  Endpunkte. lint.yml bleibt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:12:59 +02:00
ChatDisabled 1e29d942aa chore: inherit org community defaults and pipeline-pling
!silent
2026-07-09 02:11:38 +02:00
amsali22andGitHub 3b77398dac fix(client): Disable EntityCollision for the mask and tank (#18)
this will disable the Collision for the mask and tank entities so they dont act like a bullet proof
2026-05-20 06:17:54 +02:00
Acc-OffandGitHub e4bc09017b feat(locales): ja.json (#20) 2026-03-29 19:35:12 +02:00
HellPortalandGitHub 8421274af5 feat(locales/tr): missing entries (#15) 2025-09-07 01:59:29 +02:00
qbox-duck[bot]andGitHub 3b4c59957a chore: synced local './' with remote 'repo-template/' 2025-09-06 22:53:49 +00:00
Justin FurnasandGitHub b5fdb3a8f9 feat: variable decay time oxygen timer (#17) 2025-07-12 15:55:47 +02:00
qbox-duck[bot]andGitHub 0f7fbc3595 chore: synced local './' with remote 'repo-template/' 2024-10-27 22:16:26 +00:00
qbox-duck[bot]andGitHub 974298263e chore: synced local './' with remote 'repo-template/' 2024-10-25 20:01:57 +00:00
qbox-duck[bot]andGitHub bbf925dd41 chore: synced local './' with remote 'repo-template/' 2024-10-24 01:54:30 +00:00
qbox-duck[bot]andGitHub 11be798ea0 chore: synced local './' with remote 'repo-template/' 2024-10-06 20:16:40 +00:00
LegenandGitHub b11d38d001 fix(locales): portuguese 2024-10-05 13:59:34 -04:00
Swellington SoaresandGitHub 23bbcd3e91 feat(locales): brazilian portuguese 2024-10-02 23:02:42 -04:00
qbox-duck[bot]andGitHub 18ac9d3d7b chore: synced local './' with remote 'repo-template/' 2024-09-29 15:31:43 +00:00
qbox-duck[bot]andGitHub 68e1817e7c chore: synced local './' with remote 'repo-template/' 2024-09-20 02:29:40 +00:00
qbox-duck[bot]andGitHub 0286bb170d chore: synced local './' with remote 'repo-template/' 2024-09-19 12:12:59 +00:00
qbox-duck[bot]andGitHub ec52cb22c0 chore: synced local './' with remote 'repo-template/' 2024-09-18 20:21:18 +00:00
qbox-duck[bot]andGitHub 5f44911b61 chore: synced local './' with remote 'repo-template/' 2024-09-08 14:56:20 +00:00
ShizoJinandGitHub ed580e805d chore(locales): german (#12) 2024-08-25 08:33:49 -07:00