FAQ

Général

Le script est-il compatible avec mon framework ?

HZ-Television supporte QBCore, QBox, ESX et Standalone. La détection est gérée par hz_lib — configurez une seule fois la-bas et HZ-Television (+ chaque autre Hz-Script) en hérite automatiquement.

Puis-je avoir plusieurs TV avec du contenu différent en même temps ?

Oui — c'est l'un des principaux arguments de vente. Chaque TV à proximité affiche son propre contenu indépendant (plus de limite à 5 écrans depuis v2.3, plus de limite à 12 TV depuis la réécriture DrawSpritePoly). Même la fonctionnalité DashScreen — chaque véhicule avec un item hz_dashscreen obtient sa propre variante a texture isolée, donc passer devant 12 voitures dans le trafic = 12 Smart TV différentes.

Combien de joueurs peuvent regarder la même TV ?

Illimité. La synchronisation temps réel est gérée via des événements bases sur la plaque et les coordonnées (heartbeat 5 s, tolérance de dérive 1.5 s, précision 0.1 s, seek/play/pause instantané). Les joueurs arrivant en retard reçoivent la position exacte de lecture à la connexion.

Et les routing buckets / instances ?

Entièrement compatible routing bucket depuis v3.1.2. Les TV, panneaux d'affichage, verrous opérateur et boucles de playlist sont tous isoles par instance. Deux TV aux mêmes coordonnées dans des instances différentes ne se chevauchent jamais.

Est-ce que ça utilise beaucoup de ressources ?

Client au repos : ~0.01 ms. Six TV actives à l'écran : ~0.03 ms (données de sommets DrawSpritePoly en cache). Serveur : ~0.00 ms. Voir Performance.


Installation

Erreur : "Resource HZ-TelevisionProps not found"

hz_televisionprops est fourni avec votre téléchargement HZ-Television (v3.4+) mais doit être ensure séparément dans server.cfg. Ajoutez ensure hz_televisionprops avant ensure hz_television. Sans cela, les 12 variantes de props DashScreen ne sont pas streamees et le placement DashScreen reste bloqué silencieusement a lib.requestModel.

Erreur : "Menu system not detected"

Le script necessite ox_lib (recommande) ou qb-menu + qb-input. Installez-en un et ensure-le avant hz_lib (qui lui-même démarre avant HZ-Television).

Les items TV n'apparaissent pas dans mon inventaire

Vous devez ajouter manuellement les items dans le fichier d'items de votre inventaire. Des extraits pre-configures se trouvent dans hz_television/items/ :


  • ox_inventory.txt → ox_inventory/data/items.lua

  • qb-inventory.txt → qb-core/shared/items.lua (ou qbx_core/shared/items.lua)

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


Redémarrage complet du serveur requis après avoir ajoute les items (pas seulement restart hz_television).

J'utilise ak47_inventory — les items s'affichent mais ne se déclenchent pas à l'utilisation

ak47_inventory ne fait pas partie de la liste auto-detectee de hz_lib (ox_inventory, qb-inventory, qs-inventory, ps-inventory, codem-inventory, origen_inventory, core_inventory, tgiann-inventory). Le bridge retombe sur ESX natif, mais ak47 intercepte les événements d'utilisation d'item avant qu'ESX ne les voie, donc RegisterUsableItem ne se declenche jamais.

Correctif selon la documentation ak47_inventory : branchez le callback directement dans la définition de l'item avec server.onUse. Ouvrez la config d'items ak47 (typiquement ak47_inventory/shared/items.lua ou ak47_inventory/configs/items.lua) et ajoutez :

["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,
    },
},

Répétez pour hz_television_screen si vous utilisez aussi les TV murales / cinéma. Déposez le .png correspondant dans le dossier d'images UI de votre ak47. Puis ensure ak47_inventory et ensure hz_television.

SQL Error 1067 ou 1075 lors de l'import de install.sql

