Instalación

Paso 1 — Descarga

Tras su compra en hzscripts.com/shop, su cuenta FiveM Keymaster recibe dos assets separados:

  1. Inicie sesión en keymaster.fivem.net (o portal.cfx.re/assets)
  2. Vaya a Granted Assets
  3. Descargue ambos:
* hz_television — el script principal * hz_televisionprops — las 12 variantes de props DashScreen en vehículo (entregadas como un asset dedicado para que las actualizaciones de los props no fuercen una re-descarga del recurso lógico completo)
Ambas descargas son necesarias. Los dos assets aparecen como entradas separadas en su portal Keymaster — debe obtener ambos. Si solo descarga hz_television, los 12 modelos de props DashScreen no se transmitirán y la colocación de DashScreen se bloqueara silenciosamente en lib.requestModel.
Importante: utilice la misma cuenta FiveM vinculada a su licencia Tebex. Los scripts están protegidos por escrow y requieren una licencia valida.

Paso 2 — Dependencias

Requeridas

  1. hz_lib — asset gratuito desde hzscripts.com/shop. Gestiona la detección de framework / inventario / target / menú / notificación. Utilice siempre la última versión — cada release de HZ-Television se prueba con la última versión del Bridge. Debe iniciarse antes de HZ-Television. Vea Instalación hz_lib.
  2. HZ-TelevisionProps — descargado por separado desde Keymaster junto con HZ-Television (vea Paso 1). Transmite las 12 variantes de props DashScreen (hz_dashscreen + hz_dashscreen_1..11) + su JSON de calibración. Debe iniciarse antes de HZ-Television.
  3. Un sistema de menú — al menos uno de los siguientes:
* ox\_lib (recomendado) — overextended/ox\_lib * qb-menu + qb-input — incluidos con QBCore / QBox
  1. Un driver SQL (requerido para la persistencia, cuentas, playlists, limpieza de abandono). HZ-Television detecta automáticamente ambos al inicio:
* oxmysql (recomendado — moderno, activamente mantenido) — overextended/oxmysql * mysql-async (stack QBCore v1 legacy) — aún soportado mediante el shim de compatibilidad

Opcionales

  • ox\_target o qb-target — para la interacción por mira (de lo contrario fallback TextUI / DrawText3D)
  • lb-phone — requerido para la aplicación compañera de teléfono lb-hztelevision
Actualice hz_lib antes de actualizar HZ-Television. Cada release Hz-Script se prueba con la última build del Bridge — versiones incompatibles provocaran errores "export not found" o deteccion faltante al inicio. Re-descargue hz_lib desde hzscripts.com/shop cada vez que obtenga una nueva release de HZ-Television.
Doble compatibilidad SQL (v3.4.1+) — HZ-Television detecta automáticamente al inicio si utiliza oxmysql o mysql-async e instala el shim MySQL.Async correspondiente. Verá una de estas lineas en la consola del servidor al inicio:

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

Si ve un ERROR: no SQL resource detected en rojo, asegúrese de que ensure oxmysql (o ensure mysql-async) se encuentre antes de ensure hz_television en su server.cfg.

hz_lib centraliza la detección. Ya no configura el framework / target / inventario por script — definalo una sola vez en hz_lib/config.lua y cada Hz-Script lo hereda. Vea Configuración hz_lib.

Paso 3 — Archivos

  1. Extraiga ambos archivos (hz_television.zip y hz_televisionprops.zip) descargados desde Keymaster en el Paso 1
  2. Coloque ambas carpetas resultantes en su directorio resources/ — agruparlas en una carpeta de categoría común como [hz-scripts]/ permite mantener todo ordenado
server/
├── resources/
│   ├── ox_lib/
│   ├── oxmysql/                    ← o mysql-async (ambos estan soportados)
│   ├── [hz-scripts]/
│   │   ├── hz_lib/
│   │   ├── hz_televisionprops/        ← 2da descarga Keymaster (12 props DashScreen + calibration.json)
│   │   ├── hz_television/          ← 1ra descarga Keymaster (el script principal)
│   │   │   ├── client/
│   │   │   ├── server/
│   │   │   ├── html/
│   │   │   ├── config.lua
│   │   │   ├── fxmanifest.lua
│   │   │   └── ...

