Changelog

v3.4.6 — Correctif install.sql mode strict + amélioration recovery DashScreen

2026-04-30

  • install.sql Error 1067 sur last_login — timestamp DEFAULT NULL était rejeté par les instances MariaDB en mode strict SQL_MODE. La colonne est maintenant déclarée timestamp NULL DEFAULT NULL dans install.sql et dans l'auto-creation dans server/accounts.lua, donc les installations neuves sans le fichier SQL fonctionnent aussi sur les bases en mode strict
  • install.sql Error 1075 sur hz_dashscreen_placed — la table avait id INT AUTO_INCREMENT mais seulement une UNIQUE KEY sur plate ; MariaDB exige que la colonne auto-increment soit une clé. Ajout de PRIMARY KEY (id). Le chemin d'auto-creation dans server/placer.lua était déjà correct, donc seul l'import manuel de install.sql était affecte
  • Le DashScreen n'est plus orphelin après un crash — quand une collision violente détache le prop du véhicule parent, l'invariant not-attached du tick de réconciliation libère le slot et le re-acquiert au prochain passage (≤ 500 ms), replaquant l'écran sur le même véhicule a ses offsets d'origine. L'état d'alimentation est préservé à travers le cycle via PoweredOn[cpId] donc le DUI se rallume automatiquement

Mise à jour

  • Re-importez install.sql une fois après la mise à jour — CREATE TABLE IF NOT EXISTS ignore les tables déjà créées, seules les deux qui échouaient précédemment sont créées
  • Pas de migration de données, pas de changement de config / événements
  • Activez Config.Debug = true pour voir la raison de libération not-attached dans le log quand un crash détache un DashScreen

v3.4.5 — Bundle de correctifs tickets clients (4 fixes)

2026-04-28

  • Spam debug F8 élimine — trois lignes console qui se déclenchaient à chaque frame indépendamment de Config.Debug sont maintenant conditionnées par celui-ci : [hz_television] Screen → DRAWSPRITEPOLY, [HZ-TV RT] name=..., et DrawToRenderTargetDebug. Les serveurs de production ne sont plus inondes de diagnostics de rendu internes
  • La synchronisation du volume n'est plus perdue quand le curseur est relâché rapidement — le throttle de 200 ms sur smarttv_volume perdait la valeur finale si vous relâchiez le curseur en cours de fenêtre. Maintenant un envoi trailing-edge (mis en file via pendingVolume) garantit que la dernière valeur est diffusée à tous les spectateurs après l'expiration de la fenêtre de throttle
  • Le volume des iframes cross-origin est maintenant effectivement mute — certaines sources embarquées n'exposent pas d'API volume par postMessage, donc le volume 0 était silencieusement ignore. Maintenant l'iframe est recréé avec ?muted=1 à la transition 0 ↔ >0 (bascule mute binaire — le volume au pourcentage n'est pas possible sur ces sources ; c'est une limitation de l'embed, pas du script)
  • Le DashScreen peut être entièrement désactivé — nouveau bloc Config.DashScreen = { Enabled = true } dans config.lua. Mettre Enabled = false ignore l'enregistrement des items hz_dashscreen*, le binding des options target, l'invite de placement et le tick de réconciliation. Utile si vous voulez uniquement les TV murales / cinéma sans la variante DashScreen en véhicule

Mise à jour

  • Pas de migration de données, pas de changements cassants
  • Si vous voulez désactiver uniquement le DashScreen : Config.DashScreen = { Enabled = false } dans config.lua

v3.4.4 — Resilience DB + Revision des locales

2026-04-22

  • Fichier install.sql fourni comme fallback manuel. Si l'étape CREATE TABLE IF NOT EXISTS automatique ne peut pas créer une ou plusieurs tables (permission CREATE manquante, mode SQL STRICT, etc.), la console serveur affiche maintenant CREATE TABLE <name> FAILED: <reason> + pointe vers le fichier fourni. Executez-le une fois avec un utilisateur MySQL privilégie (mysql -u ... -p <db> < install.sql) et redémarrez HZ-Television
  • Chemin de connexion fail-cleanly — quand une table manque au runtime, le callback hz_tv:login retourne maintenant { success = false, reason = 'db_not_ready' } au lieu de lancer Table 'yourdb.hz_tv_sessions' doesn't exist en pleine requête. Un log serveur rouge avertit l'admin. Conditionne par un nouveau flag _G.HZ_TV_DB_READY défini après que tous les CREATEs réussissent
  • Bootstrap DB résilient — chaque appel CREATE TABLE est maintenant enveloppe dans pcall ; un échec n'arrête plus le reste. Chaque échec affiche le nom exact de la table + l'erreur pour que les admins puissent corriger celle qui pose problème au lieu de deviner
  • Chaînes en français codées en dur supprimées du chemin serveur :
