HZ Scripts

Installation

Etape 1 — Telechargement

Apres votre achat sur hzscripts.com/shop, votre compte FiveM Keymaster recoit deux assets separes :

  1. Connectez-vous sur keymaster.fivem.net (ou portal.cfx.re/assets)
  2. Allez dans Granted Assets
  3. Telechargez les deux :
* HZ-Television — le script principal * HZ-PropsCarplay — les 12 variantes de props CarPlay en vehicule (livrees comme un asset dedie pour que les mises a jour des props ne forcent pas un re-telechargement de la ressource logique complete)
Les deux telechargements sont requis. Les deux assets apparaissent comme des entrees separees sur votre portail Keymaster — vous devez recuperer les deux. Si vous ne telechargez que HZ-Television, les 12 modeles de props CarPlay ne seront pas streames et le placement CarPlay restera bloque silencieusement a lib.requestModel.
Important : utilisez le meme compte FiveM que celui lie a votre licence Tebex. Les scripts sont proteges par escrow et necessitent une licence valide.

Etape 2 — Dependances

Requises

  1. HZ-Bridge — asset gratuit depuis hzscripts.com/shop. Gere la detection framework / inventaire / target / menu / notification. Utilisez toujours la derniere version — chaque release de HZ-Television est testee avec la derniere version du Bridge. Doit demarrer avant HZ-Television. Voir Installation HZ-Bridge.
  2. HZ-PropsCarplay — telecharge separement depuis Keymaster aux cotes de HZ-Television (voir Etape 1). Streame les 12 variantes de props CarPlay (hz_carplay + hz_carplay_1..11) + leur JSON de calibration. Doit demarrer avant HZ-Television.
  3. Un systeme 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 detecte automatiquement les deux au demarrage :
* oxmysql (recommande — moderne, activement maintenu) — overextended/oxmysql * mysql-async (stack QBCore v1 legacy) — toujours supporte via le shim de compatibilite

Optionnelles

  • ox\_target ou qb-target — pour l'interaction par viseur (sinon fallback TextUI / DrawText3D)
  • lb-phone — requis pour l'application compagnon telephone lb-hztelevision
