FAQ

Allgemein

Ist das Skript mit meinem Framework kompatibel?

HZ-Television unterstuetzt QBCore, QBox, ESX und Standalone. Die Erkennung wird von hz_lib uebernommen — einmal dort konfigurieren und HZ-Television (+ jedes andere Hz-Script) erbt es automatisch.

Kann ich mehrere TVs mit unterschiedlichem Inhalt gleichzeitig haben?

Ja — das ist eines der Hauptverkaufsargumente. Jeder TV in der Naehe zeigt seinen eigenen unabhaengigen Inhalt (keine Beschraenkung auf 5 Bildschirme mehr seit v2.3, keine Beschraenkung auf 12 TVs seit dem DrawSpritePoly-Rewrite). Auch die DashScreen-Funktion — jedes Fahrzeug mit einem hz_dashscreen-Item erhaelt seine eigene texturisolierte Variante, sodass 12 Autos im Verkehr = 12 verschiedene Smart TVs.

Wie viele Spieler koennen denselben TV gleichzeitig schauen?

Unbegrenzt. Die Echtzeitsynchronisation erfolgt ueber kennzeichen- und koordinatenbasierte Events (Heartbeat 5 s, Drifttoleranz 1,5 s, Praezision 0,1 s, sofortiges Seek/Play/Pause). Spieler, die spaeter dazukommen, erhalten die exakte Wiedergabeposition beim Verbinden.

Und Routing Buckets / Instanzen?

Vollstaendig Routing-Bucket-kompatibel seit v3.1.2. TVs, Werbetafeln, Betreibersperren und Playlist-Schleifen sind alle pro Instanz isoliert. Zwei TVs an denselben Koordinaten in verschiedenen Instanzen ueberschneiden sich nie.

Verbraucht es viele Ressourcen?

Client im Ruhezustand: ~0,01 ms. Sechs aktive TVs auf dem Bildschirm: ~0,03 ms (DrawSpritePoly-Vertexdaten im Cache). Server: ~0,00 ms. Siehe Leistung.


Installation

Fehler: "Resource HZ-TelevisionProps not found"

hz_televisionprops wird mit Ihrem HZ-Television-Download (v3.4+) mitgeliefert, muss aber separat in der server.cfg mit ensure geladen werden. Fuegen Sie ensure hz_televisionprops vor ensure hz_television hinzu. Ohne dies werden die 12 DashScreen-Prop-Varianten nicht gestreamt und die DashScreen-Platzierung bleibt stumm bei lib.requestModel haengen.

Fehler: "Menu system not detected"

Das Skript erfordert ox_lib (empfohlen) oder qb-menu + qb-input. Installieren Sie eines davon und laden Sie es mit ensure vor hz_lib (das wiederum vor HZ-Television startet).

TV-Items erscheinen nicht in meinem Inventar

Sie muessen die Items manuell zur Item-Datei Ihres Inventars hinzufuegen. Vorkonfigurierte Ausschnitte befinden sich in hz_television/items/:


  • ox_inventory.txt -> ox_inventory/data/items.lua

  • qb-inventory.txt -> qb-core/shared/items.lua (oder qbx_core/shared/items.lua)

  • qs-inventory.txt -> qs-inventory/shared/items.lua


Vollstaendiger Server-Neustart erforderlich nach dem Hinzufuegen von Items (nicht nur restart hz_television).

Ich verwende ak47_inventory — Items werden angezeigt, aber loesen bei Verwendung nichts aus

ak47_inventory gehoert nicht zur automatisch erkannten Liste von hz_lib (ox_inventory, qb-inventory, qs-inventory, ps-inventory, codem-inventory, origen_inventory, core_inventory, tgiann-inventory). Die Bridge faellt auf natives ESX zurueck, aber ak47 faengt Item-Nutzungsevents ab, bevor ESX sie sieht, sodass RegisterUsableItem nie ausgeloest wird.