Paso 4 — Items de inventario

HZ-Television viene con 10 items colocables listos para usar. Definiciones de items pre-configuradas para cada inventario soportado se encuentran en hz_television/items/.

Items incluidos

ItemPropDescripción
hz_tv_s / hz_tv_m / hz_tv_lhz_tv_*Smart TV murales — pequeña / mediana / grande
hz_tv_s_stand / hz_tv_m_stand / hz_tv_l_standhz_tv_*_standSmart TV con soporte — pequeña / mediana / grande
curved_screen_s / curved_screen_m / curved_screen_lprop_curved_screen_*Pantallas de cine curvas
hz_dashscreenhz_dashscreen + 11 variantesDashScreen en vehículo (se coloca mediante el gizmo de teclado)

Para ox\_inventory

Abra ox_inventory/data/items.lua y agregue el contenido de hz_television/items/ox_inventory.txt (10 entradas incluyendo hz_dashscreen).

Ejemplo de entrada:

['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'
    }
},

Para qb-inventory / qs-inventory / ps-inventory

Copie el contenido del archivo hz_television/items/<inventory>.txt correspondiente en el archivo de items de su inventario.

Todos los items pasan por el mismo evento cliente HZ-Television:useItem, que el script intercepta y redirige hacia el flujo de colocación correcto (gizmo estático para las TV, gizmo de teclado en vehículo para DashScreen).

Paso 5 — Base de datos (recomendado)

La base de datos es opcional pero fuertemente recomendada — sin ella, pierde la persistencia de las TV colocadas, el sistema de cuentas, la playlist personal y la funcionalidad de limpieza de abandono.

Active en config.lua:

Config.Placer = {
    Persistence        = true,   -- las TV + DashScreens colocados sobreviven al reinicio
    MaxPerPlayer       = 0,      -- 0 = ilimitado, N = limite por identificador de propietario
    AutoCleanupDays    = 0,      -- 0 = desactivado, N = eliminacion automatica despues de N dias de inactividad
    AutoCleanupInterval = 6,     -- horas entre los ciclos de limpieza (0 = solo al inicio)
    BlockOnRoad        = false,  -- true = bloquea la colocacion de props en carreteras (DashScreen exento)
    CleanupAdminPermission = 'admin',  -- permiso ACE para /tvclean
}

Las siguientes tablas se crean automáticamente en el primer inicio (todas utilizan CREATE TABLE IF NOT EXISTS + migraciones aditivas ALTER TABLE ADD COLUMN IF NOT EXISTS):

  • hz_television_placed — TV estáticas colocadas (murales, con soporte, curvas, vallas)
  • hz_dashscreen_placed — colocaciones DashScreen indexadas por placa de vehículo
  • hz_tv_users, hz_tv_sessions, hz_tv_favorites, hz_tv_history, hz_tv_playlists, hz_tv_playlist_items — cuenta / inicio de sesión / favoritos / historial / playlists (poblados en el primer inicio de sesión Smart TV)

Instalación manual (fallback — v3.4.3+)

Si una tabla no puede crearse automáticamente (usuario MySQL sin permiso CREATE, cadena de conexión apuntando a la base incorrecta, etc.), verá un error rojo en la consola del servidor justo después de [hz_television] SQL compat: ... con el nombre exacto de la tabla + el error. En ese caso, ejecute el archivo install.sql proporcionado manualmente:

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

...o abra hz_television/install.sql en phpMyAdmin / HeidiSQL / DBeaver y ejecútelo en la base de datos de su servidor. Luego reinicie hz_television. El script solo contiene instrucciones CREATE TABLE IF NOT EXISTS, por lo que ejecutarlo dos veces es seguro.

Solo v3.4.3+ — el antiguo error Table 'yourdb.hz_tv_sessions' doesn't exist al iniciar sesión ahora falla limpiamente con una respuesta db_not_ready en lugar de crashear, y el log del servidor le dirige hacia install.sql. Las versiones anteriores hacían crashear el flujo de sesión.