Mettez a jour HZ-Bridge avant de mettre a jour HZ-Television. Chaque release Hz-Script est testee avec la derniere build du Bridge — des versions incompatibles provoqueront des erreurs "export not found" ou une detection manquante au demarrage. Re-telechargez HZ-Bridge depuis hzscripts.com/shop a chaque fois que vous recuperez une nouvelle release de HZ-Television.
Double compatibilite SQL (v3.4.1+) — HZ-Television detecte automatiquement au demarrage 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 demarrage :
[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-Bridge centralise la detection. Vous ne configurez plus le framework / target / inventaire par script — definissez-les une seule fois dans HZ-Bridge/config.lua et chaque Hz-Script en herite. Voir Configuration HZ-Bridge.

Etape 3 — Fichiers

  1. Extrayez les deux archives (HZ-Television.zip et HZ-PropsCarplay.zip) telechargees depuis Keymaster a l'Etape 1
  2. Placez les deux dossiers resultants dans votre repertoire resources/ — les regrouper dans un dossier de categorie commun comme [hz-scripts]/ permet de garder les choses ordonnees
server/
├── resources/
│   ├── ox_lib/
│   ├── oxmysql/                    ← ou mysql-async (les deux sont supportes)
│   ├── [hz-scripts]/
│   │   ├── HZ-Bridge/
│   │   ├── HZ-PropsCarplay/        ← 2eme telechargement Keymaster (12 props CarPlay + calibration.json)
│   │   ├── HZ-Television/          ← 1er telechargement Keymaster (le script principal)
│   │   │   ├── client/
│   │   │   ├── server/
│   │   │   ├── html/
│   │   │   ├── config.lua
│   │   │   ├── fxmanifest.lua
│   │   │   └── ...

Etape 4 — Items d'inventaire

HZ-Television est livre avec 10 items placables prets a l'emploi. Des definitions 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_*Ecrans cinema courbes
hz_carplayhz_carplay + 11 variantesCarPlay en vehicule (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 entrees incluant hz_carplay).

Exemple d'entree :

['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_carplay'] = {
    label = 'CarPlay 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/.txt correspondant dans le fichier d'items de votre inventaire.

Tous les items passent par le meme evenement client HZ-Television:useItem, que le script intercepte et redirige vers le bon flux de placement (gizmo statique pour les TV, gizmo clavier en vehicule pour CarPlay).

Etape 5 — Base de donnees (recommande)

La base de donnees est optionnelle mais fortement recommandee — sans elle, vous perdez la persistance des TV placees, le systeme de comptes, la playlist personnelle et la fonctionnalite de nettoyage abandon.

Activez dans config.lua :

Config.Placer = {
    Persistence        = true,   -- les TV + CarPlays 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 (CarPlay exempt)
    CleanupAdminPermission = 'admin',  -- permission ACE pour /tvclean
}

Les tables suivantes sont creees automatiquement au premier demarrage (toutes utilisent CREATE TABLE IF NOT EXISTS + migrations additives ALTER TABLE ADD COLUMN IF NOT EXISTS) :

  • hz_television_placed — TV statiques placees (murales, sur pied, courbees, panneaux)
  • hz_carplay_placed — placements CarPlay indexes par plaque de vehicule
  • 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 premiere connexion Smart TV)

Installation manuelle (fallback — v3.4.3+)

Si une table ne peut pas etre creee automatiquement (utilisateur MySQL sans permission CREATE, chaine de connexion pointant vers la mauvaise base, etc.), vous verrez une erreur rouge dans la console serveur juste apres [HZ-Television] SQL compat: ... avec le nom exact de la table + l'erreur. Dans ce cas, executez 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 donnees de votre serveur. Puis redemarrez HZ-Television. Le script ne contient que des instructions CREATE TABLE IF NOT EXISTS, donc l'executer deux fois est sans risque.

v3.4.3+ uniquement — l'ancienne erreur Table 'yourdb.hz_tv_sessions' doesn't exist a la connexion echoue maintenant proprement avec une reponse db_not_ready au lieu de crasher, et le log serveur vous dirige vers install.sql. Les versions precedentes faisaient crasher le flux de session.

Etape 6 — server.cfg

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

# Dependances (doivent demarrer AVANT HZ-Bridge)
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-Bridge # gere la detection automatique ensure HZ-PropsCarplay # streame les 12 variantes de props CarPlay (telechargement Keymaster separe) ensure HZ-Television # la ressource logique TV
L'ordre de demarrage est critique. HZ-Bridge, HZ-PropsCarplay et votre driver SQL (oxmysql ou mysql-async) doivent tous demarrer avant HZ-Television. Si HZ-PropsCarplay n'est pas assure, les 12 modeles de variantes CarPlay ne seront pas streames et le placement CarPlay echouera silencieusement a lib.requestModel. Si aucun driver SQL n'est assure, la persistance cesse de fonctionner silencieusement.

Etape 7 — Configuration

Ouvrez HZ-Television/config.lua et adaptez les parametres. Voir Configuration pour chaque option en detail.

Points essentiels a verifier 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.Persistencetrue pour activer la sauvegarde en base
  • Config.Placer.BlockOnRoadtrue si vous voulez bloquer le placement sur les routes
  • Config.Placer.MaxPerPlayer + Config.Placer.AutoCleanupDays — protection abandon
  • Config.BillboardUseSmartTV — quels modeles de panneaux/cinema doivent utiliser l'interface Smart TV complete (par defaut : les 3 props cinema courbes + 2 grands panneaux vanilla)
Les parametres framework / target / menu / notification / inventaire sont geres dans HZ-Bridge — voir Configuration HZ-Bridge.

Etape 8 — Verification

  1. Demarrez le serveur
  2. La console devrait afficher (dans l'ordre) :
* [HZ-Bridge] detected, detected, ... * [HZ-PropsCarplay] 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, ecran cinema courbe, ou utilisez l'item hz_carplay dans un vehicule)
  3. Selectionnez Power OnSmart TV → collez une URL YouTube
Termine ! Si l'interface Smart TV s'ouvre et que votre URL se lit, le script fonctionne. Passez a Configuration pour personnaliser les modeles, les permissions et les seuils de protection abandon.

Depannage rapide

Le script ne demarre pas

Verifiez :


  • Les dossiers sont correctement nommes HZ-Television, HZ-PropsCarplay, HZ-Bridge (sensible a la casse)

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

  • Votre licence FiveM est valide sur Keymaster

  • Un systeme de menu (ox_lib ou qb-menu) est ensure avant HZ-Bridge

Erreur "Framework not detected"

La detection est geree par HZ-Bridge. Assurez-vous que :


  • es_extended, qb-core ou qbx_core est ensure avant HZ-Bridge

  • HZ-Bridge est ensure avant HZ-Television

  • Verifiez la ligne console de HZ-Bridge pour confirmer la detection automatique

  • Forcez un framework si necessaire dans le config.lua de HZ-Bridge — ex. HZBridge.Framework = 'esx'

Le placement CarPlay echoue silencieusement

Cause la plus courante : HZ-PropsCarplay n'est pas demarre. lib.requestModel(hz_carplay) reste bloque indefiniment car le modele n'est pas streame.

HZ-PropsCarplay est un telechargement separe sur Keymaster — il n'est pas inclus avec HZ-Television. Confirmez :
  • Les deux assets sont listes dans vos Granted Assets Keymaster et ont ete telecharges
  • Le dossier HZ-PropsCarplay se trouve a cote de HZ-Television dans resources/
  • ensure HZ-PropsCarplay est dans votre server.cfg avant ensure HZ-Television
  • La ressource est listee comme started dans la console serveur
Les TV placees ne sont pas sauvegardees apres redemarrage / Erreur "no SQL resource detected"

HZ-Television a besoin soit de oxmysql soit de mysql-async en fonctionnement. Au demarrage, 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 etre place avant ensure HZ-Television — si la ressource SQL se charge apres, la detection runtime la manque

  • Les deux drivers sont supportes — choisissez-en un ; ne les executez pas simultanement

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

L'etape de creation automatique n'a pas pu construire une ou plusieurs tables. Vous verrez des lignes rouges juste apres SQL compat: detected ... pendant le demarrage :

[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 donnees de votre serveur. Puis redemarrez HZ-Television. Le fichier ne contient que des instructions CREATE TABLE IF NOT EXISTS — l'executer deux fois est sans risque.

Causes courantes de l'echec de la creation 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 redemarrez

  • La chaine de connexion pointe vers une base que l'utilisateur peut lire mais pas ecrire → verifiez le nom de la base

  • MySQL tourne en mode STRICT avec des parametres de session incompatibles → install.sql definit explicitement SQL_MODE = '' en haut pour contourner ce probleme


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 etes sur une ancienne version de HZ-Television. Les deux erreurs ont ete corrigees dans v3.4.6 — mettez a jour et re-executez le nouveau install.sql.

Sur v3.4.3+, le flux de connexion echoue maintenant proprement avec db_not_ready quand les tables sont manquantes, au lieu de crasher en pleine requete.

L'ecran reste noir / pas d'affichage
  • Utilisez /tvcfg pres de la TV pour calibrer Scale/Offset/Rotation (l'apercu cyan en direct montre exactement ou se trouve la zone de clic du curseur)
  • Testez avec une simple video YouTube d'abord (pas un livestream)
  • Verifiez la console F8 pour des erreurs JavaScript
  • Pour les grands panneaux vanilla, assurez-vous que le modele est dans Config.BillboardUseSmartTV (la detection automatique du render target en v3.3 les gere)
Pas de son ou son global
  • Augmentez Config.Display.MaxSoundDistance dans config.lua
  • Assurez-vous que la TV est allumee
  • Rapprochez-vous (le volume diminue entre MinSoundDistance et MaxSoundDistance)
  • Pour le CarPlay specifiquement : l'audio a une portee cabine de 5 m avec occlusion Web Audio. Le conducteur + les passagers ont un son propre et complet ; les auditeurs exterieurs recoivent un son filtre et attenue
Les items TV n'apparaissent pas dans l'inventaire
  • Ajoutez les items depuis HZ-Television/items/.txt dans le fichier d'items de votre inventaire
  • Redemarrez le serveur completement apres 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