Behebung gemaess der ak47_inventory-Dokumentation: Verknuepfen Sie den Callback direkt in der Item-Definition mit server.onUse. Oeffnen Sie die ak47-Item-Konfiguration (typischerweise ak47_inventory/shared/items.lua oder ak47_inventory/configs/items.lua) und fuegen Sie hinzu:

["hz_dashscreen"] = {
    name   = "hz_dashscreen",
    label  = "DashScreen Screen",
    weight = 3000,
    type   = "item",
    close  = true,
    server = {
        onUse = function(source, item)
            TriggerClientEvent('hz_television:useItem', source, { name = 'hz_dashscreen' })
        end,
    },
},

Wiederholen Sie dies fuer hz_television_screen, falls Sie auch Wand-TVs / Kinos verwenden. Legen Sie das entsprechende .png in den UI-Bildordner Ihres ak47. Dann ensure ak47_inventory und ensure hz_television.

SQL Error 1067 oder 1075 beim Import von install.sql

Beides sind MariaDB-Strict-Mode-Ablehnungen, die in v3.4.6 behoben wurden:

  • Error 1067 bei last_logintimestamp DEFAULT NULL erfordert eine explizite NULL-Deklaration im Strict-Mode. Jetzt timestamp NULL DEFAULT NULL
  • Error 1075 bei hz_dashscreen_placed — die id AUTO_INCREMENT-Spalte benoetigte einen PRIMARY KEY. Jetzt deklariert
Aktualisieren Sie auf v3.4.6+ und fuehren Sie die neue install.sql erneut aus. CREATE TABLE IF NOT EXISTS ueberspringt bereits erstellte Tabellen, sodass nur die zwei zuvor fehlgeschlagenen Tabellen erstellt werden. Keine Datenmigration.
Generic_texture_renderer_gfx — brauche ich das? Nein. Seit v2.3 verwendet die Render-Engine DrawSpritePoly direkt. Die alte Scaleform-Abhaengigkeit wurde entfernt.
Wie aktualisiere ich?
  1. Laden Sie die neueste Version von keymaster.fivem.net herunter
  2. Sichern Sie Ihre config.lua und tv_config.json
  3. Ersetzen Sie alle Dateien ausser diesen beiden
  4. Pruefen Sie den Changelog auf neue Konfigurationsschluessel
  5. Starten Sie den Server neu
Fuer v3.3 -> v3.4 speziell: Fuegen Sie ensure hz_televisionprops zur server.cfg hinzu und pruefen Sie die neuen Felder Config.Placer.BlockOnRoad / MaxPerPlayer / AutoCleanupDays.

DashScreen (v3.2+)

Wie platziere ich ein DashScreen in meinem Fahrzeug?
  1. Legen Sie das Item hz_dashscreen in Ihr Inventar
  2. Steigen Sie in ein Fahrzeug (Fahrersitz)
  3. Verwenden Sie das Item — ein Vorschau-Prop erscheint auf dem Armaturenbrett und ein Tastatur-Gizmo uebernimmt die Steuerung
  4. Pfeiltasten = Position, Mausrad = Hoehe, Q/D (oder A/D) = Drehung, Z/S (oder W/S) = Neigung, Enter = Bestaetigen, Escape = Abbrechen
  5. Nach der Platzierung verwenden Sie Ihr Target-System (ox\_target / qb-target) am Fahrzeug fuer Turn On DashScreen -> Smart TV
Das Fahrzeug driftet waehrend der Gizmo-Anpassung

Behoben in v3.4 — das Fahrzeug wird jetzt automatisch waehrend der gesamten Gizmo-Dauer eingefroren (FreezeEntityPosition + Geschwindigkeit auf Null + Steuerung deaktiviert). Aufgetaut bei Bestaetigung / Abbruch.

Die Kamera schaut nicht nach vorne, wenn ich das DashScreen-Item verwende

Behoben in v3.4 — die Ego-Kamera rastet jetzt bei heading=0 / pitch=0 beim Wechsel in die Cockpit-Ansicht ein, unabhaengig von der vorherigen Blickrichtung des Spielers.

