FAQ

General

¿El script es compatible con mi framework?

HZ-Television soporta QBCore, QBox, ESX y Standalone. La detección se gestiona por hz_lib — configure una sola vez allí y HZ-Television (+ cada otro Hz-Script) lo hereda automáticamente.

¿Puedo tener varias TV con contenido diferente al mismo tiempo?

Si — es uno de los principales argumentos de venta. Cada TV cercana muestra su propio contenido independiente (ya no hay limite de 5 pantallas desde v2.3, ya no hay limite de 12 TV desde la reescritura DrawSpritePoly). Incluso la funcionalidad DashScreen — cada vehículo con un item hz_dashscreen obtiene su propia variante con textura aislada, por lo que pasar frente a 12 coches en el trafico = 12 Smart TV diferentes.

¿Cuántos jugadores pueden ver la misma TV?

Ilimitado. La sincronización en tiempo real se gestiona mediante eventos basados en la placa y las coordenadas (heartbeat 5 s, tolerancia de desviación 1.5 s, precisión 0.1 s, seek/play/pause instantáneo). Los jugadores que llegan tarde reciben la posición exacta de reproducción al conectarse.

¿Y los routing buckets / instancias?

Totalmente compatible con routing bucket desde v3.1.2. Las TV, vallas publicitarias, bloqueos de operador y bucles de playlist están todos aislados por instancia. Dos TV en las mismas coordenadas en instancias diferentes nunca se superponen.

¿Consume muchos recursos?

Cliente en reposo: ~0.01 ms. Seis TV activas en pantalla: ~0.03 ms (datos de vértices DrawSpritePoly en cache). Servidor: ~0.00 ms. Vea Rendimiento.


Instalacion

Error: "Resource HZ-TelevisionProps not found"

hz_televisionprops se incluye con su descarga de HZ-Television (v3.4+) pero debe tener ensure por separado en server.cfg. Agregue ensure hz_televisionprops antes de ensure hz_television. Sin esto, las 12 variantes de props DashScreen no se transmiten y la colocación de DashScreen se bloquea silenciosamente en lib.requestModel.

Error: "Menu system not detected"

El script requiere ox_lib (recomendado) o qb-menu + qb-input. Instale uno y ponga ensure antes de hz_lib (que a su vez se inicia antes de HZ-Television).

Los items TV no aparecen en mi inventario

Debe agregar manualmente los items en el archivo de items de su inventario. Fragmentos pre-configurados se encuentran en hz_television/items/:


  • ox_inventory.txtox_inventory/data/items.lua

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

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


Reinicio completo del servidor requerido después de agregar los items (no solo restart hz_television).

Uso ak47_inventory — los items se muestran pero no se activan al usarlos

ak47_inventory no forma parte de la lista auto-detectada de hz_lib (ox_inventory, qb-inventory, qs-inventory, ps-inventory, codem-inventory, origen_inventory, core_inventory, tgiann-inventory). El bridge recurre a ESX nativo, pero ak47 intercepta los eventos de uso de item antes de que ESX los vea, por lo que RegisterUsableItem nunca se dispara.

Solución según la documentación ak47_inventory: conecte el callback directamente en la definicion del item con server.onUse. Abra la configuración de items de ak47 (tipicamente ak47_inventory/shared/items.lua o ak47_inventory/configs/items.lua) y agregue:

["hz_dashscreen"] = {
    name   = "hz_dashscreen",
    label  = "DashScreen Screen",
    weight = 3000,
    type   = "item",
    close  = true,
    server = {
        onUse = function(source, item)
            TriggerClientEvent('hz_television:useItem', source, { name = 'hz_dashscreen' })
        end,
    },
},

Repita para hz_television_screen si también utiliza las TV murales / cine. Coloque el .png correspondiente en la carpeta de imágenes UI de su ak47. Luego ensure ak47_inventory y ensure hz_television.

SQL Error 1067 o 1075 al importar install.sql

