Configuration

Tous les paramètres se trouvent dans hz_television/config.lua. Cette page couvre chaque section — général, affichage, placement, DashScreen, panneaux d'affichage, chaînes, localisation.

La détection framework / target / menu / notification / inventaire est gérée de manière centralisée par hz_lib — voir Configuration hz_lib. Le config.lua de HZ-Television ne contient plus de section Bridge.

Général

Config.Locale = 'en'   -- 'en' | 'fr' | 'es' | 'de'
Config.Debug  = false  -- logs console detailles


Permissions

Config.Permissions = {
    ConfiguratorCommand = 'admin',    -- /tvcfg
    BillboardCommand    = 'admin',    -- /billboard
    UseTV               = 'everyone', -- interagir avec n'importe quelle TV
    PlaceTV             = 'everyone', -- placer depuis l'inventaire
}

FormatSignification
'everyone'tout le monde peut utiliser
'admin'admins framework / ACE uniquement
'job:police'restriction à un seul job
'job:ambulance,police'restriction multi-jobs (séparés par virgule)

Affichage & Audio

Config.Display = {
    MaxSoundDistance          = 15.0,  -- metres ; portee max pour entendre la TV
    MinSoundDistance          = 2.0,   -- metres ; zone de volume maximum
    DefaultVolume             = 0.5,   -- 0.0 – 1.0
    RenderDistance            = 50.0,  -- metres ; coupe le rendu au-dela
    DefaultRange              = 25.0,  -- portee de detection (v3.1+)
    InteractionMode           = 'raycast', -- 'raycast' (curseur libre) | 'camera' (verrouille)
    RaycastMaxDistance        = 5.0,   -- augmente auto a distance-cam x 2 sur les grands props
    SpritePolyScaleMultiplier = 32.0,  -- facteur d'echelle de rendu interne
    ClockMode                 = 'game',-- 'game' | 'real'
}

Le volume diminue linéairement entre MinSoundDistance (volume max) et MaxSoundDistance (silence).


Placement TV & Protection abandon

Nouveau en v3.4 — protection route + champs de protection abandon ci-dessous.

Config.Placer = {
    Enabled                 = true,
    Persistence             = true,   -- necessite oxmysql

    -- Protection abandon (v3.4)
    MaxPerPlayer            = 0,      -- 0 = illimite ; N = limite stricte par identifiant
    AutoCleanupDays         = 0,      -- 0 = desactive ; N = suppression auto apres N jours d'inactivite
    AutoCleanupInterval     = 6,      -- heures entre les cycles de nettoyage (0 = au demarrage uniquement)
    CleanupAdminPermission  = 'admin',-- permission ACE pour /tvclean

    -- Protection route (v3.4)
    BlockOnRoad             = false,  -- true = apercu rouge + blocage Entree quand sur une route
                                      -- Le placement DashScreen en vehicule est toujours exempt

    -- Legacy
    AllowPickup             = true,
    OnlyOwnerPickup         = true,   -- un admin peut toujours ramasser

    -- Correspondance item → modele (pre-remplie avec les 10 items fournis)
    Items = {
        ['hz_tv_s']        = 'hz_tv_s',
        ['hz_tv_m']        = 'hz_tv_m',
        ['hz_tv_l']        = 'hz_tv_l',
        ['hz_tv_s_stand']  = 'hz_tv_s_stand',
        ['hz_tv_m_stand']  = 'hz_tv_m_stand',
        ['hz_tv_l_stand']  = 'hz_tv_l_stand',
        ['curved_screen_s'] = 'prop_curved_screen_s',
        ['curved_screen_m'] = 'prop_curved_screen_m',
        ['curved_screen_l'] = 'prop_curved_screen_l',
        ['hz_dashscreen']     = 'hz_dashscreen',   -- DashScreen — 11 variantes supplementaires auto-enregistrees
    },
}

Protection route

