HZ Scripts

FAQ

General

Le script est-il compatible avec mon framework ?

HZ-Television supporte QBCore, QBox, ESX et Standalone. La detection est geree par HZ-Bridge — configurez une seule fois la-bas et HZ-Television (+ chaque autre Hz-Script) en herite automatiquement.

Puis-je avoir plusieurs TV avec du contenu different en meme temps ?

Oui — c'est l'un des principaux arguments de vente. Chaque TV a proximite affiche son propre contenu independant (plus de limite a 5 ecrans depuis v2.3, plus de limite a 12 TV depuis la reecriture DrawSpritePoly). Meme la fonctionnalite CarPlay — chaque vehicule avec un item hz_carplay obtient sa propre variante a texture isolee, donc passer devant 12 voitures dans le trafic = 12 Smart TV differentes.

Combien de joueurs peuvent regarder la meme TV ?

Illimite. La synchronisation temps reel est geree via des evenements bases sur la plaque et les coordonnees (heartbeat 5 s, tolerance de derive 1.5 s, precision 0.1 s, seek/play/pause instantane). Les joueurs arrivant en retard recoivent la position exacte de lecture a la connexion.

Et les routing buckets / instances ?

Entierement compatible routing bucket depuis v3.1.2. Les TV, panneaux d'affichage, verrous operateur et boucles de playlist sont tous isoles par instance. Deux TV aux memes coordonnees dans des instances differentes ne se chevauchent jamais.

Est-ce que ca utilise beaucoup de ressources ?

Client au repos : ~0.01 ms. Six TV actives a l'ecran : ~0.03 ms (donnees de sommets DrawSpritePoly en cache). Serveur : ~0.00 ms. Voir Performance.


Installation

Erreur : "Resource HZ-PropsCarplay not found" HZ-PropsCarplay est fourni avec votre telechargement HZ-Television (v3.4+) mais doit etre ensure separement dans server.cfg. Ajoutez ensure HZ-PropsCarplay avant ensure HZ-Television. Sans cela, les 12 variantes de props CarPlay ne sont pas streamees et le placement CarPlay reste bloque 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-Bridge (qui lui-meme demarre 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.txtox_inventory/data/items.lua

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

  • qs-inventory.txtqs-inventory/shared/items.lua


Redemarrage complet du serveur requis apres avoir ajoute les items (pas seulement restart HZ-Television).

J'utilise ak47_inventory — les items s'affichent mais ne se declenchent pas a l'utilisation ak47_inventory ne fait pas partie de la liste auto-detectee de HZ-Bridge (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 evenements 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 definition 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_carplay"] = {
    name   = "hz_carplay",
    label  = "CarPlay Screen",
    weight = 3000,
    type   = "item",
    close  = true,
    server = {
        onUse = function(source, item)
            TriggerClientEvent('HZ-Television:useItem', source, { name = 'hz_carplay' })
        end,
    },
},

Repetez pour hz_television_screen si vous utilisez aussi les TV murales / cinema. Deposez 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_logintimestamp DEFAULT NULL necessite une declaration NULL explicite en mode strict. Maintenant timestamp NULL DEFAULT NULL
  • Error 1075 sur hz_carplay_placed — la colonne id AUTO_INCREMENT necessitait une PRIMARY KEY. Maintenant declaree
Mettez a jour vers v3.4.6+ et re-executez le nouveau install.sql. CREATE TABLE IF NOT EXISTS ignore les tables deja creees, donc seules les deux tables qui echouaient precedemment sont creees. Pas de migration de donnees.
Generic_texture_renderer_gfx — en ai-je besoin ? Non. Depuis v2.3, le moteur de rendu utilise DrawSpritePoly directement. L'ancienne dependance scaleform est supprimee.
Comment faire la mise a jour ?
  1. Telechargez la derniere 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 cles de configuration
  5. Redemarrez le serveur
Pour v3.3 → v3.4 specifiquement : ajoutez ensure HZ-PropsCarplay a server.cfg, et passez en revue les nouveaux champs Config.Placer.BlockOnRoad / MaxPerPlayer / AutoCleanupDays.

CarPlay (v3.2+)

Comment placer un CarPlay dans ma voiture ?
  1. Mettez l'item hz_carplay dans votre inventaire
  2. Montez dans un vehicule (siege conducteur)
  3. Utilisez l'item — un prop d'apercu apparait sur le tableau de bord et un gizmo clavier prend le controle
  4. Fleches = position, Molette = hauteur, Q/D (ou A/D) = rotation, Z/S (ou W/S) = inclinaison, Entree = confirmer, Echap = annuler
  5. Une fois place, utilisez votre systeme de target (ox\_target / qb-target) sur la voiture pour Turn On CarPlaySmart TV