Les deux sont des rejets de mode strict MariaDB corriges dans v3.4.6 :

  • Error 1067 sur last_login — timestamp DEFAULT NULL nécessite une déclaration NULL explicite en mode strict. Maintenant timestamp NULL DEFAULT NULL
  • Error 1075 sur hz_dashscreen_placed — la colonne id AUTO_INCREMENT nécessitait une PRIMARY KEY. Maintenant déclarée
Mettez à jour vers v3.4.6+ et re-executez le nouveau install.sql. CREATE TABLE IF NOT EXISTS ignore les tables déjà créées, donc seules les deux tables qui échouaient précédemment sont créées. Pas de migration de données.
Generic_texture_renderer_gfx — en ai-je besoin ? Non. Depuis v2.3, le moteur de rendu utilise DrawSpritePoly directement. L'ancienne dépendance scaleform est supprimée.
Comment faire la mise à jour ?
  1. Téléchargez la dernière version depuis keymaster.fivem.net
  2. Sauvegardez votre config.lua et tv_config.json
  3. Remplacez tous les fichiers sauf ces deux-la
  4. Consultez le Changelog pour les nouvelles clés de configuration
  5. Redémarrez le serveur
Pour v3.3 → v3.4 spécifiquement : ajoutez ensure hz_televisionprops à server.cfg, et passez en revue les nouveaux champs Config.Placer.BlockOnRoad / MaxPerPlayer / AutoCleanupDays.

DashScreen (v3.2+)

Comment placer un DashScreen dans ma voiture ?
  1. Mettez l'item hz_dashscreen dans votre inventaire
  2. Montez dans un véhicule (siège conducteur)
  3. Utilisez l'item — un prop d'aperçu apparaît sur le tableau de bord et un gizmo clavier prend le contrôle
  4. Flèches = position, Molette = hauteur, Q/D (ou A/D) = rotation, Z/S (ou W/S) = inclinaison, Entrée = confirmer, Echap = annuler
  5. Une fois placé, utilisez votre système de target (ox\_target / qb-target) sur la voiture pour Turn On DashScreen → Smart TV
Le véhicule dérive pendant que j'ajuste le gizmo

Corrige en v3.4 — le véhicule est maintenant automatiquement fige pendant toute la durée du gizmo (FreezeEntityPosition + vitesse mise à zéro + contrôles désactives). Défige à la confirmation / annulation.

La caméra ne regarde pas vers l'avant quand j'utilise l'item DashScreen

Corrige en v3.4 — la caméra première personne se cale maintenant à heading=0 / pitch=0 au passage en vue cockpit, quelle que soit la direction visée par le joueur avant.

Pourquoi je n'entends pas le DashScreen quand je suis à l'extérieur de la voiture ?

C'est intentionnel — le DashScreen est un audio cabine, pas un haut-parleur. Le pipeline d'occlusion Web Audio (v3.3) coupe complètement au-delà de 5 m du véhicule. À l'intérieur de la voiture (conducteur + passagers), l'audio est entièrement propre et non filtre. Les auditeurs dans une bulle de 5 m à l'extérieur reçoivent une version filtrée en lowpass et atténuée en volume selon le nombre de portières ouvertes.

Ajustez Config.DashScreen.AudioCabinRange si vous voulez une taille de bulle différente.

Puis-je avoir plus de 12 DashScreens sur la carte ?

Oui — placements illimités. Chaque client affiche les 12 plus proches (un par variante a texture isolée), donc au-delà de 12 simultanément visibles sur le même client, les plus éloignés sont invisibles jusqu'a ce que vous vous approchiez.

Je ne veux pas de la fonctionnalité DashScreen en véhicule

Désactivez-la proprement via config.lua (v3.4.5+) :

Config.DashScreen = { Enabled = false }

Cela ignore la boucle RegisterUsableItem des hz_dashscreen*, l'enregistrement des options target, l'invite de placement, le tick de réconciliation — tout ce qui est spécifique au DashScreen. Les TV murales / cinéma / panneaux d'affichage continuent de fonctionner normalement.