Vérifie GetClosestVehicleNode autour des coordonnées de l'aperçu. Si le prop se trouve sur une route :


  • Le contour devient rouge (au lieu du cyan normal)

  • Entrée / Confirmer est bloqué — le joueur doit déplacer le prop hors de la route d'abord

  • Le placement DashScreen en véhicule est exempt (le principe même du DashScreen est de monter sur un véhicule en mouvement)


Protection abandon

Empeche les serveurs longue durée de se remplir de TV et de DashScreens laisses par des joueurs qui ne reviennent jamais.

  • MaxPerPlayer — limite stricte par identifiant propriétaire. Pour le DashScreen, les upserts par plaque comptent comme un remplacement (le re-placement sur la même voiture n'incremente pas)
  • AutoCleanupDays — les propriétaires qui ne se sont pas connectés depuis N jours voient leurs placements supprimes. Recommande 30–60
  • AutoCleanupInterval — fréquence de re-scan par le serveur (en heures ; 0 = au démarrage uniquement)
  • Colonne last_seen sur hz_television_placed et hz_dashscreen_placed — rafraîchie à playerJoining et à chaque interaction. La migration additive s'exécute au démarrage (ALTER TABLE ADD COLUMN IF NOT EXISTS)

Commande admin /tvclean

Sous-commandeAction
/tvclean listTop 20 des propriétaires par inactivité — identifiant, nombre de placements, jours d'inactivité
/tvclean runDéclencher un cycle de nettoyage automatique immédiatement (respecte AutoCleanupDays)
/tvclean purge <identifier>Supprimer TOUS les placements (TV + DashScreens) pour un identifiant spécifique
Protégé via Config.Placer.CleanupAdminPermission (ACE). Aussi exports["hz_television"]:RunHZTVCleanup().

Modèles TV

Chaque écran interactif est une entrée dans Config.Models indexée par nom de modèle :

Config.Models = {
    ['hz_tv_m'] = {
        Offset   = vector3(0.0, -0.02, 0.55),
        Scale    = { x = 0.42, y = 0.236 },       -- demi-largeur / demi-hauteur
        Rotation = { x = 0.0, y = 0.0, z = 0.0 },
        RenderTexture = { dict = 'hz_tv_m', name = 'hz_tv_m_screen' },
    },

    -- Ecran cinema courbe (v3.3)
    ['prop_curved_screen_m'] = {
        Offset = vector3(0.0, -0.2, 2.7),
        Scale  = { x = 2.80, y = 1.575 },
        Rotation = { x = 0.0, y = 0.0, z = 0.0 },
        Curve  = {
            Radius = 23.00,   -- rayon de l'arc physique (metres)
            Arc    = 25.11,   -- angle de balayage de l'arc (degres)
            Invert = false,   -- true = concave vers le spectateur
        },
        RenderTexture = { dict = 'prop_curved_screen_m', name = 'curved_screen_m' },
    },

    -- Grand panneau d'affichage vanilla GTA V (render target detecte automatiquement)
    ['prop_huge_display_01'] = {
        Offset   = vector3(0.0, 0.15, 0.0),
        Scale    = { x = 8.0, y = 4.5 },
        Rotation = { x = 0.0, y = 0.0, z = 0.0 },
        RenderTexture = { dict = 'big_disp', name = 'big_disp' },  -- meme dict/name = render target
    },
}

Ajouter un modèle personnalisé

  1. Ajoutez une entrée indexée par nom de modèle dans Config.Models
  2. Lancez-vous en jeu, approchez-vous du prop
  3. Exécutez /tvcfg → sélectionnez le modèle → le gizmo 3D vous permet de calibrer Scale / Offset / Rotation en direct
  4. Pour les props courbes, activez le raycast cylindrique : cochez Curve, définissez Radius + Arc + (optionnellement) Invert. Un aperçu cyan en arc montre la zone de clic exacte
  5. Sauvegarder écrit la calibration dans tv_config.json (persiste entre les redémarrages)
L'aperçu en direct utilise la même formule que RaycastTVCylinder — donc "l'arc cyan aligne avec la surface du prop" ↔ "le clic est précis". Si l'aperçu est décalé, le curseur l'est aussi.

SmartTV sur panneaux d'affichage & cinéma (v3.3)

Opt-in par modèle : quels écrans panneau / cinéma utilisent l'interface Smart TV complète au lieu du panneau Ghost Protocol cyberpunk.

Config.BillboardUseSmartTV = {
    -- Ecrans cinema courbes — toujours opt-in
    ['prop_curved_screen_s'] = true,
    ['prop_curved_screen_m'] = true,
    ['prop_curved_screen_l'] = true,

    -- Grands panneaux vanilla GTA V — detection automatique render target en v3.3
    ['prop_huge_display_01'] = true,
    ['prop_huge_display_02'] = true,

    -- Ajoutez tout autre modele RenderTexture ici pour activer la Smart TV dessus
}

Tout ce qui n'est pas dans cette liste garde le panneau NUI classique Ghost Protocol (toujours entièrement fonctionnel pour les panneaux configures une fois pour toutes).


DashScreen (v3.2 + v3.3 audio + v3.4 QoL gizmo)

Le DashScreen ne vit pas uniquement dans Config.Placer.Items — le bloc de configuration dédié règle l'UX de placement, l'occlusion audio et le gizmo.

Activer / Désactiver DashScreen (v3.4.5)

Interrupteur principal — définissez Enabled = false pour ignorer entièrement la fonctionnalité DashScreen (enregistrement des items, options target, invite de placement, tick de réconciliation). Les TV murales / cinéma / panneaux ne sont pas affectées.

Config.DashScreen = {
    Enabled = true,  -- v3.4.5+ ; mettre false pour desactiver la variante DashScreen en vehicule
}

Occlusion audio cabine (v3.3)

Le pipeline Web Audio à l'intérieur du DUI DashScreen simule le filtre sonore natif RAGE du véhicule (lowpass + bass shelf) car l'audio DUI contourne l'occlusion propre du moteur. Aucune configuration généralement nécessaire — les valeurs par défaut correspondent au comportement RAGE — mais les plages peuvent être ajustées :

Config.DashScreen = {
    Enabled          = true,  -- v3.4.5+ ; interrupteur principal
    AudioCabinRange  = 5.0,   -- metres ; au-dela, les auditeurs hors du vehicule entendent le silence
    SealedLowpass    = 600,   -- frequence de coupure Hz quand toutes les portieres sont fermees
    OpenLowpass      = 2200,  -- frequence de coupure Hz quand toutes les portieres sont ouvertes
    SealedBassBoost  = 6,     -- dB peaking shelf a 80 Hz quand scelle (diminue avec l'ouverture des portieres)
    SealedGain       = 0.25,  -- multiplicateur de volume master quand scelle
    OpenGain         = 0.70,  -- multiplicateur de volume master toutes portieres ouvertes
    TransitionMs     = 80,    -- lissage linearRampToValueAtTime pour les changements d'etat des portieres
}

UX de placement (v3.4)

Pendant que le gizmo clavier est ouvert dans un véhicule :

  • Véhicule fige — FreezeEntityPosition(vehicle, true) + vitesse mise à zéro, défige à la confirmation / annulation. Pas de dérive
  • Contrôles véhicule désactives — accélérateur, frein, direction, frein à main coupes (keepVehicleControls = false)
  • Reset de la caméra première personne — SetGameplayCamRelativeHeading(0.0) + SetGameplayCamRelativePitch(0.0, 1.0) pour que la caméra regarde vers l'avant quelle que soit la direction visée par le joueur avant

Chaînes pre-enregistrees

Config.Channels = {
    {
        name     = 'Weazel News',
        url      = 'https://example.com/video.mp4',
        category = 'news',      -- regroupement optionnel dans l'interface Smart TV
        thumbnail = 'https://...', -- image de carte optionnelle
    },
    {
        name     = 'Los Santos Rock Radio',
        url      = 'https://example.com/stream.m3u8',
        category = 'music',
    },
}

Apparaît dans une section "Channels" sur l'écran d'accueil Smart TV. Les chaînes respectent les routing buckets et la synchronisation multi-joueur comme tout contenu URL.


Médias locaux

Hebergez des fichiers MP4 / MP3 directement dans hz_television/media/ et exposez-les comme section "Local Média" dans la Smart TV et l'application compagnon LB Phone :

Config.LocalMedia = {
    { title = "Server Intro",  file = "intro.mp4",  type = "video" },
    { title = "Ambient Radio", file = "radio.mp3",  type = "audio" },
    { title = "Event Clip",    file = "event.mp4",  type = "video" },
}

Un seul appui lit le fichier sur la TV active. Idéal pour les intros serveur, clips d'événements, boucles radio d'ambiance, publicités personnalisées.


Mode silencieux

Mute en un clic toutes les TV à proximité — pour les créateurs de contenu qui doivent couper l'audio du jeu de leur stream sans toucher l'expérience des autres joueurs.

Config.Streamer = {
    Enabled            = true,
    DefaultMute        = false,
    ToggleCommand      = 'streamermode',  -- /streamermode
    AffectsNewScreens  = true,            -- mute automatiquement les ecrans nouvellement detectes (v3.3)
}

Controlable depuis d'autres scripts via exports["hz_television"]:SetStreamerMode(true/false) — voir Exports.


Commandes

Config.Commands = {
    Configurator = 'tvcfg',        -- ouvrir le calibrateur gizmo en direct
    Billboard    = 'billboard',    -- modifier le contenu du panneau a proximite
    DashScreen      = 'dashscreen',      -- raccourci F5 — interagir avec le DashScreen du vehicule actuel
    DashScreenOn    = 'dashscreen_on',   -- allumer + ouvrir la SmartTV
    DashScreenRemove = 'dashscreenremove', -- retirer le DashScreen du vehicule actuel
    Cleanup      = 'tvclean',      -- CLI de nettoyage admin (v3.4)
    Streamer     = 'streamermode', -- basculer le mode silencieux
}


Webhooks Discord (optionnel)

Config.Webhooks = {
    Enabled  = false,
    PlaceTV  = 'https://discord.com/api/webhooks/...',
    ConfigTV = 'https://discord.com/api/webhooks/...',
    Cleanup  = 'https://discord.com/api/webhooks/...',  -- v3.4 log d'audit /tvclean
}


Exemples avances

Serveur RP strict

Config.Permissions = {
    ConfiguratorCommand = 'admin',
    BillboardCommand    = 'job:police,admin',
    UseTV               = 'everyone',
    PlaceTV             = 'job:estate,admin',
}

Config.Placer = {
    Persistence          = true,
    MaxPerPlayer         = 3,        -- limite stricte
    AutoCleanupDays      = 30,       -- nettoyage apres 30 jours d'inactivite
    AutoCleanupInterval  = 6,
    BlockOnRoad          = true,     -- empeche l'encombrement des routes
    OnlyOwnerPickup      = true,
}

Serveur créatif / sandbox

Config.Permissions = {
    ConfiguratorCommand = 'everyone',
    BillboardCommand    = 'everyone',
    UseTV               = 'everyone',
    PlaceTV             = 'everyone',
}

Config.Placer = {
    Persistence          = true,
    MaxPerPlayer         = 0,         -- illimite
    AutoCleanupDays      = 0,         -- desactive
    BlockOnRoad          = false,
    OnlyOwnerPickup      = false,     -- n'importe qui peut ramasser
}


Après avoir modifie config.lua, exécutez restart hz_television depuis la console serveur — la plupart des paramètres prennent effet immédiatement sans redémarrage complet.