Ambos son rechazos del modo estricto de MariaDB corregidos en v3.4.6:

  • Error 1067 en last_logintimestamp DEFAULT NULL requiere una declaración NULL explicita en modo estricto. Ahora timestamp NULL DEFAULT NULL
  • Error 1075 en hz_dashscreen_placed — la columna id AUTO_INCREMENT requería una PRIMARY KEY. Ahora declarada
Actualice a v3.4.6+ y re-ejecute el nuevo install.sql. CREATE TABLE IF NOT EXISTS ignora las tablas ya creadas, por lo que solo las dos tablas que fallaban anteriormente se crean. Sin migración de datos.
Generic_texture_renderer_gfx — ¿lo necesito? No. Desde v2.3, el motor de renderizado utiliza DrawSpritePoly directamente. La antigua dependencia scaleform está eliminada.
¿Cómo hacer la actualización?
  1. Descargue la última versión desde keymaster.fivem.net
  2. Guarde su config.lua y tv_config.json
  3. Reemplace todos los archivos excepto esos dos
  4. Consulte el Changelog para las nuevas claves de configuración
  5. Reinicie el servidor
Para v3.3 → v3.4 específicamente: agregue ensure hz_televisionprops a server.cfg, y revise los nuevos campos Config.Placer.BlockOnRoad / MaxPerPlayer / AutoCleanupDays.

DashScreen (v3.2+)

¿Cómo colocar un DashScreen en mi coche?
  1. Ponga el item hz_dashscreen en su inventario
  2. Suba a un vehiculo (asiento del conductor)
  3. Use el item — un prop de vista previa aparece en el salpicadero y un gizmo de teclado toma el control
  4. Flechas = posición, Rueda del ratón = altura, Q/D (o A/D) = rotación, Z/S (o W/S) = inclinación, Enter = confirmar, Escape = cancelar
  5. Una vez colocado, utilice su sistema de target (ox\_target / qb-target) en el coche para Turn On DashScreenSmart TV
El vehículo se desplaza mientras ajusto el gizmo

Corregido en v3.4 — el vehículo ahora se congela automáticamente durante toda la duración del gizmo (FreezeEntityPosition + velocidad a cero + controles desactivados). Se descongela al confirmar / cancelar.

La cámara no mira hacia adelante cuando uso el item DashScreen

Corregido en v3.4 — la cámara en primera persona ahora se fija a heading=0 / pitch=0 al pasar a vista de cabina, sin importar la dirección que miraba el jugador antes.

¿Por qué no escucho el DashScreen cuando estoy fuera del coche?

Es intencional — el DashScreen es un audio de cabina, no un altavoz. El pipeline de oclusión Web Audio (v3.3) se corta completamente más allá de 5 m del vehículo. Dentro del coche (conductor + pasajeros), el audio es completamente limpio y sin filtrar. Los oyentes en una burbuja de 5 m en el exterior reciben una versión filtrada en lowpass y atenuada en volumen según el número de puertas abiertas.

Ajuste Config.DashScreen.AudioCabinRange si quiere un tamaño de burbuja diferente.

¿Puedo tener más de 12 DashScreens en el mapa?

Si — colocaciones ilimitadas. Cada cliente renderiza los 12 más cercanos (uno por variante con textura aislada), por lo que más allá de 12 visibles simultáneamente en el mismo cliente, los más lejanos son invisibles hasta que se acerque.

No quiero la funcionalidad DashScreen en vehículo

Desactivela correctamente vía config.lua (v3.4.5+):

Config.DashScreen = { Enabled = false }

Esto ignora el bucle RegisterUsableItem de los hz_dashscreen*, el registro de opciones de target, la invitación de colocación, el tick de reconciliación — todo lo especifico de DashScreen. Las TV murales / cine / vallas publicitarias siguen funcionando normalmente.

Mi DashScreen se cae a veces después de un choque violento

