Installation

Étape 1 — Téléchargement

Après votre achat sur hzscripts.com/shop, votre compte FiveM Keymaster reçoit deux assets séparés :

  1. Connectez-vous sur keymaster.fivem.net (ou portal.cfx.re/assets)
  2. Allez dans Granted Assets
  3. Téléchargez les deux :
* hz_television — le script principal * hz_televisionprops — les 12 variantes de props DashScreen en véhicule (livrées comme un asset dédié pour que les mises à jour des props ne forcent pas un re-telechargement de la ressource logique complète)
Les deux téléchargements sont requis. Les deux assets apparaissent comme des entrées séparées sur votre portail Keymaster — vous devez récupérer les deux. Si vous ne téléchargez que hz_television, les 12 modèles de props DashScreen ne seront pas streames et le placement DashScreen restera bloque silencieusement à lib.requestModel.
Important : utilisez le même compte FiveM que celui lié à votre licence Tebex. Les scripts sont protégés par escrow et nécessitent une licence valide.

Étape 2 — Dépendances

Requises

  1. hz_lib — asset gratuit depuis hzscripts.com/shop. Gère la détection framework / inventaire / target / menu / notification. Utilisez toujours la dernière version — chaque release de HZ-Television est testée avec la dernière version du Bridge. Doit démarrer avant HZ-Television. Voir Installation hz_lib.
  2. HZ-TelevisionProps — téléchargé séparément depuis Keymaster aux cotes de HZ-Television (voir Étape 1). Streame les 12 variantes de props DashScreen (hz_dashscreen + hz_dashscreen_1..11) + leur JSON de calibration. Doit démarrer avant HZ-Television.
  3. Un système de menu — au moins l'un des suivants :
* ox\_lib (recommande) — overextended/ox\_lib * qb-menu + qb-input — fournis avec QBCore / QBox
  1. Un driver SQL (requis pour la persistance, les comptes, les playlists, le nettoyage abandon). HZ-Television détecté automatiquement les deux au démarrage :
* oxmysql (recommande — moderne, activement maintenu) — overextended/oxmysql * mysql-async (stack QBCore v1 legacy) — toujours supporté via le shim de compatibilité

Optionnelles

  • ox\_target ou qb-target — pour l'interaction par viseur (sinon fallback TextUI / DrawText3D)
  • lb-phone — requis pour l'application compagnon téléphone lb-hztelevision
Mettez à jour hz_lib avant de mettre à jour HZ-Television. Chaque release Hz-Script est testée avec la dernière build du Bridge — des versions incompatibles provoqueront des erreurs "export not found" ou une detection manquante au démarrage. Re-telechargez hz_lib depuis hzscripts.com/shop à chaque fois que vous récupérez une nouvelle release de HZ-Television.
Double compatibilité SQL (v3.4.1+) — HZ-Television détecté automatiquement au démarrage si vous utilisez oxmysql ou mysql-async et installe le shim MySQL.Async correspondant. Vous verrez l'une de ces lignes dans la console serveur au démarrage :

[hz_television] SQL compat: detected oxmysql, MySQL.Async shim installed
[hz_television] SQL compat: detected existing MySQL.Async (mysql-async or compatible)

Si vous voyez un ERROR: no SQL resource detected en rouge, assurez-vous que ensure oxmysql (ou ensure mysql-async) se trouve avant ensure hz_television dans votre server.cfg.

hz_lib centralise la détection. Vous ne configurez plus le framework / target / inventaire par script — definissez-les une seule fois dans hz_lib/config.lua et chaque Hz-Script en hérite. Voir Configuration hz_lib.

Étape 3 — Fichiers

  1. Extrayez les deux archives (hz_television.zip et hz_televisionprops.zip) téléchargées depuis Keymaster à l'Étape 1
  2. Placez les deux dossiers résultants dans votre répertoire resources/ — les regrouper dans un dossier de catégorie commun comme [hz-scripts]/ permet de garder les choses ordonnées
server/
├── resources/
│   ├── ox_lib/
│   ├── oxmysql/                    ← ou mysql-async (les deux sont supportes)
│   ├── [hz-scripts]/
│   │   ├── hz_lib/
│   │   ├── hz_televisionprops/        ← 2eme telechargement Keymaster (12 props DashScreen + calibration.json)
│   │   ├── hz_television/          ← 1er telechargement Keymaster (le script principal)
│   │   │   ├── client/
│   │   │   ├── server/
│   │   │   ├── html/
│   │   │   ├── config.lua
│   │   │   ├── fxmanifest.lua
│   │   │   └── ...