Paso 6 — server.cfg

Agregue los recursos a su server.cfg en este orden:

# Dependencias (deben iniciarse ANTES de hz_lib)
ensure oxmysql                # o `ensure mysql-async` — HZ-Television soporta ambos
ensure ox_lib                 # o qb-menu + qb-input
ensure ox_target              # o qb-target (opcional)

# Framework (si corresponde)
ensure qbx_core               # o ensure qb-core, o ensure es_extended
# ensure qb-core
# ensure es_extended

# HZ-Scripts — el orden importa
ensure hz_lib              # gestiona la deteccion automatica
ensure hz_televisionprops        # transmite las 12 variantes de props DashScreen (descarga Keymaster separada)
ensure hz_television          # el recurso logico TV

El orden de inicio es critico. hz_lib, hz_televisionprops y su driver SQL (oxmysql o mysql-async) deben iniciarse todos antes de hz_television. Si hz_televisionprops no tiene ensure, los 12 modelos de variantes DashScreen no se transmitirán y la colocación de DashScreen fallara silenciosamente en lib.requestModel. Si ningún driver SQL tiene ensure, la persistencia deja de funcionar silenciosamente.

Paso 7 — Configuración

Abra hz_television/config.lua y adapte los parámetros. Vea Configuración para cada opción en detalle.

Puntos esenciales a verificar antes de la puesta en producción:
  • Config.Locale'en' / 'fr' / 'es' / 'de'
  • Config.Permissions — quien puede usar /tvcfg, colocar TV, usar las TV
  • Config.Placer.Persistencetrue para activar el guardado en base de datos
  • Config.Placer.BlockOnRoadtrue si quiere bloquear la colocación en carreteras
  • Config.Placer.MaxPerPlayer + Config.Placer.AutoCleanupDays — protección de abandono
  • Config.BillboardUseSmartTV — que modelos de vallas/cine deben usar la interfaz Smart TV completa (por defecto: los 3 props de cine curvo + 2 grandes vallas vanilla)
Los ajustes de framework / target / menú / notificación / inventario se gestionan en hz_lib — vea Configuración hz_lib.

Paso 8 — Verificación

  1. Inicie el servidor
  2. La consola debería mostrar (en orden):
* [hz_lib] <framework> detected, <inventory> detected, ... * [hz_televisionprops] shared/models.lua loaded [hz_television] SQL compat: detected oxmysql, MySQL.Async shim installed (o detected existing MySQL.Async (mysql-async or compatible))* * [hz_television] v3.4.1 loaded successfully * [hz_television] Database tables initialized
  1. Conectese al juego
  2. Acérquese a un prop TV (TV mural, pantalla de cine curva, o utilice el item hz_dashscreen en un vehículo)
  3. Seleccione Power OnSmart TV → pegue una URL de vídeo
¡Listo! Si la interfaz Smart TV se abre y su URL se reproduce, el script funciona. Pase a Configuración para personalizar los modelos, los permisos y los umbrales de protección de abandono.

Solución rápida de problemas

El script no se inicia

Verifique:


  • Las carpetas están correctamente nombradas hz_television, hz_televisionprops, hz_lib (sensible a mayúsculas)

  • Las tres tienen ensure en server.cfg en el orden correcto (Bridge → TelevisionProps → Television)

  • Su licencia FiveM es valida en Keymaster

  • Un sistema de menú (ox_lib o qb-menu) tiene ensure antes de hz_lib

Error "Framework not detected"

La deteccion se gestiona por hz_lib. Asegúrese de que:


  • es_extended, qb-core o qbx_core tiene ensure antes de hz_lib

  • hz_lib tiene ensure antes de HZ-Television

  • Verifique la línea de consola de hz_lib para confirmar la detección automática

  • Fuerce un framework si es necesario en el config.lua de hz_lib — ej. HZBridge.Framework = 'esx'

La colocación de DashScreen falla silenciosamente