Warum hoere ich das DashScreen nicht, wenn ich ausserhalb des Fahrzeugs bin?

Das ist beabsichtigt — DashScreen ist Kabinen-Audio, kein Lautsprecher. Die Web-Audio-Okklusionspipeline (v3.3) schneidet jenseits von 5 m vom Fahrzeug vollstaendig ab. Innerhalb des Fahrzeugs (Fahrer + Beifahrer) ist das Audio vollstaendig sauber und ungefiltert. Zuhoerer in einer 5-m-Blase ausserhalb erhalten eine Lowpass-gefilterte und lautstaerkegedaempfte Version basierend auf der Anzahl geoeffneter Tueren.

Passen Sie Config.DashScreen.AudioCabinRange an, wenn Sie eine andere Blasengroesse wuenschen.

Kann ich mehr als 12 DashScreens auf der Karte haben?

Ja — unbegrenzte Platzierungen. Jeder Client rendert die 12 naechstgelegenen (eine pro texturisolierter Variante), sodass jenseits von 12 gleichzeitig sichtbaren auf demselben Client die entferntesten unsichtbar werden, bis Sie sich naehern.

Ich moechte die DashScreen-Funktion im Fahrzeug nicht

Deaktivieren Sie sie sauber ueber config.lua (v3.4.5+):

Config.DashScreen = { Enabled = false }

Dies ueberspringt die RegisterUsableItem-Schleife fuer hz_dashscreen*, die Target-Optionsregistrierung, die Platzierungsaufforderung, den Reconciliation-Tick — alles DashScreen-Spezifische. Wand-TVs / Kino / Werbetafeln funktionieren weiterhin normal.

Mein DashScreen faellt manchmal nach einem heftigen Crash ab

Behoben in v3.4.6 — die not-attached-Invariante des Reconciliation-Ticks erkennt, wenn IsEntityAttached(prop) false zurueckgibt (der Prop wurde durch Kollisionsphysik geloest), gibt den Slot frei und erwirbt ihn beim naechsten Durchlauf (≤ 500 ms) wieder. Der Prop wird am selben Fahrzeug an seinen urspruenglichen Offsets replatziert, und das DUI reaktiviert sich automatisch, da PoweredOn[cpId] ueber den Freigabezyklus hinweg erhalten bleibt.

Aktivieren Sie Config.Debug = true, um den Freigabegrund (not-attached) in der F8-Konsole zu sehen.


Nutzung

Der Bildschirm ist schwarz oder nichts wird angezeigt Checkliste:
  1. Ist der TV eingeschaltet? (Turn On ueber das Target-Menue)
  2. Wurde das Modell kalibriert? Verwenden Sie /tvcfg in der Naehe des Props — die Live-Cyan-Vorschau zeigt genau, wo sich die Cursor-Klickzone befindet
  3. Fuer grosse Vanilla-Werbetafeln fuegen Sie das Modell in Config.BillboardUseSmartTV hinzu (die automatische Render-Target-Erkennung in v3.3 uebernimmt dies automatisch)
  4. Testen Sie zuerst mit einer einfachen direkten Videodatei, nicht mit einem Livestream
  5. Pruefen Sie die F8-Konsole auf JS-Fehler
Cursor-Klicks sind versetzt / verfehlen Symbole
  • Flache Props: Verwenden Sie /tvcfg und passen Sie Scale / Offset / Rotation an. Die Cyan-Vorschau entspricht genau der Klickzone.
  • Gebogene Props: Stellen Sie sicher, dass das Modell einen Curve = { Radius, Arc, Invert }-Eintrag hat und die Bogen-Vorschau (16 Cyan-Segmente) mit der tatsaechlichen Oberflaeche uebereinstimmt. Setzen Sie Curve.Invert = true fuer Props, die sich zum Betrachter hin woelben.