Étape 4 — Items d'inventaire

HZ-Television est livré avec 10 items placables prêts à l'emploi. Des définitions d'items pre-configurees pour chaque inventaire supporte se trouvent dans hz_television/items/.

Items fournis

ItemPropDescription
hz_tv_s / hz_tv_m / hz_tv_lhz_tv_*Smart TV murales — petite / moyenne / grande
hz_tv_s_stand / hz_tv_m_stand / hz_tv_l_standhz_tv_*_standSmart TV sur pied — petite / moyenne / grande
curved_screen_s / curved_screen_m / curved_screen_lprop_curved_screen_*Écrans cinéma courbes
hz_dashscreenhz_dashscreen + 11 variantesDashScreen en véhicule (place via le gizmo clavier)

Pour ox\_inventory

Ouvrez ox_inventory/data/items.lua et ajoutez le contenu de hz_television/items/ox_inventory.txt (10 entrées incluant hz_dashscreen).

Exemple d'entrée :

['hz_tv_m'] = {
    label = 'Smart TV (Medium)',
    weight = 12000,
    stack = true,
    close = true,
    description = 'A medium wall-mounted smart TV',
    client = {
        event = 'hz_television:useItem'
    }
},
['hz_dashscreen'] = {
    label = 'DashScreen Screen',
    weight = 3000,
    stack = true,
    close = true,
    description = 'Dashboard Smart TV — use while sitting in a vehicle',
    client = {
        event = 'hz_television:useItem'
    }
},

Pour qb-inventory / qs-inventory / ps-inventory

Copiez le contenu du fichier hz_television/items/<inventory>.txt correspondant dans le fichier d'items de votre inventaire.

Tous les items passent par le même événement client HZ-Television:useItem, que le script intercepte et redirige vers le bon flux de placement (gizmo statique pour les TV, gizmo clavier en véhicule pour DashScreen).

Étape 5 — Base de données (recommandé)

La base de données est optionnelle mais fortement recommandée — sans elle, vous perdez la persistance des TV placées, le système de comptes, la playlist personnelle et la fonctionnalité de nettoyage abandon.

Activez dans config.lua :

Config.Placer = {
    Persistence        = true,   -- les TV + DashScreens places survivent au redemarrage
    MaxPerPlayer       = 0,      -- 0 = illimite, N = limite par identifiant proprietaire
    AutoCleanupDays    = 0,      -- 0 = desactive, N = suppression auto apres N jours d'inactivite
    AutoCleanupInterval = 6,     -- heures entre les cycles de nettoyage (0 = au demarrage uniquement)
    BlockOnRoad        = false,  -- true = bloque le placement de props sur les routes (DashScreen exempt)
    CleanupAdminPermission = 'admin',  -- permission ACE pour /tvclean
}

Les tables suivantes sont créées automatiquement au premier démarrage (toutes utilisent CREATE TABLE IF NOT EXISTS + migrations additives ALTER TABLE ADD COLUMN IF NOT EXISTS) :

  • hz_television_placed — TV statiques placées (murales, sur pied, courbées, panneaux)
  • hz_dashscreen_placed — placements DashScreen indexes par plaque de véhicule
  • hz_tv_users, hz_tv_sessions, hz_tv_favorites, hz_tv_history, hz_tv_playlists, hz_tv_playlist_items — compte / connexion / favoris / historique / playlists (alimentes lors de la première connexion Smart TV)

Installation manuelle (fallback — v3.4.3+)

Si une table ne peut pas être créée automatiquement (utilisateur MySQL sans permission CREATE, chaîne de connexion pointant vers la mauvaise base, etc.), vous verrez une erreur rouge dans la console serveur juste après [hz_television] SQL compat: ... avec le nom exact de la table + l'erreur. Dans ce cas, exécutez le fichier install.sql fourni manuellement :

mysql -u <user> -p <database> < resources/[standalone]/hz_television/install.sql

...ou ouvrez hz_television/install.sql dans phpMyAdmin / HeidiSQL / DBeaver et executez-le sur la base de données de votre serveur. Puis redémarrez hz_television. Le script ne contient que des instructions CREATE TABLE IF NOT EXISTS, donc l'exécuter deux fois est sans risque.

v3.4.3+ uniquement — l'ancienne erreur Table 'yourdb.hz_tv_sessions' doesn't exist à la connexion échoue maintenant proprement avec une réponse db_not_ready au lieu de crasher, et le log serveur vous dirige vers install.sql. Les versions précédentes faisaient crasher le flux de session.