Causa más común: hz_televisionprops no está iniciado. lib.requestModel(hz_dashscreen) se queda bloqueado indefinidamente porque el modelo no se transmite.

hz_televisionprops es una descarga separada en Keymaster — no esta incluido con hz_television. Confirme:


  • Ambos assets están listados en sus Granted Assets de Keymaster y se han descargado

  • La carpeta hz_televisionprops se encuentra junto a hz_television en resources/

  • ensure hz_televisionprops está en su server.cfg antes de ensure hz_television

  • El recurso aparece como started en la consola del servidor

Las TV colocadas no se guardan después del reinicio / Error "no SQL resource detected"

HZ-Television necesita oxmysql o mysql-async en funcionamiento. Al inicio, la consola del servidor muestra uno de los siguientes mensajes:

[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 obtiene el error rojo:


  • Asegúrese de que ensure oxmysql (o ensure mysql-async) está en server.cfg

  • Debe estar colocado antes de ensure hz_television — si el recurso SQL se carga después, la detección en tiempo de ejecución lo pierde

  • Ambos drivers están soportados — elija uno; no los ejecute simultáneamente

Error "Table 'yourdb.hz_tv_sessions' doesn't exist" cuando un jugador inicia sesión en una Smart TV

El paso de creación automática no pudo construir una o más tablas. Verá lineas rojas justo después de SQL compat: detected ... durante el inicio:

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

Solución (v3.4.3+):

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

O abra hz_television/install.sql en phpMyAdmin / HeidiSQL / DBeaver y ejecútelo en la base de datos de su servidor. Luego reinicie hz_television. El archivo solo contiene instrucciones CREATE TABLE IF NOT EXISTS — ejecutarlo dos veces es seguro.

Causas comunes del fallo de creación automática:


  • El usuario MySQL configurado en set mysql_connection_string no tiene el permiso CREATE en la base de datos destino → conceda CREATE, ALTER, INDEX y reinicie

  • La cadena de conexión apunta a una base que el usuario puede leer pero no escribir → verifique el nombre de la base

  • MySQL funciona en modo STRICT con configuraciones de sesión incompatibles → install.sql establece explícitamente SQL_MODE = '' al inicio para evitar este problema


Si ve SQL Error 1067 (Invalid default value for 'last_login') o SQL Error 1075 (Incorrect table definition; there can be only one auto column and it must be defined as a key) al importar install.sql, está en una versión antigua de HZ-Television. Ambos errores fueron corregidos en v3.4.6 — actualice y re-ejecute el nuevo install.sql.

En v3.4.3+, el flujo de inicio de sesión ahora falla limpiamente con db_not_ready cuando las tablas faltan, en lugar de crashear en plena consulta.

La pantalla permanece negra / sin visualización
  • Utilice /tvcfg cerca de la TV para calibrar Scale/Offset/Rotation (la vista previa cyan en vivo muestra exactamente donde esta la zona de clic del cursor)
  • Pruebe primero con un simple archivo de vídeo directo (no un livestream)
  • Verifique la consola F8 en busca de errores JavaScript
  • Para las grandes vallas vanilla, asegúrese de que el modelo está en Config.BillboardUseSmartTV (la detección automática del render target en v3.3 los gestiona)
Sin sonido o sonido global
  • Aumente Config.Display.MaxSoundDistance en config.lua
  • Asegúrese de que la TV está encendida
  • Acérquese (el volumen disminuye entre MinSoundDistance y MaxSoundDistance)
  • Para el DashScreen específicamente: el audio tiene un alcance de cabina de 5 m con oclusión Web Audio. El conductor + los pasajeros tienen un sonido limpio y completo; los oyentes exteriores reciben un sonido filtrado y atenuado
Los items TV no aparecen en el inventario
  • Agregue los items desde hz_television/items/<inventory>.txt en el archivo de items de su inventario
  • Reinicie el servidor completamente después de agregar los items (no solo el recurso)
  • Para ox\_inventory la ruta es ox_inventory/data/items.lua
  • Para QBCore/QBox es qb-core/shared/items.lua o qbx_core/shared/items.lua