- 'Joueur' fallback nom joueur → 'Player' - 'Ma Playlist' nom de playlist par défaut (défaut SQL + fallback Lua) → 'My Playlist' - 'Comptes — tables DB prêtes' log de démarrage → 'Account tables ready'

Conseils

  • L'installation est idempotente — install.sql ne contient que des CREATE TABLE IF NOT EXISTS, donc l'importer sur une base saine est inoffensif
  • install.sql couvre aussi les deux tables de placement (hz_television_placed, hz_dashscreen_placed) au cas ou celles-ci seraient touchées par le même problème de permission

v3.4.3 — Compatibilité garage DashScreen + fiabilité de placement

2026-04-22

  • Rangement en garage — quand un script de garage (qs-advancedgarages, cd_garage, loaf-garage, toute ressource qui supprime le véhicule parent) range le véhicule, le prop DashScreen est maintenant retire au lieu de rester orphelin devant la porte du garage
  • Sortie de garage — quand le véhicule ressort avec la même plaque mais un nouveau handle d'entité, le DashScreen se re-attache automatiquement aux mêmes offsets ; le DUI se réactive si le DashScreen était allume avant le rangement
  • Streamer cull / changement de routing bucket — quand le véhicule parent quitte la portée de streaming ou le routing bucket du client, le pool libère le slot proprement ; le prop reapparait sur le véhicule quand il revient dans le champ de vision
  • Condition de course au placement — placer un DashScreen dans votre propre véhicule s'attache maintenant toujours immédiatement. Avant, le placer pouvait échouer silencieusement sur un cache négatif FindVehicle ou une condition de course pool-not-ready ; le serveur diffuse maintenant spawnDashScreen à tout le monde y compris le placeur, et un tick de réconciliation retente dans ≤ 500 ms si quelque chose échoue encore
  • Détection défensive du parent — le pool croise le véhicule attache avec GetGamePool('CVehicle') plutôt que de faire confiance à DoesEntityExist / IsEntityAttached, que FiveM peut continuer à rapporter comme true pendant plusieurs secondes après qu'un script de garage ait effectivement supprime le véhicule
  • Visibilite debug — définissez Config.Debug = true pour voir les décisions de réconciliation dans la console F8 (release slot ... / re-acquire cpId=...)

v3.4.2 — Double support SQL (oxmysql + mysql-async complet)

2026-04-21

  • La persistance à accidentellement casse sur les serveurs mysql-async car server/accounts.lua appelle l'API moderne oxmysql-only (MySQL.ready, MySQL.query.await, MySQL.single, MySQL.scalar, MySQL.insert)
  • server/sql_compat.lua charge maintenant oxmysql/lib/MySQL.lua directement via LoadResourceFile + load() quand oxmysql est détecté, donnant à HZ-Television l'API complète moderne + legacy
  • Le fallback mysql-async ajoute un shim MySQL.ready pour que accounts.lua ne crash pas (l'API moderne .await n'est toujours pas disponible sur mysql-async — installez oxmysql pour que le système de comptes fonctionne)
  • Bloc d'erreur rouge visible quand aucun driver n'est détecte, avec les instructions d'installation

v3.4.1 — Double support SQL + Suivi audio DashScreen