Le vehicule derive pendant que j'ajuste le gizmo

Corrige en v3.4 — le vehicule est maintenant automatiquement fige pendant toute la duree du gizmo (FreezeEntityPosition + vitesse mise a zero + controles desactives). Defige a la confirmation / annulation.

La camera ne regarde pas vers l'avant quand j'utilise l'item CarPlay

Corrige en v3.4 — la camera premiere personne se cale maintenant a heading=0 / pitch=0 au passage en vue cockpit, quelle que soit la direction visee par le joueur avant.

Pourquoi je n'entends pas le CarPlay quand je suis a l'exterieur de la voiture ?

C'est intentionnel — le CarPlay est un audio cabine, pas un haut-parleur. Le pipeline d'occlusion Web Audio (v3.3) coupe completement au-dela de 5 m du vehicule. A l'interieur de la voiture (conducteur + passagers), l'audio est entierement propre et non filtre. Les auditeurs dans une bulle de 5 m a l'exterieur recoivent une version filtree en lowpass et attenuee en volume selon le nombre de portieres ouvertes.

Ajustez Config.Carplay.AudioCabinRange si vous voulez une taille de bulle differente.

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

Oui — placements illimites. Chaque client affiche les 12 plus proches (un par variante a texture isolee), donc au-dela de 12 simultanement visibles sur le meme client, les plus eloignes sont invisibles jusqu'a ce que vous vous approchiez.

Je ne veux pas de la fonctionnalite CarPlay en vehicule

Desactivez-la proprement via config.lua (v3.4.5+) :

Config.Carplay = { Enabled = false }

Cela ignore la boucle RegisterUsableItem des hz_carplay*, l'enregistrement des options target, l'invite de placement, le tick de reconciliation — tout ce qui est specifique au CarPlay. Les TV murales / cinema / panneaux d'affichage continuent de fonctionner normalement.

Mon CarPlay tombe parfois apres un crash violent

Corrige dans v3.4.6 — l'invariant not-attached du tick de reconciliation detecte quand IsEntityAttached(prop) retourne false (le prop a ete detache par la physique de collision), libere le slot, et le re-acquiert au prochain passage (≤ 500 ms). Le prop se replace sur le meme vehicule a ses offsets d'origine, et le DUI se reactive automatiquement car PoweredOn[cpId] est preserve a travers le cycle de liberation.

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


Utilisation

L'ecran est noir ou rien ne s'affiche Checklist :
  1. La TV est-elle allumee ? (Turn On via le menu target)
  2. Le modele a-t-il ete calibre ? Utilisez /tvcfg pres du prop — l'apercu cyan en direct montre exactement ou se trouve la zone de clic du curseur
  3. Pour les grands panneaux vanilla, ajoutez le modele dans Config.BillboardUseSmartTV (la detection automatique du render target en v3.3 les gere automatiquement)
  4. Testez avec une simple video YouTube d'abord, pas un livestream
  5. Verifiez la console F8 pour des erreurs JS
Les clics du curseur sont decales / ratent les icones
  • Props plats : utilisez /tvcfg et ajustez Scale / Offset / Rotation. L'apercu cyan correspond exactement a la zone de clic.
  • Props courbes : assurez-vous que le modele a une entree Curve = { Radius, Arc, Invert } et que l'apercu en arc (16 segments cyan) s'aligne avec la vraie surface. Definissez 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 lineairement entre MinSoundDistance et MaxSoundDistance
  • Augmentez Config.Display.MaxSoundDistance pour une portee audio plus grande
  • Pour le CarPlay : l'audio ne joue qu'a l'interieur de la voiture (+ une bulle de 5 m autour)