Étape 6 — server.cfg

Ajoutez les ressources à votre server.cfg dans cet ordre :

# Dependances (doivent demarrer AVANT hz_lib)
ensure oxmysql                # ou `ensure mysql-async` — HZ-Television supporte les deux
ensure ox_lib                 # ou qb-menu + qb-input
ensure ox_target              # ou qb-target (optionnel)

# Framework (si applicable)
ensure qbx_core               # ou ensure qb-core, ou ensure es_extended
# ensure qb-core
# ensure es_extended

# HZ-Scripts — l'ordre compte
ensure hz_lib              # gere la detection automatique
ensure hz_televisionprops        # streame les 12 variantes de props DashScreen (telechargement Keymaster separe)
ensure hz_television          # la ressource logique TV

L'ordre de démarrage est critique. hz_lib, hz_televisionprops et votre driver SQL (oxmysql ou mysql-async) doivent tous démarrer avant hz_television. Si hz_televisionprops n'est pas assure, les 12 modèles de variantes DashScreen ne seront pas streames et le placement DashScreen échouera silencieusement à lib.requestModel. Si aucun driver SQL n'est assure, la persistance cesse de fonctionner silencieusement.

Étape 7 — Configuration

Ouvrez hz_television/config.lua et adaptez les paramètres. Voir Configuration pour chaque option en détail.

Points essentiels à vérifier avant la mise en production :
  • Config.Locale — 'en' / 'fr' / 'es' / 'de'
  • Config.Permissions — qui peut utiliser /tvcfg, placer des TV, utiliser les TV
  • Config.Placer.Persistence — true pour activer la sauvegarde en base
  • Config.Placer.BlockOnRoad — true si vous voulez bloquer le placement sur les routes
  • Config.Placer.MaxPerPlayer + Config.Placer.AutoCleanupDays — protection abandon
  • Config.BillboardUseSmartTV — quels modèles de panneaux/cinema doivent utiliser l'interface Smart TV complète (par défaut : les 3 props cinéma courbes + 2 grands panneaux vanilla)
Les paramètres framework / target / menu / notification / inventaire sont gérés dans hz_lib — voir Configuration hz_lib.

Étape 8 — Vérification

  1. Démarrez le serveur
  2. La console devrait afficher (dans l'ordre) :
* [hz_lib] <framework> detected, <inventory> detected, ... * [hz_televisionprops] shared/models.lua loaded [hz_television] SQL compat: detected oxmysql, MySQL.Async shim installed (ou detected existing MySQL.Async (mysql-async or compatible))* * [hz_television] v3.4.1 loaded successfully * [hz_television] Database tables initialized
  1. Connectez-vous en jeu
  2. Approchez-vous d'un prop TV (TV murale, écran cinéma courbe, ou utilisez l'item hz_dashscreen dans un véhicule)
  3. Sélectionnez Power On → Smart TV → collez une URL vidéo
Termine ! Si l'interface Smart TV s'ouvre et que votre URL se lit, le script fonctionne. Passez à Configuration pour personnaliser les modèles, les permissions et les seuils de protection abandon.

Dépannage rapide

Le script ne démarre pas

Vérifiez :


  • Les dossiers sont correctement nommes hz_television, hz_televisionprops, hz_lib (sensible à la casse)

  • Les trois sont ensures dans server.cfg dans le bon ordre (Bridge → TelevisionProps → Television)

  • Votre licence FiveM est valide sur Keymaster

  • Un système de menu (ox_lib ou qb-menu) est ensure avant hz_lib

Erreur "Framework not detected"

La detection est gérée par hz_lib. Assurez-vous que :


  • es_extended, qb-core ou qbx_core est ensure avant hz_lib

  • hz_lib est ensure avant HZ-Television

  • Vérifiez la ligne console de hz_lib pour confirmer la détection automatique

  • Forcez un framework si nécessaire dans le config.lua de hz_lib — ex. HZBridge.Framework = 'esx'

Le placement DashScreen échoue silencieusement

Cause la plus courante : hz_televisionprops n'est pas démarre. lib.requestModel(hz_dashscreen) reste bloqué indéfiniment car le modèle n'est pas streame.