Kein Ton / Ton zu leise
  • Schalten Sie den TV ein
  • Gehen Sie naeher heran — die Lautstaerke nimmt linear zwischen MinSoundDistance und MaxSoundDistance ab
  • Erhoehen Sie Config.Display.MaxSoundDistance fuer groessere Audioreichweite
  • Fuer DashScreen: Audio spielt nur innerhalb des Fahrzeugs (+ eine 5-m-Blase darum)
Eine Video-URL spielt nicht ab Eingebettete Quellen: Manche Seiten deaktivieren die Einbettung oder beschraenken sie regional. Testen Sie die URL in einem normalen Browser im Inkognito-Modus — wenn sie dort in einer Einbettung nicht abspielt, wird sie auch im Spiel nicht abspielen. Live-Kanaele: Eine Stream-Quelle muss auf eine Live-Kanal-URL zeigen, nicht auf ein Archiv. V3 verwendet das native Player-SDK der Quelle, sofern vorhanden, sodass Lautstaerke / Pause / Stummschaltung nativ funktionieren.
Andere Spieler sehen meinen Web-Browser-Inhalt nicht (Seiten mit Login-Erfordernis)

Der TV jedes Spielers ist seine eigene unabhaengige CEF-Browserinstanz mit eigenen Cookies und eigener Sitzung. Das Skript synchronisiert die URL an alle Zuschauer, aber nicht den Sitzungsstatus — dies ist eine grundlegende Einschraenkung der Browserisolierung durch die DUI-Funktionsweise, kein Skriptfehler.

Eine URL, die von einem Konto abhaengt, wird daher pro Spieler gerendert; jeder sieht, was seine eigene Sitzung zurueckgibt. Nur oeffentlich erreichbare URLs werden fuer alle identisch dargestellt.

Spaeter dazukommende Spieler sehen den Video-/Browser-Inhalt nicht

Die Echtzeitsynchronisation (Heartbeat 5 s, Drifttoleranz 1,5 s) holt sie ein, wenn sie den TV streamen — sie erhalten automatisch die aktuelle Wiedergabeposition.

Falls spaeter dazukommende Spieler speziell im Browser-Modus einen schwarzen Bildschirm bekommen, liegt das Problem normalerweise an einer Race-Condition zwischen DUI-Erstellung und dem ersten SetDuiUrl-Aufruf beim Streamen des Spielers. Stellen Sie sicher, dass Ihr hz_television aktuell ist (die Browser-Synchronisation fuer spaetere Ankuenfte wurde in neueren Versionen mit Retry-Durchlaeufen verstaerkt).

Weitere Punkte:


  • OneSync muss aktiviert sein (set onesync on in server.cfg)

  • Falls Sie sich in einem Routing Bucket befinden, muessen beide Spieler im selben Bucket sein — Synchronisationsevents sind konzeptbedingt pro Bucket isoliert



Konfiguration

Wie fuege ich ein benutzerdefiniertes TV- / Werbetafel-Modell hinzu?
  1. Fuegen Sie einen Eintrag in Config.Models hinzu, indiziert nach Modellname, mit sinnvollen Scale / Offset / Rotation-Startwerten
  2. Laden Sie das Spiel, gehen Sie zum Prop
  3. Fuehren Sie /tvcfg aus -> waehlen Sie das Modell -> kalibrieren Sie mit dem 3D-Gizmo; die Cyan-Vorschau zeigt die Klickzone in Echtzeit
  4. Fuer gebogene Bildschirme aktivieren Sie Curve + setzen Sie Radius / Arc / Invert
  5. Speichern — die Werte werden in tv_config.json geschrieben
Wie verhindere ich, dass Spieler Props auf Strassen platzieren?

Aktivieren Sie den Strassenschutz v3.4:

Config.Placer.BlockOnRoad = true

Die Platzierungsvorschau wird rot, wenn auf eine Strassenflaeche gezielt wird, und Enter wird blockiert. DashScreen-Platzierung im Fahrzeug ist immer ausgenommen — das ist der Sinn von DashScreen.

Wie verhindere ich, dass inaktive Spieler endlos TVs hinterlassen?

Verwenden Sie die Verlassensschutz-Felder v3.4:

Config.Placer = {
    MaxPerPlayer        = 5,   -- striktes Limit pro Besitzer
    AutoCleanupDays     = 45,  -- Loeschung nach 45 Tagen Inaktivitaet
    AutoCleanupInterval = 6,   -- erneuter Scan alle 6 Stunden
}

Auch verfuegbar auf Abruf ueber /tvclean run (Admin-Befehl) oder exports['hz_television']:RunHZTVCleanup().

Wie loesche ich alle Platzierungen eines bestimmten Spielers?

/tvclean purge <identifier>

Ausserdem: /tvclean list zeigt die Top 20 Besitzer nach Inaktivitaet, um verlassene Konten zu finden.

Platzierte TVs verschwinden nach dem Neustart

Aktivieren Sie die Persistenz:

Config.Placer.Persistence = true

Erfordert oxmysql. Die Tabellen hz_television_placed und hz_dashscreen_placed werden automatisch erstellt (+ migriert fuer die Spalte last_seen).

Wie fuege ich vordefinierte Sender hinzu?

Config.Channels = {
    { name = 'Weazel News', url = 'https://example.com/stream.m3u8', category = 'news'  },
    { name = 'LS Rock Radio',url = 'https://example.com/stream.m3u8', category = 'music' },
}

Erscheint in einem "Channels"-Bereich in der Smart-TV-Oberflaeche.


Berechtigungen

TVs / Platzierung nur fuer Admins reservieren

Config.Permissions = {
    UseTV   = 'admin',
    PlaceTV = 'admin',
}

Einschraenkung nach Job

Config.Permissions = {
    UseTV   = 'job:police,ambulance',
    PlaceTV = 'job:estate',
}

Format: 'job:jobname' oder 'job:job1,job2' fuer mehrere.


Fortgeschritten / Integration

TVs synchronisieren sich nicht zwischen Spielern

Aktivieren Sie OneSync — set onesync on in server.cfg. Stellen Sie ausserdem sicher, dass Sie einen einigermaassen aktuellen FiveM-Build verwenden (2802+).

Lag / Ruckeln bei vielen TVs

Seit v3.1 cached die Render-Engine die Vertexdaten, sodass 6 TVs auf dem Bildschirm ungefaehr so viel kosten wie 1 TV vor dem Cache. Falls weiterhin Probleme auftreten, senken Sie Config.Display.RenderDistance (z. B. 30 m) und Config.Display.DefaultRange (z. B. 20 m).

Fehler "Failed to load video" in F8

Normalerweise eine Einbettungsbeschraenkung, regionale Sperre oder geloeschtes Video. Testen Sie die URL in einem normalen Browser im Inkognito-Modus. Falls die URL Browser-Rendering erfordert, uebergeben Sie mode = 'browser' beim Aufruf von PlayVideoOnTelevision.

Wie deaktiviere ich Werbetafeln vollstaendig?

Entfernen Sie die Werbetafel-Modelle aus Config.BillboardUseSmartTV UND aus Config.Models. Die Vanilla-GTA-V-Werbetafeln (prop_huge_display_01/02) fallen dann auf ihren Standard-Render-Target-Inhalt zurueck (der im Spiel normalerweise nichts anzeigt).

Wie integriere ich mit esx\_property / qb-houses?

Verwenden Sie Server-Events, um die Platzierung einzuschraenken — siehe Exports & Events fuer vollstaendige Beispiele.

AddEventHandler('hz_television:placeTV', function(model, coords, heading)
    local src = source
    if not exports['esx_property']:IsPlayerInOwnedProperty(src) then
        TriggerClientEvent('esx:showNotification', src, 'You must be in your property')
        CancelEvent()
    end
end)

Notfall-Uebertragung auf allen TVs

Verwenden Sie PlayVideoOnTelevision auf der Liste, die Sie ueber GetAllPlacedTVs erhalten — siehe die Exports-Beispiele.


Keine Antwort gefunden? Treten Sie unserem Discord bei und oeffnen Sie ein Ticket in #support.