YouTube / Twitch ne fonctionne pas YouTube : certaines videos ont l'integration desactivee par l'uploader ou des restrictions regionales. Testez l'URL dans un navigateur normal en navigation privee — si ca ne joue pas dans une integration la-bas, ca ne jouera pas en jeu non plus. Twitch / Kick : uniquement les chaines en direct. Format : https://twitch.tv/channel ou https://kick.com/channel. V3 utilise le SDK natif Twitch, donc volume / pause / mute fonctionnent nativement.
Les autres joueurs ne voient pas mon contenu Web Browser (sites necessitant une connexion)

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

  • Streams publics (YouTube live, Twitch, Kick, liens .m3u8 / .mp4 directs) → se synchronisent parfaitement pour chaque joueur, aucune connexion necessaire. Recommande pour les cas "regarder ensemble" (sport, Coupe du Monde, flux d'actualites)
  • Services avec abonnement / necessitant une connexion (Disney+, beIN, Prime Video, streams payants, contenu avec acces par compte) → ne peuvent pas etre synchronises. Chaque joueur devrait se connecter a son propre compte sur son propre client, ce qui annule l'idee du "regarder ensemble"
Solution de contournement : re-streamez le contenu vous-meme (OBS → votre propre chaine Twitch / YouTube / Kick) et mettez cette URL publique sur la TV. Tous les spectateurs voient votre rediffusion synchronisee.
Les joueurs arrivant en retard ne voient pas le contenu video / navigateur

La synchronisation temps reel (heartbeat 5 s, tolerance de derive 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 ecran noir sur le mode navigateur specifiquement, le probleme est generalement une condition de course entre la creation du DUI et le premier appel SetDuiUrl quand le joueur streame. Assurez-vous que votre HZ-Television est a jour (la synchronisation navigateur pour les arrivees tardives a ete renforcee dans les versions recentes avec des passes de retry).

Autres points a verifier :


  • OneSync doit etre active (set onesync on dans server.cfg)

  • Si vous etes dans un routing bucket, les deux joueurs doivent etre dans le meme bucket — les evenements de synchronisation sont isoles par bucket par conception



Configuration

Comment ajouter un modele TV / panneau d'affichage personnalise ?
  1. Ajoutez une entree dans Config.Models indexee par nom de modele avec des valeurs Scale / Offset / Rotation de depart raisonnables
  2. Chargez en jeu, approchez-vous du prop
  3. Executez /tvcfg → choisissez le modele → calibrez avec le gizmo 3D ; l'apercu cyan montre la zone de clic en temps reel
  4. Pour les ecrans courbes, cochez Curve + definissez Radius / Arc / Invert
  5. Sauvegardez — les valeurs sont ecrites dans tv_config.json
Comment empecher les joueurs de placer des props sur les routes ?

Activez la protection route v3.4 :

Config.Placer.BlockOnRoad = true

L'apercu de placement devient rouge quand on vise une surface de route et Entree est bloque. Le placement CarPlay en vehicule est toujours exempt — c'est le principe meme du CarPlay.

Comment empecher les joueurs inactifs de laisser des TV indefiniment ?

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
}

Egalement disponible a la demande via /tvclean run (commande admin) ou exports['HZ-Television']:RunHZTVCleanup().

Comment supprimer tous les placements d'un joueur specifique ?
/tvclean purge <identifier>

Aussi : /tvclean list affiche le top 20 des proprietaires par inactivite pour vous aider a trouver les comptes abandonnes.

Les TV placees disparaissent au redemarrage

Activez la persistance :

Config.Placer.Persistence = true

Necessite oxmysql. Les tables hz_television_placed et hz_carplay_placed sont creees (+ migrees pour la colonne last_seen) automatiquement.

Comment ajouter des chaines pre-enregistrees ?
Config.Channels = {
    { name = 'Weazel News', url = 'https://www.youtube.com/watch?v=...', category = 'news'  },
    { name = 'LS Rock Radio',url = 'https://www.youtube.com/watch?v=...', category = 'music' },
}

Apparait dans une section "Channels" dans l'interface Smart TV.


Permissions

Reserver 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 / Integration

Les TV ne se synchronisent pas entre les joueurs

Activez OneSync — set onesync on dans server.cfg. Assurez-vous egalement d'etre sur un build FiveM raisonnablement recent (2802+).

Lag / saccades avec beaucoup de TV

Depuis v3.1, le moteur de rendu met en cache les donnees de sommets, donc 6 TV a l'ecran coutent environ autant qu'1 TV avant le cache. Si vous rencontrez toujours des problemes, baissez Config.Display.RenderDistance (ex. 30 m) et Config.Display.DefaultRange (ex. 20 m).

Erreur "Failed to load video" dans F8

Generalement une restriction d'integration, un blocage regional ou une video supprimee. Testez l'URL dans un navigateur normal en navigation privee. Si l'URL necessite un rendu navigateur, passez mode = 'browser' lors de l'appel a PlayVideoOnTelevision.

Comment desactiver entierement les panneaux d'affichage ?

Retirez les modeles 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 defaut (qui est generalement rien en jeu).

Comment integrer avec esx\_property / qb-houses ?

Utilisez les evenements serveur pour restreindre le placement — voir Exports & Evenements 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 reponse ? Rejoignez notre Discord et ouvrez un ticket dans #support.