Mon DashScreen tombe parfois après un crash violent

Corrige dans v3.4.6 — l'invariant not-attached du tick de réconciliation détecte quand IsEntityAttached(prop) retourne false (le prop a été détaché par la physique de collision), libère le slot, et le re-acquiert au prochain passage (≤ 500 ms). Le prop se replace sur le même véhicule a ses offsets d'origine, et le DUI se réactive automatiquement car PoweredOn[cpId] est préservé à travers le cycle de libération.

Activez Config.Debug = true pour voir la raison de libération (not-attached) dans la console F8.


Utilisation

L'écran est noir ou rien ne s'affiche Checklist :
  1. La TV est-elle allumée ? (Turn On via le menu target)
  2. Le modèle a-t-il été calibre ? Utilisez /tvcfg près du prop — l'aperçu cyan en direct montre exactement ou se trouve la zone de clic du curseur
  3. Pour les grands panneaux vanilla, ajoutez le modèle dans Config.BillboardUseSmartTV (la détection automatique du render target en v3.3 les gère automatiquement)
  4. Testez avec un simple fichier vidéo direct d'abord, pas un livestream
  5. Vérifiez la console F8 pour des erreurs JS
Les clics du curseur sont décalés / ratent les icônes
  • Props plats : utilisez /tvcfg et ajustez Scale / Offset / Rotation. L'aperçu cyan correspond exactement à la zone de clic.
  • Props courbes : assurez-vous que le modèle à une entrée Curve = { Radius, Arc, Invert } et que l'aperçu en arc (16 segments cyan) s'aligne avec la vraie surface. Définissez Curve.Invert = true pour les props qui courbent vers le spectateur.
Pas de son / son trop faible
  • Allumez la TV
  • Rapprochez-vous — le volume diminue linéairement entre MinSoundDistance et MaxSoundDistance
  • Augmentez Config.Display.MaxSoundDistance pour une portée audio plus grande
  • Pour le DashScreen : l'audio ne joue qu'a l'intérieur de la voiture (+ une bulle de 5 m autour)
Une URL vidéo ne se lit pas Sources embarquées : certaines pages désactivent l'intégration, ou la restreignent par région. Testez l'URL dans un navigateur normal en navigation privée — si ça ne joue pas dans une intégration la-bas, ça ne jouera pas en jeu non plus. Chaînes en direct : une source de flux doit pointer vers une URL de chaîne en direct, pas une archive. V3 utilise le SDK natif du lecteur de la source quand il existe, donc volume / pause / mute fonctionnent nativement.
Les autres joueurs ne voient pas mon contenu Web Browser (sites nécessitant une connexion)

La TV de chaque joueur est sa propre instance de navigateur CEF indépendante avec ses propres cookies et sa propre session. Le script synchronise l'URL vers tous les spectateurs, mais pas l'état de session — c'est une limitation fondamentale de l'isolation des navigateurs liée au fonctionnement des DUI, pas un bug du script.

Une URL qui dépend d'un compte s'affiche donc joueur par joueur, chacun voyant ce que sa propre session renvoie. Seules les URLs publiquement accessibles s'affichent à l'identique pour tout le monde.

Les joueurs arrivant en retard ne voient pas le contenu vidéo / navigateur

La synchronisation temps réel (heartbeat 5 s, tolérance de dérive 1.5 s) les rattrape quand ils streament la TV — ils obtiennent automatiquement la position de lecture actuelle.

Si vous constatez que les joueurs arrivant en retard obtiennent un écran noir sur le mode navigateur spécifiquement, le problème est généralement une condition de course entre la création du DUI et le premier appel SetDuiUrl quand le joueur streame. Assurez-vous que votre hz_television est à jour (la synchronisation navigateur pour les arrivées tardives a été renforcée dans les versions récentes avec des passes de retry).

Autres points à vérifier :


  • OneSync doit être activé (set onesync on dans server.cfg)

  • Si vous êtes dans un routing bucket, les deux joueurs doivent être dans le même bucket — les événements de synchronisation sont isoles par bucket par conception



