aether-framework/README.md
Jerrit Fritzsche 190594eff2 README aktualisiert, untitled.md entfernt
- Datenbank-Einrichtung um Docker-Compose mit Auto-Migration ergänzt
- aether-medical, aether-police und das echte aether-admin (WebRTC-Kameras)
  dokumentiert; veraltete "neu zu bauen"- und Prototyp-Abschnitte ersetzt
- leere untitled.md gelöscht

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 19:00:34 +02:00

39 KiB
Raw Permalink Blame History

Aether Framework

Deutschsprachiges FiveM GTA-RP-Framework (in Entwicklung).

Das Projekt besteht aus zwei Teilen:

  1. Lauffähiger FiveM-Server (server.cfg, resources/[aether]/) — im Aufbau
  2. UI-Prototypen (die restlichen Ordner) — reine HTML-Entwürfe, die modulweise in echte Resources überführt werden

Server einrichten

Voraussetzungen: FiveM-Server-Artifacts, MySQL/MariaDB, ein Lizenzschlüssel von keymaster.fivem.net.

  1. Datenbank bereitstellen — entweder per Docker (empfohlen, mit automatischer Migration aller Schemas):
    cp .env.example .env        # Zugangsdaten anpassen
    docker compose up -d        # MariaDB starten + alle Schemas einspielen
    
    …oder manuell einspielen:
    mysql -u root -p < sql/aether.sql
    mysql -u root -p aether < sql/aether_medical.sql
    mysql -u root -p aether < sql/aether_police.sql
    mysql -u root -p aether < sql/aether_admin.sql
    
    Details zum Docker-Setup (idempotente Migration, Adminer, neue Migrationen): docker/README.md.
  2. oxmysql herunterladen (nicht in diesem Repo enthalten) von github.com/overextended/oxmysql und nach resources/[standalone]/oxmysql/ entpacken.
  3. server.cfg anpassen — Lizenzschlüssel und mysql_connection_string eintragen.
  4. Server starten:
    ./run.sh +exec server.cfg      # Linux
    FXServer.exe +exec server.cfg  # Windows
    

Aufbau

Pfad Inhalt
server.cfg Serverkonfiguration, Startreihenfolge der Ressourcen
docker-compose.yml, docker/ MariaDB + automatische DB-Migration (schema_migrations)
sql/ Schemas: aether.sql (Basis), aether_medical.sql, aether_police.sql, aether_admin.sql
resources/[aether]/aether-core/ Fundament: Spielerverwaltung, Charaktere, Geld, Zustand, NUI-Helfer
resources/[aether]/aether-medical/ Medizin-/Klinik-Managementsystem (migriert)
resources/[aether]/aether-police/ Polizei-Managementsystem (migriert)
resources/[aether]/aether-admin/ Server-Admin-Panel mit WebRTC-Live-Kameras (migriert)
(weitere resources/[aether]/…) siehe Abschnitt Systeme

aether-core

Das Fundament, von dem alle Module abhängen. Es übernimmt:

  • Verbindungsaufbau mit Bannprüfung und Benutzeranlage (erkannt an der Rockstar-Lizenz)
  • Charakterverwaltung (Multicharacter vorbereitet; legt vorerst automatisch einen Startcharakter an, bis aether-character migriert ist)
  • Spawn an der zuletzt gespeicherten Position, Ped-Modell nach Geschlecht
  • Geld (Bargeld / Konto / Schwarzgeld) inkl. Deckungsprüfung und Transaktionsprotokoll
  • Zustand (Leben, Hunger, Durst, Ausdauer) mit langsamem Verbrauch und Schaden bei Leere
  • Automatisches Speichern alle 5 Minuten sowie bei Disconnect und Ressourcen-Stopp
  • NUI-Helfer, damit Module Oberflächen einheitlich öffnen/schließen

Schnittstelle für andere Module (Exports):

-- Serverseite
local spieler = exports['aether-core']:HoleSpieler(source)
exports['aether-core']:FuegeGeldHinzu(source, 'bargeld', 500, 'Lohn')
exports['aether-core']:EntferneGeld(source, 'konto', 250, 'Einkauf')

-- Clientseite
local daten = exports['aether-core']:HoleSpielerDaten()
exports['aether-core']:OeffneNui('aether-phone', { aktion = 'oeffnen' })
exports['aether-core']:SchliesseNui()

Konfiguration liegt zentral in aether-core/shared/config.lua (Spawnpunkt, Startgeld, Verbrauchsraten, Speicherintervall, Rechtegruppen).


Systeme

🖥️ Ladebildschirm (resources/[aether]/aether-loading/) ✅ migriert

Bereits als FiveM-Ressource eingebunden (loadscreen). Bleibt sichtbar, bis der Core den Charakter gespawnt hat (loadscreen_manual_shutdown). Zum Ansehen im Browser: resources/[aether]/aether-loading/html/index.html.

