feat(light): auf die spieleigene Scuba-Lampe umgestellt
Lint / Lint Resource (push) Has been cancelled
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>
This commit is contained in:
@@ -172,44 +172,31 @@ FiveM* umlegbar.
|
||||
| Option | Default | Bedeutung |
|
||||
|---|---|---|
|
||||
| `lampKey` | `'l'` | Vorbelegung |
|
||||
| `lampBone` | `12844` | Bone für Prop **und** Licht — derselbe, damit der Strahl aus der Lampe kommt. `28422` = Hand statt Kopf |
|
||||
| `lampProp` | `'prop_cs_police_torch'` | Optik. Ungültiges Model → Warnung im Log, Licht funktioniert trotzdem. `''` = kein Prop |
|
||||
| `lampPropOffset` / `lampPropRotation` | `vec3(0,0,0)` | Sitz des Props am Bone — mit `/divelamp` einstellen |
|
||||
| `lampOffset` | `vec3(0,0,0)` | Ursprung des Lichtkegels, bone-relativ |
|
||||
| `lampDirection` | `vec3(0, 1, 0)` | Richtung des Kegels, bone-relativ |
|
||||
| `lampColour` | `{255, 250, 235}` | RGB |
|
||||
| `lampDistance` / `lampBrightness` / `lampRoundness` / `lampRadius` / `lampFalloff` | `28/3/0/16/2` | Form des Lichtkegels, Werte aus `d4rk_phone` übernommen |
|
||||
| `lampShadows` | `false` | `true` nutzt `DrawSpotLightWithShadow` — sieht besser aus, kostet aber deutlich Performance |
|
||||
| `lampDrawDistance` | `45.0` | Ab hier werden fremde Lampen nicht mehr gezeichnet |
|
||||
| `lampMaxLights` | `4` | Gleichzeitige Lampen, die nächstgelegenen gewinnen |
|
||||
| `lampReconcileIntervalMs` | `500` | Wie oft der Lampen-Zustand auf die Peds in der Nähe nachgezogen wird |
|
||||
| `lampProp` | `''` | Optionales Prop am Kopf, rein optisch. Die Lampe leuchtet unabhängig davon |
|
||||
| `lampBone` / `lampPropOffset` / `lampPropRotation` | `12844` / `vec3(0,0,0)` | Sitz des optionalen Props — mit `/divelamp` einstellen |
|
||||
|
||||
> **Beim Balancing beachten:** `maxDrainPerSecond` (shared) muss über
|
||||
> `maxDecayFactor` (client) liegen. Sonst hält der Server den ehrlichen Verbrauch
|
||||
> in großer Tiefe für Cheat und schreibt Luft zurück.
|
||||
|
||||
## Lampe einstellen
|
||||
## Debug-Befehle
|
||||
|
||||
Wo Prop und Lichtkegel am Kopf sitzen, hängt daran, wie das Prop-Model selbst
|
||||
ausgerichtet ist — das lässt sich nicht am Schreibtisch erraten. Mit
|
||||
`debug = true` in `config/client.lua` gibt es zwei Befehle, die die Werte im
|
||||
laufenden Spiel ändern und die fertige Config-Zeile ins Log schreiben:
|
||||
Mit `debug = true` in `config/client.lua`:
|
||||
|
||||
```
|
||||
/divelamp <x> <y> <z> <rx> <ry> <rz> Sitz des Lampen-Props
|
||||
/divelight <x> <y> <z> <dx> <dy> <dz> Ursprung und Richtung des Lichtkegels
|
||||
/divelampcheck Hat das aktuelle Outfit eine Scuba-Lampe?
|
||||
/divelamp <x> <y> <z> <rx> <ry> <rz> Sitz des optionalen Lampen-Props
|
||||
```
|
||||
|
||||
Das Prop wird sofort neu angehängt, das Licht zieht ohne Verzögerung mit — kein
|
||||
Resource-Restart pro Versuch. Sind die Werte gut, die ausgegebenen Zeilen in die
|
||||
Config übernehmen und `debug` wieder ausschalten.
|
||||
`/divelamp` hängt das Prop sofort neu an und schreibt die fertige Config-Zeile ins
|
||||
Log — kein Resource-Restart pro Versuch. Alternativ mit einem Prop-Attach-Editor
|
||||
wie [noted_propattacher](https://github.com/NotedDevelopment/noted_propattacher)
|
||||
ausmessen.
|
||||
|
||||
Alternativ mit einem Prop-Attach-Editor wie
|
||||
[noted_propattacher](https://github.com/NotedDevelopment/noted_propattacher)
|
||||
ausmessen: Prop spawnen, mit der Maus an die Stelle ziehen, Werte übernehmen.
|
||||
|
||||
> Im Basegame gibt es **keine** Tauchlampe. `prop_cs_police_torch` ist eine
|
||||
> Polizei-Taschenlampe; Varianten davon sind `prop_police_torch` und
|
||||
> `prop_scn_police_torch`. Wer eine echte Tauchlampe will, braucht ein Custom-Model.
|
||||
> Ein Tauchlampen-Prop gibt es im Basegame nicht. Was es gibt, sind Varianten
|
||||
> derselben Polizei-Taschenlampe: `prop_cs_police_torch`, `prop_police_torch`,
|
||||
> `prop_scn_police_torch`. Für die Beleuchtung braucht es das Prop ohnehin nicht.
|
||||
|
||||
## Exports
|
||||
|
||||
@@ -222,18 +209,31 @@ Gedacht für HUD- und Screenshot-Resources. Zusätzlich folgt das HUD automatisc
|
||||
`IsHudHidden()`, greift also bei allem was `DisplayHud(false)` setzt, ohne dass
|
||||
etwas angebunden werden muss.
|
||||
|
||||
## Wie die Lampe synchron wird
|
||||
## Wie die Lampe funktioniert
|
||||
|
||||
Licht ist in GTA nie synchronisiert — `DrawSpotLight` zeichnet nur lokal für den
|
||||
aktuellen Frame. Der Lampenzustand wird deshalb als Statebag repliziert
|
||||
(`LocalPlayer.state:set('divelight', …, true)`), und jeder Client zeichnet die
|
||||
Lampen aller Taucher in seiner Nähe selbst.
|
||||
Es wird kein Licht selbst gezeichnet. GTA bringt seit v1493 (Cayo Perico) eine
|
||||
eigene Lampe an der Tauchausrüstung mit:
|
||||
|
||||
Die Richtung kommt aus **zwei bone-relativen Punkten** am Kopf-Bone, nicht aus
|
||||
`GetEntityForwardVector`: beim Tauchen liegt der Ped waagerecht im Wasser, der
|
||||
Entity-Forward würde stur horizontal leuchten. Die Offsets von `GetPedBoneCoords`
|
||||
sind laut Native-Doku *"relative to the bone's rotation"*, die Differenz zweier
|
||||
solcher Punkte enthält also den Pitch.
|
||||
```lua
|
||||
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.
|
||||
|
||||
> **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.
|
||||
|
||||
Der Flag ist ein **lokaler** Ped-Zustand und wird nicht von selbst repliziert.
|
||||
Deshalb läuft der Zustand über einen Statebag
|
||||
(`LocalPlayer.state:set('divelight', …, true)`), und jeder Client setzt den Flag
|
||||
für die Taucher in seiner Nähe selbst — sofort per `AddStateBagChangeHandler`,
|
||||
plus ein Abgleich alle `lampReconcileIntervalMs`, weil Peds beim Streaming,
|
||||
Respawn und Model-Wechsel neu erzeugt werden und den Flag dabei verlieren.
|
||||
|
||||
## Entwicklung
|
||||
|
||||
|
||||
Reference in New Issue
Block a user