Corregido en v3.4.6 — el invariante not-attached del tick de reconciliación detecta cuando IsEntityAttached(prop) devuelve false (el prop se separo por la física de colisión), libera el slot, y lo re-adquiere en la siguiente pasada (≤ 500 ms). El prop se recoloca en el mismo vehículo con sus offsets originales, y el DUI se reactiva automáticamente ya que PoweredOn[cpId] se preserva a través del ciclo de liberación.

Active Config.Debug = true para ver la razón de liberación (not-attached) en la consola F8.


Uso

La pantalla esta negra o no se muestra nada Lista de verificación:
  1. ¿La TV está encendida? (Turn On vía el menú de target)
  2. ¿El modelo ha sido calibrado? Utilice /tvcfg cerca del prop — la vista previa cyan en vivo muestra exactamente donde esta la zona de clic del cursor
  3. Para las grandes vallas vanilla, agregue el modelo en Config.BillboardUseSmartTV (la detección automática del render target en v3.3 los gestiona automáticamente)
  4. Pruebe primero con un simple archivo de vídeo directo, no un livestream
  5. Verifique la consola F8 en busca de errores JS
Los clics del cursor están desfasados / no alcanzan los iconos
  • Props planos: utilice /tvcfg y ajuste Scale / Offset / Rotation. La vista previa cyan coincide exactamente con la zona de clic.
  • Props curvos: asegúrese de que el modelo tiene una entrada Curve = { Radius, Arc, Invert } y que la vista previa en arco (16 segmentos cyan) se alinea con la superficie real. Establezca Curve.Invert = true para los props que curvan hacia el espectador.
Sin sonido / sonido demasiado bajo
  • Encienda la TV
  • Acérquese — el volumen disminuye linealmente entre MinSoundDistance y MaxSoundDistance
  • Aumente Config.Display.MaxSoundDistance para un mayor alcance de audio
  • Para el DashScreen: el audio solo se reproduce dentro del coche (+ una burbuja de 5 m alrededor)
Una URL de vídeo no se reproduce Fuentes incrustadas: algunas páginas desactivan la integración, o la restringen por región. Pruebe la URL en un navegador normal en modo privado — si no se reproduce en una integración allí, tampoco se reproducirá en el juego. Canales en vivo: una fuente de streaming debe apuntar a una URL de canal en vivo, no a un archivo. V3 utiliza el SDK nativo del reproductor de la fuente cuando existe, por lo que volumen / pausa / mute funcionan de forma nativa.
Los demás jugadores no ven mi contenido Web Browser (sitios que requieren inicio de sesión)

La TV de cada jugador es su propia instancia de navegador CEF independiente con sus propias cookies y su propia sesión. El script sincroniza la URL hacia todos los espectadores, pero no el estado de sesión — es una limitación fundamental del aislamiento de navegadores relacionada con el funcionamiento de los DUI, no un bug del script.

Una URL que depende de una cuenta se muestra por jugador, cada uno viendo lo que devuelve su propia sesión. Solo las URLs públicamente accesibles se muestran de forma idéntica para todos.

Los jugadores que llegan tarde no ven el contenido de vídeo / navegador

La sincronización en tiempo real (heartbeat 5 s, tolerancia de desviación 1.5 s) los pone al día cuando transmiten la TV — obtienen automáticamente la posición de reproducción actual.

Si constata que los jugadores que llegan tarde obtienen una pantalla negra en el modo navegador específicamente, el problema generalmente es una condición de carrera entre la creación del DUI y la primera llamada SetDuiUrl cuando el jugador transmite. Asegúrese de que su hz_television está actualizado (la sincronización del navegador para llegadas tardías se reforzó en las versiones recientes con pasadas de reintento).

Otros puntos a verificar:


  • OneSync debe estar activado (set onesync on en server.cfg)

  • Si está en un routing bucket, ambos jugadores deben estar en el mismo bucket — los eventos de sincronización están aislados por bucket por diseño



Configuración