Enthaltene Elemente:

  • Animierter Hintergrund: Aurora-Verlauf + aufsteigende Partikel (Canvas)
  • Aether-Branding mit Titel und Server-Statistiken (Spieler online/max, Voice, Discord)
  • Fortschrittsbalken mit Prozentanzeige und wechselndem Status („Lade Ressource …"), am Ende „Bereit"-Zustand
  • Info-Karussell: News, Serverregeln und Spieltipps im automatischen Wechsel (klickbare Punkte)
  • Musik-Player: sanftes Ambient-Pad per WebAudio erzeugt (kein externes Audio), Play/Pause, nächster Titel, Lautstärke

Der Fortschritt ist hier simuliert — in FiveM von echten Lade-Events getrieben. Server-Daten (server), Karussell-Inhalte (karussell) und Playlist (playlist) sind vom UI getrennt.

❤️ HUD (resources/[aether]/aether-hud/) ✅ migriert

Läuft als dauerhaftes Overlay im Spiel. Die Werte kommen aus dem Core und vom Fahrzeug — es wird nur gesendet, wenn sich tatsächlich etwas geändert hat.

Datenquellen:

  • Geld aus aether:client:geldGeaendert (Schwarzgeld erscheint nur, wenn vorhanden)
  • Hunger/Durst aus aether:client:zustandGeaendert (Core-Verbrauchsschleife)
  • Leben aus GetEntityHealth (GTA zählt ab 100 → wird in 0–100 % umgerechnet)
  • Ausdauer aus dem Sprint-Vorrat des Spielers
  • Voice aus dem eingebauten Mumble (NetworkIsPlayerTalking, Reichweite → Flüstern/Normal/Rufen)
  • Fahrzeug (client/fahrzeug.lua): Tempo, Tank, Motor sowie ein Sicherheitsgurt als Skriptmechanik — Taste B, verhindert bei angelegtem Gurt das Herausschleudern

Export für andere Module:

exports['aether-hud']:SetzeSichtbar(false)   -- HUD ausblenden, z. B. bei offenen Menüs

Browser-Fallback: Ohne FiveM blendet die Seite Kulisse und Demo-Panel wieder ein und lässt die Verbrauchssimulation laufen — weiterhin eigenständig ansehbar unter resources/[aether]/aether-hud/html/index.html.

Anzeigen:

  • Statusringe: Leben, Hunger, Durst, Ausdauer (SVG-Ringe mit Zahl)
  • Voice-Anzeige mit Reichweite (Flüstern/Normal/Rufen) und Sprech-Indikator
  • Geld: Bargeld, Konto und optional Schwarzgeld (blinkt bei Änderung)
  • Fahrzeug-HUD: Tacho (270°-Bogen), Gang, Tankanzeige, Warnleuchten für Gurt & Motor

Simulation (Prototyp):

  • Hunger/Durst sinken langsam; leerer Magen/Durst zieht am Leben; Tank sinkt bei Fahrt
  • Schaden geht auf das Leben; Aktionen wie Essen/Trinken/Heilen
  • Fahrzeug-Modus mit Tempo-/Tank-Slider, Gurt- und Motor-Umschaltung

Der komplette Zustand liegt getrennt im hud-Objekt (Status, Geld, Fahrzeugwerte). In FiveM per NUI vom Client gesetzt; das Demo-Panel entfällt dort. Geld-/Voice-Konzepte passen zu bank/ und dem Voice-System.

💀 Tod / Respawn (resources/[aether]/aether-death/) ✅ migriert

Löst automatisch aus, sobald die Lebensenergie fällt. Der Spieler geht zu Boden statt zu sterben — GTAs eigener Respawn wird unterbunden.

Server führt den Countdown: Verblutungszeit (5:00) und Respawn-Sperre (45 s) laufen serverseitig. Der Client zeigt sie nur an und kann sie nicht beschleunigen.

Ablauf:

  • Rettungsdienst rufen → löst aether:death:notruf aus; ein Rettungsdienst-Modul kann daraus einen Einsatz erzeugen. Die Position wird aktuell gehalten (man kann kriechen)
  • Um Hilfe rufen → hörbarer Schmerzlaut für Umstehende
  • Aufgeben erst nach Ablauf der Sperre; danach Aufwachen im nächstgelegenen Krankenhaus (drei Standorte) gegen Behandlungspauschale (erst Bargeld, dann Konto)
  • Verbluten führt zum selben Ergebnis
  • Wiederbelebung durch den Rettungsdienst über einen Export — mit Entfernungsprüfung

Exports für den Rettungsdienst:

exports['aether-death']:Wiederbeleben(quelle, helferQuelle)  -- prüft die Entfernung
exports['aether-death']:IstVerletzt(source)
exports['aether-death']:HoleVerletzte()   -- für eine Einsatzkarte

Verwundet-Zustand:

  • Verblutungs-Countdown (5:00) mit animierter EKG-Linie, deren Herzschlag mit der Restzeit langsamer wird; pulsierende blutrote Vignette (bei < 60 s „kritisch")
  • Rettungsdienst rufen → Notruf mit zufälliger Eintreff-ETA, danach Behandlung → wiederbelebt
  • Um Hilfe rufen (Ruf an Umstehende), Aufgeben erst nach Respawn-Sperre (45 s)

Folgezustände:

  • Behandelt — rechtzeitig vom Sanitäter wiederbelebt (Leben 100 %)
  • Krankenhaus — nach Aufgeben oder Verbluten; Behandlungspauschale als EMS-Rechnung

Zustand liegt getrennt im tod-Objekt (Phase, Countdowns, EMS-Status). Der Notruf koppelt konzeptionell an den Dispatch/EMS-Teil von faction/, die Behandlungskosten an dessen EMS-Finanzen. In FiveM per NUI von echten Lebens-Events getrieben.

🎯 Radial-Menü (radial/)

Web-Prototyp des kreisförmigen Interaktionsmenüs — reines HTML/CSS/JS. Zum Ansehen radial/index.html im Browser öffnen. Taste G öffnet/schließt das Rad, Esc schließt.

Funktionen:

  • SVG-Kuchenrad mit farbigen Kategorie-Segmenten, Hover-Highlight und zentraler Nabe, die das überfahrene Segment anzeigt
  • Untermenüs (▸): Interaktion (Hände hoch, Ausweis zeigen …), Fahrzeug (Ab-/Aufschließen, Motor, Kofferraum …), Emotes, Job, Notdienst — Nabe = Zurück
  • Direktaktionen: Inventar, Handy (öffnen)
  • Auswahl bestätigt per Toast und schließt das Rad; abdunkelnder Hintergrund bei geöffnetem Menü

Menüstruktur liegt getrennt in menue (Kategorien mit kinder/aktion), Rad-Geometrie parametrisch (Segmentzahl beliebig). Aktionen sind kosmetisch — in FiveM NUI-Callbacks, die auf inventory/, phone/, documents/, jobs/ und den Dispatch von faction/ verweisen.

⛽ Aether Fuel — Tankstelle (fuel/)

Web-Prototyp der Zapfsäulen-Oberfläche — reines HTML/CSS/JS. Zum Ansehen fuel/index.html im Browser öffnen. Ein Demo-Panel leert den Tank / füllt Geld auf.

Funktionen:

  • Digitale Zähler (Liter + Preis) und Tankanzeige (E → F) mit Live-Zapf-Animation
  • Fahrzeugkarte (Modell, Kennzeichen, Tankgröße) und Spritsorten mit Literpreis (Benzin E10, Super Plus, Diesel)
  • Drei Tankmodi: Volltanken, nach Litern, nach Betrag (€) — Zielmenge automatisch durch Tankgröße und Guthaben begrenzt
  • Zahlung per Bargeld oder Karte (Deckungsprüfung), Stopp mitten im Vorgang möglich
  • Kassenbeleg nach dem Tanken; Geld und Füllstand werden aktualisiert

Zustand getrennt: spieler (Geld), fahrzeug (Tank in Litern), spritSorten (Preise). Der Tank-Füllstand passt konzeptionell zum Tank-Wert im Fahrzeug-HUD (hud/); Geld später an bank/ koppeln.

🕹️ Minispiele (minigames/)

Web-Prototyp einer Skill-Check-Sammlung — reines HTML/CSS/JS. Zum Ansehen minigames/index.html im Browser öffnen. Übersicht + Nav wie beim Casino.

Enthaltene Minispiele (je mit Erfolg/Fehlschlag-Ausgang):

  • 🎯 Skill-Check — rotierenden Zeiger in der grünen Zone stoppen; mehrere Runden, wird schneller und enger (Leertaste/Klick)
  • 🔓 Lockpick — Marker je Pin in der Zone treffen; 4 Pins, 3 Versuche, Zone schrumpft
  • 🧠 Memory — wachsende Feld-Sequenz merken und fehlerfrei wiederholen (Simon-artig)
  • 🔢 Code knacken — 4-stelligen Code per Deduktion (🟩 richtige Stelle / 🟨 richtige Ziffer) gegen Zeit und begrenzte Versuche erraten

Gemeinsame Shell mit Timer-Verwaltung (stopAlle) und Ergebnis-Banner (spielEnde). In FiveM per NUI ausgelöst und success/fail zurückgebend — nutzbar für Fahrzeug-Lockpick, Türen/ATM-Hacks, Reparaturen u. a. quer durch die anderen Systeme.

📱 Handy (resources/[aether]/aether-phone/) ✅ teilweise migriert

Öffnen mit F1 — setzt das Handy-Item voraus. Ohne SIM-Karte gibt es kein Netz (keine Anrufe, keine Nachrichten), bei leerem Akku geht es gar nicht erst an.

Server-gestützt (echt):

  • Telefonnummer je Charakter (555-XXXX, automatisch vergeben und eindeutig)
  • Kontakte (anlegen, bearbeiten, löschen)
  • Nachrichten zwischen Spielern — werden zugestellt, gespeichert und auch bei geschlossenem Handy als Hinweis gemeldet
  • Anrufe zwischen Spielern mit vollem Ablauf: klingeln, annehmen, auflegen, besetzt, nicht erreichbar; verpasste Anrufe landen im Verlauf. Notrufe (110/112) lösen ein Event für die spätere Leitstelle aus
  • Bank-Kachel zeigt echten Kontostand und IBAN
  • Sicherheit: PIN und Face-ID liegen in der Datenbank, die PIN verlässt den Server nie
  • Akku läuft langsam leer (1 % alle 3 Minuten) und lässt sich mit einem Akku-Item tauschen
  • Einstellungen (Theme, Wallpaper, Dock) werden gespeichert

Noch lokal (bewusst): Wetter, Rechner, Uhr/Wecker, Notizen, Musik, Kamera/Galerie, Birdy, InstaPic, Staat, Dispatch, Gelbe Seiten und Darkchat laufen weiterhin ohne Server. Jede dieser Apps wäre ein eigenes Feature — sie funktionieren, halten ihre Daten aber nur innerhalb einer Sitzung.

Export für andere Module:

exports['aether-phone']:HoleNummer(source)
exports['aether-phone']:SendeNachricht('555-0182', 'EMS', 'Deine Rechnung: 1.500 €')

Enthaltene Apps & Funktionen:

  • Telefon (Wähler, Verlauf, Kontakte, animierter Anruf)
  • Nachrichten (Chats, Senden)
  • Bank (Kontostand, Überweisen, Transaktionen)
  • Staat (Staatskasse mit Graph, Einnahmen/Ausgaben, Projekt-Abstimmungen)
  • Dispatch (Notfall an die Leitstelle melden, vordefinierte Gründe)
  • Birdy (Social Media), InstaPic/Galerie, Kamera
  • Uhr (Live, Wecker stellen/löschen), Notizen (bearbeiten/löschen)
  • Wetter, Rechner, Garage, Gelbe Seiten, Musik, Darkchat (freischaltbar)
  • Einstellungen (Theme, Wallpaper, anpassbares Dock, Sicherheit)

RP-Mechaniken (als Prototyp angelegt):

  • Ersteinrichtung beim Erststart: Code festlegen + Face-ID einrichten
  • Entsperren per Face-ID (Apple-artige Scan-Animation) oder Code
  • Hardware als Items: Handy, SIM-Karte und Akku (leer werdend) — später ingame kombinierbar
  • Push-Benachrichtigungen (Banner + Sperrbildschirm, wegwischbar)
  • Gesperrte Apps per Gamemechanik freischaltbar (z. B. Darkchat)

Alle "Server-Daten" (Kontakte, Konten, Chats, Hardware-Zustand …) sind bewusst vom UI getrennt im spielerZustand/Datenlisten gehalten, um später an NUI-Callbacks und die Datenbank angebunden zu werden.

🏧 Bankautomat (resources/[aether]/aether-bank/) ✅ migriert

Öffnet sich an echten Geldautomaten in der Welt (prop_atm_01/02/03, prop_fleeca_atm) — in die Nähe gehen und E drücken. Schließen mit Esc.

Sicherheit:

  • Die PIN verlässt den Server nie. Sie wird ausschließlich serverseitig gegen aether_characters.bank_pin geprüft; die Oberfläche kennt sie nicht.
  • Jede Sitzung beginnt mit der PIN-Eingabe; Buchungen sind erst nach erfolgreicher Anmeldung möglich (der Server merkt sich das je Spieler).
  • Beträge werden auf positive Ganzzahlen und ein Maximum geprüft, Deckung prüft der Core.

Funktionen: Auszahlen (Konto → Bargeld), Einzahlen (Bargeld → Konto), Überweisen per IBAN (funktioniert auch an Offline-Spieler — dann direkt in der Datenbank), PIN ändern, Kontoauszug und Statistik.

Echte Daten statt erfundener Kurve: Der Kontostand-Verlauf wird aus den tatsächlichen Buchungen abgeleitet (jede Buchung speichert den Stand danach). Bei zu wenig Historie bleibt die Linie flach — es wird nichts dazuerfunden.

Browser-Fallback: Ohne FiveM zeigt die Seite Beispieldaten mit Test-PIN 1234 — resources/[aether]/aether-bank/html/index.html bleibt eigenständig ansehbar.

Funktionen:

  • PIN-Eingabe (Login) und PIN-Änderung (aktuelle → neue → bestätigen)
  • Auszahlen (Schnellbeträge + eigener Betrag, „Geld entnehmen"-Animation)
  • Einzahlen und Überweisen (mit Bestätigung)
  • Kontoauszug (laufender Saldo, Filter Eingang/Ausgang)
  • Statistiken: Aktien-artiges Verlaufsdiagramm (glatte Linie + Flächenverlauf, Hover-Fadenkreuz, Zeitraum 7T/30T/12M), Einnahmen/Ausgaben, Sparquote

Besonderheit: Das Display ist standardmäßig durchscheinend und wird erst bei Maus-Hover voll sichtbar (verlässt die Maus das Display, sinkt die Opazität).

Kontodaten (Saldo, IBAN, PIN, Transaktionen) liegen getrennt im konto-Objekt, bereit für die Anbindung an DB/Server.

🎒 Inventar (resources/[aether]/aether-inventory/) ✅ migriert

Vollständig server-geprüft. Die Oberfläche entscheidet nichts mehr selbst — sie schickt nur Wünsche („verschiebe Slot 3 auf Slot 7"), der Server prüft und antwortet mit dem neuen Zustand. Öffnen im Spiel mit Taste I, schließen mit Esc.

Slot-Aufteilung (alles in einer Tabelle, die Nummer bestimmt den Bereich): Tasche 0–24 · Hotbar 100–104 · Ausrüstung 200–204

Serverseitige Prüfungen:

  • Gültigkeit jeder Slotnummer, Passform der Ausrüstungsplätze, Tauschbarkeit
  • Traglast (30 kg) bei Aufheben, Geben und Hinzufügen
  • Entfernung beim Aufheben (3 m) und Geben (3 m) — kein Zugriff quer über die Karte
  • Beim Geben wird zuerst geprüft, ob der Empfänger tragen kann; schlägt die Übergabe fehl, geht das Item an den Absender zurück (nichts verschwindet)

Item-Registry (shared/items.lua) wird von Client und Server geladen, damit beide garantiert dieselben Werte verwenden. Benutzen wertet der Server aus (Essen/Trinken über AendereZustand im Core, Heilung über ein Client-Event).

Exports für andere Module (Shop, Jobs, Dokumente …):

exports['aether-inventory']:GebeItem(source, 'wasser', 2)
exports['aether-inventory']:ZaehleItem(source, 'dietrich')
exports['aether-inventory']:EntferneItem(source, 'bargeld', 500)

Fallengelassene Items liegen als sichtbare Kartons in der Welt und sind dauerhaft gespeichert (Tabelle aether_drops) — sie überleben Serverneustarts:

  • Beim Fallenlassen wird zufällig einer von drei Kartons gewählt (prop_cardbordbox_03a/04a/05a), damit alle Drops einheitlich aussehen
  • Props werden nur lokal je Client erzeugt und ab 30 m Entfernung wieder entfernt
  • Aufheben per E am Karton (mit Hinweis über dem Objekt) oder per Drag & Drop im Inventar
  • Drops älter als 48 h werden beim Serverstart aufgeräumt (DROP_MAX_STUNDEN)

Browser-Fallback: Ohne FiveM zeigt die Seite Beispieldaten und rechnet das Gewicht selbst — resources/[aether]/aether-inventory/html/index.html bleibt eigenständig ansehbar.

Funktionen:

  • Drag & Drop zwischen Tasche, Ausrüstung, Hotbar, Boden und Spielern
  • Gewichtssystem (getragene kg / Limit), Einzelgewicht je Item
  • Hover-Details (Name nach Seltenheit gefärbt, Kategorie, Beschreibung, Gewicht)
  • 3D-artiger Avatar mit Ausrüstungs-Slots (Helm, Brust, Hose, Schuhe, Schmuck) + Hotbar 1–5
  • Fallenlassen (auf Boden ziehen), Geben (auf Spieler ziehen)
  • Splitten per Rechtsklick → Slider; Rechtsklick-Menü (Benutzen, Ausrüsten, Geben, Fallenlassen)
  • Doppelklick = Benutzen / Ausrüsten
  • Assets & Waffen: Handy zeigt verbaute Komponenten (SIM, Akku), Waffen zeigen Seriennummer + Aufsätze (Basis für späteren Waffenschein)
  • Anonyme Spieler: Namen erscheinen erst, wenn die Person bekannt ist (im Spiel via Ausweis/Visitenkarte) — sonst „Unbekannt · ID #xxxx"

Item-Registry (itemDefs) und Orte (Tasche, Ausrüstung, Hotbar, Boden) sind getrennt gehalten, bereit für die Anbindung an das Server-Inventar.

👛 Börse & Dokumente (resources/[aether]/aether-documents/) ✅ migriert

Öffnen mit F2 — setzt voraus, dass du mindestens eine Börse (Item aus dem 24/7) dabei hast. Die Kartendesigns des Prototyps sind unverändert übernommen.

Datenmodell: Tabelle aether_documents. Name und Geburtsdatum kommen live aus dem Charakter, nur die dokumentspezifischen Felder (Nummern, Fahrklassen, registrierte Waffen) liegen im Dokument — so muss nichts doppelt gepflegt werden.

Automatisch beim ersten Laden: Personalausweis, Gesundheitskarte, Visitenkarte. Behördlich (nur über Exports ausstellbar): Führerschein, Waffenschein.

Anzahl Börsen = Anzahl boerse-Items im Inventar — kaufst du eine zweite Börse im 24/7, erscheint sie als weiterer Reiter (je max. 10 Dokumente).

Vorzeigen an Personen in 4 m Reichweite; der Empfänger sieht die Karte als Vollbild. Dabei werden die Daten des Zeigenden gerendert, nicht die eigenen.

Exports:

-- Wird vom Shop (Ammu-Nation) abgefragt:
exports['aether-documents']:HatWaffenschein(source)
exports['aether-documents']:HatDokument(source, 'fs')
-- Für ein Polizei-Modul (stellt aus / entzieht):
exports['aether-documents']:StelleAus(charakterId, 'ws', { waffen = {...} }, 'LSPD')
exports['aether-documents']:Entziehe(charakterId, 'ws')

Damit greift die Waffenschein-Prüfung im Shop. Ammu-Nation gibt lizenzpflichtige Waren jetzt nur noch an Spieler mit gültigem, nicht entzogenem Waffenschein heraus.

Dokumente (jeweils eigenes Design):

  • Personalausweis (Guilloché, Wappen, MRZ-Zeile)
  • Führerschein (EU-Stil, Sternenkreis, Fahrklassen)
  • Waffenschein (Behörden-Look, Stempel, Tabelle mehrerer registrierter Waffen mit Seriennummer)
  • Gesundheitskarte (eGK mit Chip)
  • Visitenkarte (nur Name + Telefonnummer, für Handykontakt)

Funktionen:

  • Börse = ein Item, das alle Karten enthält
  • Multi-Börse: mehrere Börsen (im Shop kaufbar), je max. 10 Slots, Wechsel per Tabs
  • Verschieben von Dokumenten zwischen Börsen
  • Vorzeigen (präsentieren, optional gezielt an eine — anonymisierte — Person)
  • Verlieren (Dokument aus der Börse entfernen)

Stammdaten liegen zentral im person-Objekt, Karten-Designs pro Typ in kartenRenderer, Börsen in boersen[] (mit MAX_SLOTS). Die Waffen-Seriennummern passen zu den Items im Inventar — Basis für spätere Waffenschein-Prüfungen.

🛒 Läden (resources/[aether]/aether-shop/) ✅ migriert

Öffnet sich an echten Filialen in der Welt — 10 24/7-Läden und 9 Ammu-Nations mit Karten-Markierungen. In die Nähe gehen und E drücken, schließen mit Esc.

Der Server rechnet den Warenkorb komplett neu durch:

  • Preise kommen immer vom Server — was der Client schickt, sind nur Produkt-IDs und Mengen
  • Führt der Laden das Produkt überhaupt? Ist der Bestand da? Ist die Menge plausibel?
  • Waffenschein bei lizenzpflichtigen Waren, Deckung über den Core, Traglast über das Inventar
  • Steht die Entfernung zur Filiale? (kein Einkaufen aus der Ferne)
  • Passt etwas nicht ins Inventar, wird der Anteil automatisch erstattet

Bestand & Nachschub: Jede Filiale hat eigene Bestände im Speicher, die alle 15 Minuten um 10 % aufgefüllt werden.

Gekaufte Waren landen im Inventar — dafür wurde die Item-Registry um alle fehlenden Waren erweitert (Getränke, Snacks, Elektronik, Zubehör, Waffen, Munition, Aufsätze). Munition wird paketweise verkauft (z. B. „9mm ×30" liefert 30 Stück).

Browser-Fallback: Ohne FiveM rechnet die Seite lokal mit Beispieldaten und zeigt beide Läden zum Umschalten — resources/[aether]/aether-shop/html/index.html.

Enthaltene Läden (oben umschaltbar, Akzentfarbe passt sich an):

  • LS 24/7 — Getränke, Snacks, Gesundheit, Werkzeug, Elektronik (Handy, SIM, Akku), Zubehör (Börse, Rucksack)
  • Ammu-Nation — Waffen, Munition, Aufsätze, Schutz (mit „Waffenschein nötig"-Badge)

Funktionen:

  • Kategorien-Sidebar (mit Anzahl) + Live-Suche
  • Produktkarten mit Bestand, Angeboten (Rabatt), Menge-im-Korb
  • Warenkorb mit Mengen-Steppern, Zwischensummen, Gesamtpreis
  • Zahlung per Bargeld oder Karte (Guthaben-Anzeige + Deckungsprüfung)
  • Kassenbeleg nach dem Kauf; Bestand/Geld werden aktualisiert

Zentrale Produkt-Registry (produkte) + shops[], die nur Produkt-IDs referenzieren — beliebige weitere Läden mit wenigen Zeilen anlegbar. Geld liegt in spieler (später an Bank/Item-System koppeln).

🚓 Polizei (resources/[aether]/aether-police/) ✅ migriert

Polizei-Managementsystem als Tablet (Taste F5). Modular aufgebaut wie das Klinik-System: ein Kern mit Plugin-Registry und Rechteprüfung, an den sich Fachmodule selbst anmelden. Personenakten, Fahndungen und Haft setzen auf den CAD-Tabellen aether_records, aether_wanted, aether_jail auf; dazu Statistik und Administration.

🏥 Medizin (resources/[aether]/aether-medical/) ✅ migriert

Klinik-/Rettungsdienst-Managementsystem als Klinik-PC (Taste F6). Ein Plugin-Kern (Kern.RegistriereModul) trägt 15 Fachmodule: Dashboard, MDT, Patienten, Leitstelle/Einsätze, Behandlung, Labor, Operation, Medikamente, Stationen & Belegung, Intensivstation, Blutbank, Fuhrpark, Nachrichten/Aushänge, Berichte und Textbausteine. Eigenes Rollen-/ Rechtesystem (medical_personal), ~34 Tabellen (medical_*).

Durchgehendes Prinzip: Das System dokumentiert, es entscheidet nicht. Jeder Vorgang trägt den verantwortlichen Mediziner; das System stellt keine Diagnose, verabreicht nichts, entlässt niemanden von selbst und leitet nichts aus Zeitablauf ab. Fristen erinnern nur.

Integrations-Anschlusspunkte (für Polizei/Medizin und andere Module):

  • Notruf-Events aether:phone:notruf (110/112 aus dem Handy) und aether:death:notruf (Verletzt-Screen) — von der jeweiligen Leitstelle verarbeitbar
  • Waffenschein: exports['aether-documents']:StelleAus(charakterId, 'ws', …)
  • Kennzeichenabfrage: exports['aether-garage']:HoleHalter(kennzeichen)
  • Wiederbelebung: exports['aether-death']:Wiederbeleben(quelle, helferQuelle)
  • Fuhrpark/Blutbank/Bettenspiegel je als Export für fremde Ressourcen (reine Auskunft)

🧑 Charakterauswahl (resources/[aether]/aether-character/) ✅ migriert

Vollständig an den Server angebunden: Die Liste kommt aus der Datenbank, Erstellen und Löschen laufen über geprüfte NUI-Callbacks, und die Auswahl lässt den Core den Charakter spawnen. Im Browser weiterhin ansehbar (zeigt dann Beispieldaten): resources/[aether]/aether-character/html/index.html.

Serverseitige Prüfungen: Namen (nur Buchstaben, 2–32 Zeichen), Geburtsdatum (TT.MM.JJJJ, Jahr 1900–2010), Slotgrenze aus Config.MaxCharaktere und Eigentumsprüfung bei Spielen/Löschen.

3D-Vorschau: client/vorschau.lua spawnt einen lokalen Ped als lebende Vorschau und richtet eine Kamera darauf; die NUI liegt mit einem transparenten Bereich darüber. Jede Änderung an Slidern oder Paletten wird sofort auf den Ped übertragen (gebündelt, damit Slider die Verbindung nicht fluten). Enthalten:

  • Ansichten Gesicht / Körper (Kamerafahrt statt SVG-Wechsel)
  • Drehen des Peds per ◀ ▶ unter der Vorschau
  • Geschlechtswechsel erzeugt den Ped mit dem passenden Modell neu (Drehung/Ansicht bleiben)
  • Auf der Auswahlseite zeigt der Ped den gerade markierten Charakter

Aussehen: client/aussehen.lua überträgt die Werte des Erstellers auf den GTA-Ped (Kopfform, Hautton, Frisur, Haar-/Augenfarbe, Bart, Augenbrauen, Gesichts-Slider, Kleidungsfarben). Die Zuordnungstabellen sind bewusst als Annäherung angelegt und leicht nachjustierbar.

Browser-Fallback: Ohne FiveM (Datei direkt öffnen) fehlt der 3D-Ped. Die Seite erkennt das und schaltet auf das frühere Kasten-Layout mit der stilisierten SVG-Vorschau zurück — das Modul bleibt also weiter eigenständig ansehbar.

Auswahl:

  • Bis zu 5 Charakter-Slots mit Portrait-Vorschau, Name, Job, Spielzeit
  • Aktionen: Spielen, Löschen (kein Bearbeiten — Änderungen am Charakter erfolgen ingame)
  • „+ Neuen Charakter erstellen"

Ersteller (live aktualisierte Vektor-Vorschau, Gesicht-/Körper-Ansicht):

  • Identität (Vor-/Nachname, Geschlecht, Geburtsdatum, Herkunft)
  • Gesicht (Hautton, Augenfarbe)
  • Merkmale (Slider: Gesichtsbreite, Kiefer, Nase, Lippen, Körperbau)
  • Haare & Bart (Frisuren, Haarfarben, Augenbrauen, Bartstile)
  • Kleidung (Oberteil/Hose/Schuhe-Farben)

Das Aussehen liegt als kompaktes aussehen-Objekt je Charakter (Slider 0–100), später auf FiveM-Ped-Komponenten (Heritage/Features/Components) mappbar. Die Vorschau ist eine stilisierte SVG-Darstellung, kein 3D-Ped.

🚗 Garage (resources/[aether]/aether-garage/) ✅ migriert

Vier öffentliche Garagen (Legion Square, Sandy Shores, Del Perro, Paleto) mit Karten-Markierungen — hingehen und E drücken. Nutzt die Tabelle aether_vehicles.

Regeln, die der Server durchsetzt:

  • Standort-Regel: Ausparken nur an der Garage, wo das Fahrzeug wirklich steht — sonst nennt die Meldung den tatsächlichen Standort
  • Zugangs-Regel: Es werden nur Garagen angezeigt, zu denen Zugang besteht. Haus-Garagen fragen bei aether-immobilien an (noch nicht migriert → bleiben verschlossen)
  • Besitz bei jeder Aktion, Entfernung beim Öffnen und Einparken
  • Beschlagnahmte Fahrzeuge lassen sich nur gegen Gebühr auslösen

Fahrzeuge werden serverseitig erzeugt und überleben dadurch Serverneustarts:

  • Die Position ausgeparkter Fahrzeuge wird alle 30 Sekunden sowie beim Stoppen der Ressource gesichert (Spalten pos_x/pos_y/pos_z/heading)
  • Beim Serverstart stehen sie wieder exakt dort, wo sie zuletzt waren
  • Lässt sich ein Fahrzeug nicht setzen (z. B. Modell entfernt), wandert es zurück in seine Garage statt verloren zu gehen
  • Eigenschaften, die nur clientseitig gesetzt werden können (Kennzeichen, Farbe, Zustand), reicht der Server über einen State Bag weiter; der Client wendet sie an, sobald das Fahrzeug bei ihm auftaucht

Zustand wird echt gespeichert: Beim Einparken liest der Client Tank, Motor- und Karosserieschaden vom Fahrzeug; der Server begrenzt die Werte und schreibt sie zurück. Während der Fahrt wird der Zustand zusätzlich alle 30 Sekunden gemeldet, damit er auch bei einem unerwarteten Serverstopp nicht verloren geht.

Kilometerstand: GTA führt keinen Tacho — der Client zählt die gefahrene Strecke selbst mit (Sprünge durch Teleport/Nachladen werden ignoriert), der Server addiert sie beim Einparken auf und lässt den Stand nie sinken.

Neue Charaktere bekommen ein Startfahrzeug (Blista in Legion Square, abschaltbar).

Exports:

exports['aether-garage']:GebeFahrzeug(charakterId, 'sultan', 'legion', { name = 'Sultan' })
exports['aether-garage']:Beschlagnahmen(kennzeichen)   -- fürs Polizei-CAD
exports['aether-garage']:HoleHalter(kennzeichen)       -- Kennzeichenabfrage

Funktionen:

  • Auto-Vorschau je Fahrzeugtyp (Sport/Limousine/SUV/Pickup/Kleinwagen/Muscle/Motorrad), parametrisches SVG in Fahrzeugfarbe
  • San-Andreas-Kennzeichen (Stile SA/Gelb/Schwarz) — Farbe fix, wird nur beim Kauf festgelegt
  • Zustand (Tank/Motor/Karosserie), Kilometerstand, Klasse
  • Standort-Regel: Ausparken nur an der Garage, wo das Fahrzeug steht; Ansehen aller zugänglichen Garagen erlaubt („Alle"-Übersicht), Einparken lagert ins aktuelle Standort-Garage
  • Zugangs-Regel: sichtbar sind nur öffentliche Garagen und Haus-Garagen mit Zugang (Besitz/berechtigt); Garagen ohne Zugang erscheinen nicht

garagen (mit typ/zugang), standort (physischer Standort), zugaenglich(). Später standort an die Spielerposition und zugang an Haus-/Schlüsselbesitz koppeln. Kennzeichen passen konzeptionell zur Kennzeichenabfrage im CAD.

🏡 AetherImmos — Immobilien (immobilien/)

Web-Prototyp des Immobilien-/Wohnungs-Systems — reines HTML/CSS/JS. Zum Ansehen immobilien/index.html im Browser öffnen.

Bereiche:

  • Markt (AetherImmos) — Angebote mit stilisiertem Objekt-„Foto" je Typ (Wohnung/Haus/Villa/ Gewerbe), Filter + Suche, Detailansicht mit Ausstattung
  • Kaufmenü (separat) — Kaufpreis + Notar-/Bearbeitungsgebühr, Zahlung per Konto/Bargeld; beim Kauf gibt es 5 Hausschlüssel (Items)
  • Meine Immobilien — Betreten, Schlüssel-Verwaltung (Anzahl gehaltener Schlüssel, Nachmachen beim Schlüsseldienst; Weitergabe erfolgt übers Inventar, da Schlüssel = Item), Verkauf mit anteiliger Rückzahlung (60 % des Kaufpreises)

marktplatz (Angebote), meine (Besitz mit schluessel-Anzahl + kaufpreis), RUECKKAUF=0.6, START_SCHLUESSEL=5. Schlüssel koppeln ans Inventar-System; die Zugangslogik passt zur Haus-Garagen-Zugangsregel in garage/.

👕 Aether Threads — Kleidungsladen (clothing/)

Web-Prototyp des Bekleidungsladens mit Live-Vorschau — reines HTML/CSS/JS. Zum Ansehen clothing/index.html im Browser öffnen.

Funktionen:

  • Live-Charaktervorschau (SVG-Figur), Zoom Ganzkörper / Kopf
  • Kategorien: Kopfbedeckung (Cap/Beanie/Hut/Helm), Brille, Maske (Halbmaske/Sturmhaube), Oberteil (T-Shirt/Hemd/Hoodie/Jacke/Anzug), Hose (Jeans/Cargo/Shorts/Anzughose), Schuhe (Sneaker/Stiefel/Sandalen), Kette (Silber/Gold)
  • Farbwahl je Teil; bereits getragene Teile als „im Besitz" markiert (kostenlos)
  • Warenkorb der geänderten Teile, Zahlung Bargeld/Karte (Deckungsprüfung), „Kaufen & anziehen" / „Zurücksetzen"

kategorien (Stile + Preise), farben, getragen (Besitz) vs. outfit (Anprobe). Der Avatar koppelt konzeptionell an dieselben Komponenten wie der Charakter-Ersteller (character/).

🛡️ Admin-Panel (resources/[aether]/aether-admin/) ✅ migriert

Zentrales Server-Admin-Panel als echtes Resource, im Spiel mit F9 (/adminpanel). Aus dem Web-Prototyp admin/ hervorgegangen und an aether-core gekoppelt.

  • Rechte kommen aus aether_users.admin_group (user < support < admin < owner) — jede der Aktionen wird serverseitig gegen eine Rechte-Matrix geprüft; die Oberfläche blendet nur aus, was ohnehin abgelehnt würde.
  • Bereiche: Dashboard, Weltkarte (Live-Positionen), Spieler (Teleport/Zustand/Geben/ Moderation), Fahrzeuge, Immobilien, Fraktionen (inkl. Payday), Wirtschaft, Staatsprojekte, Live-Kameras, Weltsteuerung, Ankündigungen, Bans & Warns, Reports, Ressourcen, Audit-Log, Admin-Team, Einstellungen.
  • Bans schreiben in aether_users — der Core sperrt darüber bereits beim Connect.
  • Spieler melden aus dem Spiel mit /report <Text>; jede eingreifende Aktion landet im Prüfprotokoll (aether_admin_log).

Live-Kameras (echtes WebRTC): ein separater Media-Server (SFU) unter aether-admin/media-server/ routet die Streams; der FiveM-Server prüft nur Rechte, stellt kurzlebige Token aus und weist Ziel-Clients zum Senden an. Das Bild liefert die Bildschirmfreigabe der Client-NUI (getDisplayMedia) — kein OBS nötig, sofern das FiveM-CEF des Clients die Aufnahme erlaubt.

Der Web-Prototyp admin/ (reines HTML/CSS/JS, per admin/index.html im Browser ansehbar) bleibt als Design-Vorlage erhalten. Einrichtung der Kameras: aether-admin/media-server/README.md.

🎖️ Fraktions-/Gang-Verwaltung (factions/)

Web-Prototyp der Fraktions-/Gang-Verwaltung aus Führungssicht — reines HTML/CSS/JS. Zum Ansehen factions/index.html im Browser öffnen. Oben Fraktion + „Als Rang ansehen" wählen.

Funktionen:

  • Mehrere Fraktionen (Gangs & legaler Betrieb), Akzentfarbe passt sich an
  • Mitglieder: Roster, Befördern/Degradieren/Kicken (rang-gated), Einladen
  • Ränge & Rechte: Gehalt je Rang + Rechte-Matrix (Einladen/Kicken/Befördern/Kasse/Ränge/ Territorien/Fahrzeuge/Einstellungen), Ränge anlegen/löschen; Leitung hat alle Rechte
  • Kasse: Einzahlen/Auszahlen, Payday (zieht alle Gehälter), Transaktionsliste
  • Territorien (nur Gangs): Karte mit Kontroll-% (kontrolliert/umkämpft/feindlich), Angreifen/Verstärken/Ausbauen (Ausbau kostet Kasse, erhöht Einnahmen/h)
  • Fraktionsfahrzeuge (gemeinsame Garage, Freigabe ab Rang), Logbuch, Einstellungen

Rechtesystem greift überall über darf(recht) (abhängig vom gewählten Rang). Datenmodell fraktionen[] (Ränge/Mitglieder/Kasse/Territorien/Fahrzeuge/Logs). Deckt die im Admin-Panel referenzierten Fraktionen ab.

💼 Aether Jobs (resources/[aether]/aether-jobs/) ✅ migriert

Am Jobcenter (Karten-Markierung) mit E öffnen; wer im Dienst ist, erreicht die Arbeitsansicht jederzeit mit J. Acht Jobs mit Level und XP, gespeichert in aether_jobs.

Gearbeitet wird in der Welt, nicht im Menü. Jeder Arbeitsschritt hat einen echten Ort:

  • Nach dem Antreten schließt sich das Menü und eine Route auf der Karte führt zum Arbeitsort
  • Dort steht ein Bodenmarker; in Reichweite erscheint [E] Paket laden
  • Die Handlung läuft mit Animation und Fortschrittsbalken ab (Angeln 12 s, Baum fällen 10 s, Erz abbauen 12 s …), erst danach meldet der Client sie
  • Eine Aufgabenanzeige am Bildschirmrand zeigt durchgehend Aufgabe, Ziel und Entfernung
  • Jobs mit Fahrzeug (Lieferdienst, Müllabfuhr, Taxi, Trucker) bekommen beim Antreten ein Dienstfahrzeug gestellt, das bei Feierabend wieder verschwindet

Der Server prüft alles Wesentliche:

  • Ortsprüfung: Der Spieler muss tatsächlich am Arbeitsort stehen, sonst wird abgelehnt
  • Zeitprüfung: Die Handlung muss ihre vorgesehene Dauer gebraucht haben
  • Aufträge, Orte und Löhne entstehen ausschließlich serverseitig — der Client meldet nur „Schritt erledigt" und kann weder Ziel noch Bezahlung beeinflussen
  • Nur ein Job gleichzeitig; Level/XP und Verdienst werden pro Job dauerhaft gespeichert
  • Levelbonus von 5 % je Level fließt in den Lohn ein, Höchstlevel 20

Exports:

exports['aether-jobs']:HoleAktivenJob(source)   -- z. B. für Job-Fahrzeuge
exports['aether-jobs']:HoleLevel(source, 'trucker')

Funktionen:

  • Jobcenter mit 8 Jobs (Lieferdienst, Müllabfuhr, Taxi, Trucker, Tankwart, Angeln, Holzfäller, Bergbau) inkl. Level/XP je Job
  • Dienst an/aus (nur ein Job gleichzeitig), Akzentfarbe passt sich dem Job an
  • Arbeits-Loop: mehrschrittige Aufträge mit Fortschrittsanzeige, Lohn-Vorschau, Fang/Ausbeute-Flavor; bei Abschluss Geld + XP, ggf. Level-Up (erhöht den Lohn)
  • Schicht-Statistik (Verdient, Aufträge, Dienstzeit-Timer), Feierabend
  • Statistik über alle Jobs (Level/XP)

jobs[] (mit schritte + auftrag(level)), fortschritt (Level/XP je Job), spieler (Bargeld/Konto). Aktionen später an echte Ingame-Zonen/Fahrten koppelbar.

🎰 Aether Casino (casino/)

Web-Prototyp des Casino-UIs mit fünf spielbaren Glücksspielen — reines HTML/CSS/JS. Zum Ansehen casino/index.html im Browser öffnen.

Guthaben & Session:

  • Guthaben (Casino-Chips) getrennt vom Bargeld; Aufladen/Auszahlen zwischen beiden
  • Session-Bilanz (Netto-Gewinn/-Verlust der aktuellen Sitzung, grün/rot)
  • Wiederverwendbare Einsatz-Steuerung (Schnell-Chips 50/100/500/1000 + „Max")

Spiele (mit bewusst kalkuliertem Hausvorteil):

  • Spielautomat — 3 gewichtete Walzen, Auszahlungstabelle, 7️⃣7️⃣7️⃣-Jackpot ×180 (RTP ~90 %)
  • Blackjack — gegen den Dealer (Ziehen/Stehen/Verdoppeln), echter Blackjack ×2, Dealer zieht bis 17
  • Roulette — einfache Chancen (×2), Dutzende (×3), Einzelzahl (×36), mehrere Einsätze gleichzeitig
  • Glücksrad — 12 Felder, Multiplikator ×0 bis ×5 (Hausvorteil ~21 %)
  • Münzwurf — Kopf oder Zahl, ×2 bei richtiger Wahl

Zustand liegt getrennt: spieler (Bargeld), guthaben (Chips), session (Ein/Aus). Jedes Spiel hält sein eigenes Datenmodell (slotReel/slotPay, bj, rlt.bets, wSegs) — Gewichtungen/ Multiplikatoren zentral definiert und leicht anpassbar. Der Spielwechsel erstattet offene Einsätze.

Konventionen

  • Jedes System ist eine eigenständige index.html (self-contained, ohne externe Abhängigkeiten).
  • Daten/Zustand sind bewusst vom UI getrennt gehalten — vorbereitet für die spätere Anbindung an FiveM (NUI-Callbacks) und Datenbank.