FAQ
Geral
O script e compativel com meu framework?
HZ-Television suporta QBCore, QBox, ESX e Standalone. A deteccao e gerenciada pelo hz_lib — configure uma unica vez la e o HZ-Television (+ cada outro Hz-Script) herda automaticamente.
Posso ter varias TVs com conteudo diferente ao mesmo tempo?
Sim — esse e um dos principais diferenciais. Cada TV proxima exibe seu proprio conteudo independente (sem mais limite de 5 telas desde v2.3, sem mais limite de 12 TVs desde a reescrita DrawSpritePoly). Ate a funcionalidade DashScreen — cada veiculo com um item hz_dashscreen recebe sua propria variante com textura isolada, entao passar por 12 carros no transito = 12 Smart TVs diferentes.
Quantos jogadores podem assistir a mesma TV?
Ilimitado. A sincronizacao em tempo real e gerenciada via eventos baseados em placa e coordenadas (heartbeat 5 s, tolerancia de desvio 1.5 s, precisao 0.1 s, seek/play/pause instantaneo). Jogadores que chegam atrasados recebem a posicao exata de reproducao na conexao.
E os routing buckets / instancias?
Totalmente compativel com routing bucket desde v3.1.2. TVs, paineis publicitarios, travas de operador e loops de playlist sao todos isolados por instancia. Duas TVs nas mesmas coordenadas em instancias diferentes nunca se sobrepoe.
Consome muitos recursos?
Cliente em repouso: ~0.01 ms. Seis TVs ativas na tela: ~0.03 ms (dados de vertices DrawSpritePoly em cache). Servidor: ~0.00 ms. Veja Desempenho.
Instalacao
Erro: "Resource HZ-TelevisionProps not found"
hz_televisionprops e fornecido com seu download do HZ-Television (v3.4+) mas deve ter ensure separadamente no server.cfg. Adicione ensure hz_televisionprops antes de ensure hz_television. Sem isso, as 12 variantes de props DashScreen nao sao transmitidas e a colocacao de DashScreen fica bloqueada silenciosamente em lib.requestModel.
Erro: "Menu system not detected"
O script requer ox_lib (recomendado) ou qb-menu + qb-input. Instale um deles e coloque ensure antes do hz_lib (que por sua vez inicia antes do HZ-Television).
Os itens de TV nao aparecem no meu inventario
Voce precisa adicionar manualmente os itens no arquivo de itens do seu inventario. Trechos pre-configurados estao em hz_television/items/:
ox_inventory.txt→ox_inventory/data/items.luaqb-inventory.txt→qb-core/shared/items.lua(ouqbx_core/shared/items.lua)qs-inventory.txt→qs-inventory/shared/items.lua
Reinicializacao completa do servidor necessaria apos adicionar os itens (nao apenas
restart hz_television).
Uso ak47_inventory — os itens aparecem mas nao disparam ao usar
ak47_inventory nao faz parte da lista auto-detectada do hz_lib (ox_inventory, qb-inventory, qs-inventory, ps-inventory, codem-inventory, origen_inventory, core_inventory, tgiann-inventory). O bridge cai no ESX nativo, mas o ak47 intercepta os eventos de uso de item antes que o ESX os veja, entao RegisterUsableItem nunca dispara.
Correcao conforme a documentacao ak47_inventory: conecte o callback diretamente na definicao do item com server.onUse. Abra a config de itens do ak47 (tipicamente ak47_inventory/shared/items.lua ou ak47_inventory/configs/items.lua) e adicione:
["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 se voce tambem usa as TVs de parede / cinema. Coloque o .png correspondente na pasta de imagens UI do seu ak47. Depois ensure ak47_inventory e ensure hz_television.
SQL Error 1067 ou 1075 ao importar install.sql
Ambos sao rejeicoes de modo strict do MariaDB corrigidas na v3.4.6:
- Error 1067 em
last_login—timestamp DEFAULT NULLrequer uma declaracaoNULLexplicita em modo strict. Agoratimestamp NULL DEFAULT NULL - Error 1075 em
hz_dashscreen_placed— a colunaid AUTO_INCREMENTprecisava de umaPRIMARY KEY. Agora declarada
install.sql. CREATE TABLE IF NOT EXISTS ignora tabelas ja criadas, entao apenas as duas tabelas que falhavam anteriormente sao criadas. Sem migracao de dados.
Generic_texture_renderer_gfx — preciso disso?
Nao. Desde v2.3, o motor de renderizacao usaDrawSpritePoly diretamente. A antiga dependencia de scaleform foi removida.
Como fazer a atualizacao?
- Baixe a versao mais recente em keymaster.fivem.net
- Faca backup do seu
config.luaetv_config.json - Substitua todos os arquivos exceto esses dois
- Consulte o Changelog para novas chaves de configuracao
- Reinicie o servidor
ensure hz_televisionprops ao server.cfg e revise os novos campos Config.Placer.BlockOnRoad / MaxPerPlayer / AutoCleanupDays.
DashScreen (v3.2+)
Como colocar um DashScreen no meu carro?
- Coloque o item
hz_dashscreenno seu inventario - Entre em um veiculo (banco do motorista)
- Use o item — um prop de preview aparece no painel e um gizmo de teclado assume o controle
- Setas = posicao, Scroll = altura, Q/D (ou A/D) = rotacao, Z/S (ou W/S) = inclinacao, Enter = confirmar, Esc = cancelar
- Uma vez colocado, use seu sistema de target (ox\_target / qb-target) no carro para Turn On DashScreen → Smart TV
O veiculo deriva enquanto ajusto o gizmo
Corrigido na v3.4 — o veiculo agora e automaticamente congelado durante toda a duracao do gizmo (FreezeEntityPosition + velocidade zerada + controles desativados). Descongelado na confirmacao / cancelamento.
A camera nao olha para frente quando uso o item DashScreen
Corrigido na v3.4 — a camera em primeira pessoa agora se fixa em heading=0 / pitch=0 ao mudar para vista de cockpit, independentemente da direcao que o jogador olhava antes.
Por que nao ouco o DashScreen quando estou fora do carro?
Isso e intencional — o DashScreen e um audio de cabine, nao um alto-falante. O pipeline de oclusao Web Audio (v3.3) corta completamente alem de 5 m do veiculo. Dentro do carro (motorista + passageiros), o audio e totalmente limpo e nao filtrado. Ouvintes em uma bolha de 5 m fora recebem uma versao filtrada em lowpass e atenuada em volume de acordo com o numero de portas abertas.
Ajuste Config.DashScreen.AudioCabinRange se quiser um tamanho de bolha diferente.
Posso ter mais de 12 DashScreens no mapa?
Sim — colocacoes ilimitadas. Cada cliente exibe os 12 mais proximos (um por variante com textura isolada), entao alem de 12 simultaneamente visiveis no mesmo cliente, os mais distantes ficam invisiveis ate voce se aproximar.
Nao quero a funcionalidade DashScreen no veiculo
Desative-a de forma limpa via config.lua (v3.4.5+):
Config.DashScreen = { Enabled = false }
Isso ignora o loop RegisterUsableItem dos hz_dashscreen*, o registro de opcoes de target, o prompt de colocacao, o tick de reconciliacao — tudo que e especifico do DashScreen. As TVs de parede / cinema / paineis publicitarios continuam funcionando normalmente.
Meu DashScreen cai as vezes apos uma colisao violenta
Corrigido na v3.4.6 — o invariante not-attached do tick de reconciliacao detecta quando IsEntityAttached(prop) retorna false (o prop foi destacado pela fisica de colisao), libera o slot e o readquire na proxima passagem (≤ 500 ms). O prop se recoloca no mesmo veiculo nos seus offsets originais, e o DUI se reativa automaticamente pois PoweredOn[cpId] e preservado durante o ciclo de liberacao.
Ative Config.Debug = true para ver a razao de liberacao (not-attached) no console F8.
Uso
A tela esta preta ou nada e exibido
Checklist:- A TV esta ligada? (Turn On via menu de target)
- O modelo foi calibrado? Use
/tvcfgperto do prop — o preview ciano ao vivo mostra exatamente onde esta a zona de clique do cursor - Para grandes paineis vanilla, adicione o modelo em
Config.BillboardUseSmartTV(a deteccao automatica do render target na v3.3 os gerencia automaticamente) - Teste primeiro com um simples arquivo de video direto, nao um livestream
- Verifique o console F8 para erros JS
Os cliques do cursor estao desalinhados / erram os icones
- Props planos: use
/tvcfge ajuste Scale / Offset / Rotation. O preview ciano corresponde exatamente a zona de clique. - Props curvos: certifique-se de que o modelo tem uma entrada
Curve = { Radius, Arc, Invert }e que o preview em arco (16 segmentos cianos) se alinha com a superficie real. DefinaCurve.Invert = truepara props que curvam em direcao ao espectador.
Sem som / som muito baixo
- Ligue a TV
- Aproxime-se — o volume diminui linearmente entre
MinSoundDistanceeMaxSoundDistance - Aumente
Config.Display.MaxSoundDistancepara um alcance de audio maior - Para o DashScreen: o audio so toca dentro do carro (+ uma bolha de 5 m ao redor)
Uma URL de video nao reproduz
Fontes incorporadas: algumas paginas desativam a incorporacao, ou a restringem por regiao. Teste a URL em um navegador normal em aba anonima — se nao tocar em uma incorporacao la, nao tocara no jogo tambem. Canais ao vivo: uma fonte de streaming deve apontar para uma URL de canal ao vivo, nao um arquivo. V3 usa o SDK nativo do reprodutor da fonte quando existe, entao volume / pausa / mudo funcionam nativamente.Outros jogadores nao veem meu conteudo do Web Browser (sites que exigem login)
A TV de cada jogador e sua propria instancia independente de navegador CEF com seus proprios cookies e sua propria sessao. O script sincroniza a URL para todos os espectadores, mas nao o estado da sessao — isso e uma limitacao fundamental do isolamento de navegadores relacionada ao funcionamento dos DUI, nao um bug do script.
Uma URL que depende de uma conta e renderizada por jogador, cada um vendo o que sua propria sessao retorna. Apenas URLs publicamente acessiveis sao exibidas de forma identica para todos.
Jogadores que chegam atrasados nao veem o conteudo de video / navegador
A sincronizacao em tempo real (heartbeat 5 s, tolerancia de desvio 1.5 s) os alcanca quando eles transmitem a TV — eles recebem automaticamente a posicao de reproducao atual.
Se voce notar que jogadores atrasados recebem tela preta no modo navegador especificamente, o problema geralmente e uma condicao de corrida entre a criacao do DUI e a primeira chamada SetDuiUrl quando o jogador transmite. Certifique-se de que seu hz_television esta atualizado (a sincronizacao do navegador para chegadas tardias foi reforcada em versoes recentes com passadas de retry).
Outros pontos a verificar:
- OneSync deve estar ativo (
set onesync onnoserver.cfg) - Se voce esta em um routing bucket, os dois jogadores devem estar no mesmo bucket — os eventos de sincronizacao sao isolados por bucket por design
Configuracao
Como adicionar um modelo de TV / painel publicitario personalizado?
- Adicione uma entrada em
Config.Modelsindexada por nome de modelo com valores Scale / Offset / Rotation iniciais razoaveis - Carregue no jogo, aproxime-se do prop
- Execute
/tvcfg→ escolha o modelo → calibre com o gizmo 3D; o preview ciano mostra a zona de clique em tempo real - Para telas curvas, marque Curve + defina Radius / Arc / Invert
- Salve — os valores sao escritos em
tv_config.json
Como impedir jogadores de colocar props nas estradas?
Ative a protecao de estrada v3.4:
Config.Placer.BlockOnRoad = true
O preview de colocacao fica vermelho ao mirar uma superficie de estrada e Enter e bloqueado. A colocacao de DashScreen no veiculo e sempre isenta — e o principio do DashScreen.
Como impedir jogadores inativos de deixar TVs indefinidamente?
Use os campos de protecao de abandono v3.4:
Config.Placer = {
MaxPerPlayer = 5, -- limite estrito por proprietario
AutoCleanupDays = 45, -- remocao apos 45 dias de inatividade
AutoCleanupInterval = 6, -- re-scan a cada 6 horas
}
Tambem disponivel sob demanda via /tvclean run (comando admin) ou exports['hz_television']:RunHZTVCleanup().
Como remover todas as colocacoes de um jogador especifico?
/tvclean purge <identifier>
Tambem: /tvclean list exibe o top 20 de proprietarios por inatividade para ajudar a encontrar contas abandonadas.
As TVs colocadas desaparecem no reinicio
Ative a persistencia:
Config.Placer.Persistence = true
Requer oxmysql. As tabelas hz_television_placed e hz_dashscreen_placed sao criadas (+ migradas para a coluna last_seen) automaticamente.
Como adicionar canais 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 em uma secao "Channels" na interface Smart TV.
Permissoes
Reservar TVs / colocacao apenas para admins
Config.Permissions = {
UseTV = 'admin',
PlaceTV = 'admin',
}
Restricao por emprego
Config.Permissions = {
UseTV = 'job:police,ambulance',
PlaceTV = 'job:estate',
}
Formato: 'job:nomedoemprego' ou 'job:emprego1,emprego2' para varios.
Avancado / Integracao
As TVs nao sincronizam entre jogadores
Ative OneSync — set onesync on no server.cfg. Certifique-se tambem de estar em um build do FiveM razoavelmente recente (2802+).
Lag / engasgos com muitas TVs
Desde v3.1, o motor de renderizacao faz cache dos dados de vertices, entao 6 TVs na tela custam aproximadamente o mesmo que 1 TV antes do cache. Se voce ainda tiver problemas, diminua Config.Display.RenderDistance (ex. 30 m) e Config.Display.DefaultRange (ex. 20 m).
Erro "Failed to load video" no F8
Geralmente uma restricao de incorporacao, bloqueio regional ou video removido. Teste a URL em um navegador normal em aba anonima. Se a URL requer renderizacao de navegador, passe mode = 'browser' ao chamar PlayVideoOnTelevision.
Como desativar completamente os paineis publicitarios?
Remova os modelos de paineis de Config.BillboardUseSmartTV E de Config.Models. Os paineis publicitarios vanilla do GTA V (prop_huge_display_01/02) voltarao ao conteudo render target padrao (que geralmente e nada no jogo).
Como integrar com esx\_property / qb-houses?
Use os eventos do servidor para restringir a colocacao — veja Exports & Eventos para exemplos 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)
Transmissao de emergencia em todas as TVs
Use PlayVideoOnTelevision na lista obtida via GetAllPlacedTVs — veja os exemplos de Exports.