2026-04-20

  • Double support SQL — HZ-Television détecte maintenant automatiquement oxmysql ou mysql-async au démarrage et synthétise un shim MySQL.Async / MySQL.Sync au-dessus de celui qui tourne. Fonctionne directement sur les stacks modernes (QBCore v2, QBox) et legacy (QBCore v1, ancien ESX) — aucun changement de config nécessaire
  • Ligne de diagnostic au démarrage — la console serveur affiche maintenant exactement quel driver SQL a été détecté (detected oxmysql / detected existing MySQL.Async (mysql-async)), et un bloc d'erreur rouge visible si aucun n'est assure avant hz_television
  • L'audio DashScreen suit le véhicule — le volume et l'occlusion audio cabine utilisent maintenant la position mondiale en direct du prop DashScreen au lieu des coordonnées de placement stockées, donc le son s'estompe correctement quand le DashScreen d'un autre joueur s'éloigné de vous (était bloqué à la position de placement)
  • L'inclusion codée en dur @oxmysql/lib/MySQL.lua a été supprimée de fxmanifest.lua — le nouveau server/sql_compat.lua la remplace

v3.4.0 — Protection route, protection abandon, séparation DashScreen

2026-04-19

  • Protection route — Config.Placer.BlockOnRoad (opt-in) effectue un raycast du noeud véhicule le plus proche pendant que l'aperçu est actif. Si le prop est sur une route, le contour devient rouge et Entrée est bloqué. Le placement DashScreen en véhicule est exempt
  • Protection abandon — Config.Placer.MaxPerPlayer limite stricte par identifiant + Config.Placer.AutoCleanupDays pour les propriétaires inactifs + Config.Placer.AutoCleanupInterval tick périodique
  • Colonne last_seen sur hz_television_placed + hz_dashscreen_placed, rafraîchie à playerJoining — migration additive au démarrage
  • Commande admin /tvclean — list (top 20 propriétaires par inactivité), run (déclencher nettoyage immédiatement), purge <identifier> (supprimer tous les placements d'un joueur). Protégé par ACE via Config.Placer.CleanupAdminPermission. Aussi exports["hz_television"]:RunHZTVCleanup()
  • Assets DashScreen externalises dans hz_televisionprops — les 12 variantes (hz_dashscreen, hz_dashscreen_1..11) vivent maintenant dans une ressource légère séparée. ensure hz_televisionprops est maintenant requis. La calibration est deplacee dans hz_televisionprops/calibration.json, chargée et fusionnée au démarrage
  • QoL gizmo DashScreen — véhicule fige + vitesse mise à zéro pendant toute la durée du placement, contrôles véhicule désactives (keepVehicleControls = false), caméra première personne calée à heading=0 / pitch=0 pour regarder droit devant au passage en vue cockpit

v3.3.0 — SmartTV partout + Raycast cylindrique

2026-04-18

  • SmartTV sur panneaux et cinéma — l'interface Smart TV interactive complète fonctionne maintenant sur les écrans cinéma (prop_curved_screen_s/m/l) et les grands panneaux vanilla GTA V (prop_huge_display_01/02) via Config.BillboardUseSmartTV
  • Détection automatique render target — l'heuristique dict == name détecte les textures render target vanilla (échec silencieux de AddReplaceTexture) et bascule vers le pipeline DrawToRenderTarget correct, affichant enfin le contenu DUI de manière fiable sur les grands panneaux
  • Raycast cylindrique du curseur — calcul mathématique réel d'intersection rayon ↔ cylindre pour les écrans courbes, avec config par modèle Curve = { Radius, Arc, Invert }. Pre-calibre d'après les dimensions mesurées dans Blender pour les 3 écrans cinéma. Curve.Invert = true pour les props qui courbent vers le spectateur. RaycastMaxDistance dynamique = distance camera-ecran x 2
  • Aperçu en direct /tvcfg — superposition cyan semi-transparente dessinée sur le prop pendant la calibration. Plat → quad unique, courbe → 16 segments d'arc construits avec la même formule que le raycast (aperçu = zone de clic)
  • Occlusion audio cabine DashScreen (Web Audio) — BiquadFilter lowpass (600 Hz scelle → 2 200 Hz toutes portières ouvertes) + peaking bass shelf à 80 Hz (+6 dB scelle, diminue avec l'ouverture des portières) + GainNode master (25% scelle → 70% ouvert). Transitions lisses de 80 ms, état par portière (avant/arriere x G/D), portée cabine 5 m, audio propre et complet pour conducteur + passagers
  • /tvcfg localise — 58 clés de locale en en / fr / es / de pour le configurateur admin. Distance d'interaction target augmentée de 4 m → 25 m pour les grands panneaux
  • Correctifs — grands panneaux restant noirs (render target), target DashScreen revenant a "Turn On" en roulant (vérification d'alimentation par coordonnées → par entité), "Power Off" manquant sur les écrans SmartTV, mode silencieux ne mutant pas les écrans nouvellement actives, /dashscreen Interact fermant la SmartTV, rotation AZERTY dans le gizmo, inclinaison caméra en véhicule (la caméra correspond maintenant à la rotation complète de l'entité), cascade de bones dashboard avec offsets initiaux pre-calibres, Scale des écrans cinéma S/M corriges d'après les dimensions Blender

v3.2.0 — DashScreen : Smart TV en véhicule

2026-04-17

  • Item hz_dashscreen — nouvel item d'inventaire qui monte une Smart TV sur le tableau de bord de n'importe quel véhicule. Utilisez-le assis dans la voiture et un gizmo clavier 3D prend le contrôle
  • 12 variantes a texture isolée (hz_dashscreen, hz_dashscreen_1..11) avec un pool dynamique côté client — placements illimités, 12 plus proches rendus, chaque variante a son propre TXD pour que chaque voiture ait du contenu indépendant
  • Synchronisation multi-joueur par plaque — placement, état d'alimentation, contenu et retrait sont synchronisés par plaque de véhicule pour que tout survive aux déplacements, respawns, redémarrages. Persistance par véhicule dans hz_dashscreen_placed
  • Options target apparaissent dynamiquement selon l'état d'alimentation — Turn On / SmartTV / Interact / Turn Off / Remove
  • Commandes /dashscreen_on, /dashscreen (F5), /dashscreenremove
  • Supporte aussi le placement statique — les props DashScreen peuvent être placés hors véhicule comme écrans de table classiques
  • Module gizmo clavier partage expose comme exports['hz_lib']:GizmoAttached(entity, parent, boneIndex, initialOffsets, options) — axes locaux au parent, compatible AZERTY/QWERTY, passthrough optionnel des contrôles véhicule
  • Nettoyage des locales — toutes les chaînes DashScreen + notifications mode silencieux deplacees dans les fichiers locale en/fr/es/de

v3.1.0 → v3.1.2 — Perf, Props personnalises, Playlist, Routing Buckets

2026-04-09 → 2026-04-10

  • Cache de sommets — ComputeSpritePolyData() met en cache la géométrie 3D par écran ; le thread de rendu descend à 2x DrawSpritePoly par frame. 6 TV à l'écran = coût d'1 TV avant (\~0.02 ms vs \~0.08 ms)
  • Synchronisation vidéo plus stricte — heartbeat 15 s → 5 s, resync spectateur 30 s → 15 s, tolérance de dérive 3 s → 1.5 s, anti-rollback 5 s → 2 s, précision temporelle 1 s → 0.1 s
  • 9 nouveaux props personnalises — hz_tv_s/m/l (mural), hz_tv_s/m/l_stand (sur pied), curved_screen_s/m/l (cinéma). Tous des assets originaux, aucun pack externe
  • Playlist personnelle — file d'attente en boucle liée au compte (jusqu'a 50 éléments par compte), durée par élément, filtre Tous/Videos uniquement, indicateur actif, exports StartPlaylistOnTelevision / StopPlaylistOnTelevision
  • Support complet des routing buckets — état TV par bucket, événements isoles par bucket, verrous opérateur par bucket, picker LB Phone filtre par bucket, boucle de playlist tourne indépendamment par instance
  • Correctif Font Awesome — <link> CSS déplace dans <head>, chemins de polices corriges, preload woff2 ajoute

v3.0.0 — Refonte de l'interface, sources étendues, comptes

2026-04-01

  • Interface Smart TV reconstruite — écran d'accueil style tvOS (dock flottant avec icônes rectangulaires, glassmorphism), Centre de Contrôle (Power, Login/Logout, Paramètres, Favoris, Historique, Playlist, Thème), thème clair/sombre avec 80+ overrides, saisie URL inline, bulle de lecture avec seek sur la timeline
  • Système de comptes — connexion liée à l'identifiant joueur, favoris / historique / paramètres par utilisateur, persistant via oxmysql
  • Sources étendues — modes de lecture supplémentaires ajoutes aux modes existants vidéo directe / images / contenu web
  • SDK natif du lecteur — les sources de flux supportées exposent une API lecteur pour volume / mute / pause / play
  • Synchronisation vidéo temps réel — système heartbeat, anti-rollback, resync spectateur, position exacte à la connexion
  • Synchronisation navigateur — URL, clics, scroll relayes de l'opérateur aux spectateurs
  • Panneau de contrôle NUI billboard — design cyberpunk "Ghost Protocol", 6 apps, curseur distance sonore (10–200 m), écran éteint par défaut (DUI crée uniquement quand du contenu est envoyé)
  • Système de locales — fichiers séparés config/locales/{en,fr,es,de}.lua, locales embarquées dans les événements de synchronisation

v2.3.0 — TV illimitées (nouveau moteur de rendu)

2026-03-12

  • Réécriture du rendu de Scaleform vers DrawSpritePoly — la texture DUI est maintenant rendue comme géométrie 3D directement (2 triangles par écran), pas d'intermédiaire Flash/GFX
  • Suppression de la limite de 5 TV du moteur — plus de limite de TV simultanées
  • Dépendance externe Flash/GFX texture-renderer supprimée — le rendu est maintenant entièrement dans le script
  • Prevention du Z-fighting — quad de l'écran décale de 0.002 unités le long de la normale

v2.2.0 — Interaction raycast

2026-03-11

  • Nouveau mode d'interaction par curseur libre en raycast — le joueur reste visible et peut regarder autour ; le curseur interagit directement avec la surface 3D de l'écran via un calcul rayon ↔ plan
  • L'ancien mode caméra verrouillée reste disponible via Config.Display.InteractionMode = 'camera'

v2.1.0 — Passe visuelle

2026-03-11

  • Réécriture CSS complète de la Smart TV — fond d'écran vif, dock en verre dépoli, animations de survol avec rebond, effet de glissement du label, pilule supérieure style tvOS (horloge + avatar)
  • Synchronisation d'images, synchronisation de volume, NUI-focus-on-interact, corrections de gestion de la table de mise à l'échelle
  • backdrop-filter: blur() supprime pour le FPS — remplace par des fonds opaques

v2.0.0 — Multi-Framework + Placement par inventaire

2026-02

  • Bridge multi-framework avec détection automatique (QBCore / ESX / Standalone)
  • Système de placement par inventaire avec contrôles 3D et persistance optionnelle
  • Configurateur en direct (/tvcfg) avec gizmo 3D
  • Support des panneaux d'affichage pour les grands écrans extérieurs
  • Audio base sur la distance avec portée configurable
  • Chaînes pre-enregistrees
  • Support multi-inventaire (ox, qb, qs, ps, codem, origen, core, tgiann)
  • Exports client et serveur pour l'intégration complète

v1.x — Versions précédentes

v1.5.0 (2025-12)

  • Ajout du support des flux en direct, correction d'un bug de synchronisation, amélioration des performances de rendu

v1.4.0 (2025-10)

  • Sources vidéo embarquées supplémentaires, correction du bug d'affichage sur certains modèles TV, commande /tvoff

v1.3.0 (2025-08)

  • Amélioration du système multi-TV, correction du problème de son persistant, support M3U8 (HLS)

v1.2.0 (2025-06)

  • Flux en direct, mode Power ON/OFF, amélioration de la synchronisation des joueurs

v1.1.0 (2025-04)

  • Support des images (PNG, JPG, GIF), correction du bug de texture noire au démarrage, nouveaux modèles TV par défaut

v1.0.0 (2025-02)

  • Version initiale

Mises à jour automatiques : les mises à jour sont livrées via FiveM Keymaster. Vous recevrez une notification Discord quand une nouvelle version sera publiée.

Support des anciennes versions

VersionSupportFin de support
v3.4.xActif—
v3.3.xActif—
v3.2.xMaintenance seuleJuillet 2026
v3.1.x et avantNon supportéAvril 2026
Il est fortement recommande de toujours utiliser la dernière version pour beneficier des correctifs et des nouvelles fonctionnalités.