¿Cómo agregar un modelo TV / valla publicitaria personalizado?
  1. Agregue una entrada en Config.Models indexada por nombre de modelo con valores Scale / Offset / Rotation de partida razonables
  2. Cargue en el juego, acérquese al prop
  3. Ejecute /tvcfg → elija el modelo → calibre con el gizmo 3D; la vista previa cyan muestra la zona de clic en tiempo real
  4. Para pantallas curvas, active Curve + defina Radius / Arc / Invert
  5. Guarde — los valores se escriben en tv_config.json
¿Cómo impedir que los jugadores coloquen props en las carreteras?

Active la protección de carretera v3.4:

Config.Placer.BlockOnRoad = true

La vista previa de colocación se vuelve roja al apuntar a una superficie de carretera y Enter se bloquea. La colocación de DashScreen en vehículo siempre esta exenta — ese es el propósito mismo del DashScreen.

¿Cómo impedir que los jugadores inactivos dejen TV indefinidamente?

Utilice los campos de protección de abandono v3.4:

Config.Placer = {
    MaxPerPlayer        = 5,   -- limite estricto por propietario
    AutoCleanupDays     = 45,  -- eliminacion despues de 45 dias de inactividad
    AutoCleanupInterval = 6,   -- re-escaneo cada 6 horas
}

También disponible bajo demanda vía /tvclean run (comando admin) o exports['hz_television']:RunHZTVCleanup().

¿Cómo eliminar todas las colocaciones de un jugador especifico?

/tvclean purge <identifier>

También: /tvclean list muestra el top 20 de propietarios por inactividad para ayudarle a encontrar las cuentas abandonadas.

Las TV colocadas desaparecen al reiniciar

Active la persistencia:

Config.Placer.Persistence = true

Requiere oxmysql. Las tablas hz_television_placed y hz_dashscreen_placed se crean (+ se migran para la columna last_seen) automáticamente.

¿Cómo agregar canales pre-registrados?

Config.Channels = {
    { name = 'Weazel News', url = 'https://example.com/stream.m3u8', category = 'news'  },
    { name = 'LS Rock Radio',url = 'https://example.com/stream.m3u8', category = 'music' },
}

Aparece en una sección "Channels" en la interfaz Smart TV.


Permisos

Reservar las TV / la colocación solo para admins

Config.Permissions = {
    UseTV   = 'admin',
    PlaceTV = 'admin',
}

Restricción por trabajo

Config.Permissions = {
    UseTV   = 'job:police,ambulance',
    PlaceTV = 'job:estate',
}

Formato: 'job:nombredeltrabajo' o 'job:job1,job2' para varios.


Avanzado / Integración

Las TV no se sincronizan entre los jugadores

Active OneSync — set onesync on en server.cfg. Asegúrese también de estar en un build FiveM razonablemente reciente (2802+).

Lag / tirones con muchas TV

Desde v3.1, el motor de renderizado almacena en cache los datos de vértices, por lo que 6 TV en pantalla cuestan aproximadamente lo mismo que 1 TV antes del cache. Si aún experimenta problemas, baje Config.Display.RenderDistance (ej. 30 m) y Config.Display.DefaultRange (ej. 20 m).

Error "Failed to load video" en F8

Generalmente una restricción de integración, un bloqueo regional o un vídeo eliminado. Pruebe la URL en un navegador normal en modo privado. Si la URL requiere renderizado de navegador, pase mode = 'browser' al llamar a PlayVideoOnTelevision.

¿Cómo desactivar completamente las vallas publicitarias?

Retire los modelos de vallas de Config.BillboardUseSmartTV Y de Config.Models. Las vallas publicitarias vanilla de GTA V (prop_huge_display_01/02) recurrirán entonces a su contenido render target por defecto (que generalmente es nada en el juego).

¿Cómo integrar con esx\_property / qb-houses?

Utilice los eventos del servidor para restringir la colocación — vea Exports y Eventos para ejemplos completos.

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)

Transmisión de emergencia en todas las TV

Utilice PlayVideoOnTelevision en la lista obtenida vía GetAllPlacedTVs — vea los ejemplos Exports.


¿No encuentra su respuesta? Únase a nuestro Discord y abra un ticket en #support.