hz_televisionprops est un téléchargement séparé sur Keymaster — il n'est pas inclus avec hz_television. Confirmez :


  • Les deux assets sont listes dans vos Granted Assets Keymaster et ont été téléchargés

  • Le dossier hz_televisionprops se trouve à côté de hz_television dans resources/

  • ensure hz_televisionprops est dans votre server.cfg avant ensure hz_television

  • La ressource est listée comme started dans la console serveur

Les TV placées ne sont pas sauvegardées après redémarrage / Erreur "no SQL resource detected"

HZ-Television a besoin soit de oxmysql soit de mysql-async en fonctionnement. Au démarrage, la console serveur affiche l'un des messages suivants :

[hz_television] SQL compat: detected oxmysql, MySQL.Async shim installed
[hz_television] SQL compat: detected existing MySQL.Async (mysql-async or compatible)
[hz_television] ERROR: no SQL resource detected (oxmysql or mysql-async)

Si vous obtenez l'erreur rouge :


  • Assurez-vous que ensure oxmysql (ou ensure mysql-async) est dans server.cfg

  • Il doit être placé avant ensure hz_television — si la ressource SQL se charge après, la détection runtime la manque

  • Les deux drivers sont supportés — choisissez-en un ; ne les exécutez pas simultanément

Erreur "Table 'yourdb.hz_tv_sessions' doesn't exist" quand un joueur se connecte sur une Smart TV

L'étape de création automatique n'a pas pu construire une ou plusieurs tables. Vous verrez des lignes rouges juste après SQL compat: detected ... pendant le démarrage :

[hz_television] CREATE TABLE hz_tv_sessions FAILED: <error>
[hz_television] Import hz_television/install.sql manually to create the missing tables.

Correctif (v3.4.3+) :

mysql -u <user> -p <database> < resources/[standalone]/hz_television/install.sql

Ou ouvrez hz_television/install.sql dans phpMyAdmin / HeidiSQL / DBeaver et executez-le sur la base de données de votre serveur. Puis redémarrez hz_television. Le fichier ne contient que des instructions CREATE TABLE IF NOT EXISTS — l'exécuter deux fois est sans risque.

Causes courantes de l'échec de la création automatique :


  • L'utilisateur MySQL configure dans set mysql_connection_string n'a pas la permission CREATE sur la base cible → accordez CREATE, ALTER, INDEX et redémarrez

  • La chaîne de connexion pointe vers une base que l'utilisateur peut lire mais pas écrire → vérifiez le nom de la base

  • MySQL tourne en mode STRICT avec des paramètres de session incompatibles → install.sql définit explicitement SQL_MODE = '' en haut pour contourner ce problème


Si vous voyez SQL Error 1067 (Invalid default value for 'last_login') ou SQL Error 1075 (Incorrect table definition; there can be only one auto column and it must be defined as a key) lors de l'import de install.sql, vous êtes sur une ancienne version de HZ-Television. Les deux erreurs ont été corrigées dans v3.4.6 — mettez à jour et re-executez le nouveau install.sql.

Sur v3.4.3+, le flux de connexion échoue maintenant proprement avec db_not_ready quand les tables sont manquantes, au lieu de crasher en pleine requête.

L'écran reste noir / pas d'affichage
  • Utilisez /tvcfg près de la TV pour calibrer Scale/Offset/Rotation (l'aperçu cyan en direct montre exactement ou se trouve la zone de clic du curseur)
  • Testez avec un simple fichier vidéo direct d'abord (pas un livestream)
  • Vérifiez la console F8 pour des erreurs JavaScript
  • Pour les grands panneaux vanilla, assurez-vous que le modèle est dans Config.BillboardUseSmartTV (la détection automatique du render target en v3.3 les gère)
Pas de son ou son global
  • Augmentez Config.Display.MaxSoundDistance dans config.lua
  • Assurez-vous que la TV est allumée
  • Rapprochez-vous (le volume diminue entre MinSoundDistance et MaxSoundDistance)
  • Pour le DashScreen spécifiquement : l'audio à une portée cabine de 5 m avec occlusion Web Audio. Le conducteur + les passagers ont un son propre et complet ; les auditeurs extérieurs reçoivent un son filtre et atténue
Les items TV n'apparaissent pas dans l'inventaire
  • Ajoutez les items depuis hz_television/items/<inventory>.txt dans le fichier d'items de votre inventaire
  • Redémarrez le serveur complètement après avoir ajoute les items (pas seulement la ressource)
  • Pour ox\_inventory le chemin est ox_inventory/data/items.lua
  • Pour QBCore/QBox c'est qb-core/shared/items.lua ou qbx_core/shared/items.lua