Configuration

Comment ajouter un modèle TV / panneau d'affichage personnalise ?
  1. Ajoutez une entrée dans Config.Models indexée par nom de modèle avec des valeurs Scale / Offset / Rotation de départ raisonnables
  2. Chargez en jeu, approchez-vous du prop
  3. Exécutez /tvcfg → choisissez le modèle → calibrez avec le gizmo 3D ; l'aperçu cyan montre la zone de clic en temps réel
  4. Pour les écrans courbes, cochez Curve + définissez Radius / Arc / Invert
  5. Sauvegardez — les valeurs sont écrites dans tv_config.json
Comment empêcher les joueurs de placer des props sur les routes ?

Activez la protection route v3.4 :

Config.Placer.BlockOnRoad = true

L'aperçu de placement devient rouge quand on vise une surface de route et Entrée est bloqué. Le placement DashScreen en véhicule est toujours exempt — c'est le principe même du DashScreen.

Comment empêcher les joueurs inactifs de laisser des TV indéfiniment ?

Utilisez les champs de protection abandon v3.4 :

Config.Placer = {
    MaxPerPlayer        = 5,   -- limite stricte par proprietaire
    AutoCleanupDays     = 45,  -- suppression apres 45 jours d'inactivite
    AutoCleanupInterval = 6,   -- re-scan toutes les 6 heures
}

Également disponible à la demande via /tvclean run (commande admin) ou exports['hz_television']:RunHZTVCleanup().

Comment supprimer tous les placements d'un joueur spécifique ?

/tvclean purge <identifier>

Aussi : /tvclean list affiche le top 20 des propriétaires par inactivité pour vous aider à trouver les comptes abandonnes.

Les TV placées disparaissent au redémarrage

Activez la persistance :

Config.Placer.Persistence = true

Nécessite oxmysql. Les tables hz_television_placed et hz_dashscreen_placed sont créées (+ migrées pour la colonne last_seen) automatiquement.

Comment ajouter des chaînes pre-enregistrees ?

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' },
}

Apparaît dans une section "Channels" dans l'interface Smart TV.


Permissions

Réserver les TV / le placement aux admins uniquement

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

Restriction par job

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

Format : 'job:nomdujob' ou 'job:job1,job2' pour plusieurs.


Avance / Intégration

Les TV ne se synchronisent pas entre les joueurs

Activez OneSync — set onesync on dans server.cfg. Assurez-vous également d'être sur un build FiveM raisonnablement récent (2802+).

Lag / saccades avec beaucoup de TV

Depuis v3.1, le moteur de rendu met en cache les données de sommets, donc 6 TV à l'écran coûtent environ autant qu'1 TV avant le cache. Si vous rencontrez toujours des problèmes, baissez Config.Display.RenderDistance (ex. 30 m) et Config.Display.DefaultRange (ex. 20 m).

Erreur "Failed to load video" dans F8

Généralement une restriction d'intégration, un blocage régional ou une vidéo supprimée. Testez l'URL dans un navigateur normal en navigation privée. Si l'URL nécessite un rendu navigateur, passez mode = 'browser' lors de l'appel à PlayVideoOnTelevision.

Comment désactiver entièrement les panneaux d'affichage ?

Retirez les modèles de panneaux de Config.BillboardUseSmartTV ET de Config.Models. Les panneaux d'affichage vanilla GTA V (prop_huge_display_01/02) retomberont alors sur leur contenu render target par défaut (qui est généralement rien en jeu).

Comment intégrer avec esx\_property / qb-houses ?

Utilisez les événements serveur pour restreindre le placement — voir Exports & Événements pour des exemples complets.

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)

Diffusion d'urgence sur toutes les TV

Utilisez PlayVideoOnTelevision sur la liste obtenue via GetAllPlacedTVs — voir les exemples Exports.


Vous ne trouvez pas votre réponse ? Rejoignez notre Discord et ouvrez un ticket dans #support.