>
Tutorial 2026-05-09

Criar um Job de Jornalista para FiveM

OntelMonke

OntelMonke

Developer & Criador de Conteúdo na Agency Scripts

O papel dos repórteres de notícias na dramatização

Um trabalho de repórter de notícias adiciona uma camada social exclusiva ao seu servidor FiveM que nenhum outro trabalho oferece. Os repórteres atuam como o tecido conjuntivo entre os eventos do servidor, documentando crimes, entrevistando jogadores e transmitindo histórias que moldam a narrativa da sua cidade. Ao contrário da maioria dos trabalhos que operam isoladamente, as reportagens cruzam-se naturalmente com todas as facções do servidor: as perseguições policiais tornam-se notícias de última hora, os conflitos de gangues tornam-se histórias investigativas e as decisões do conselho municipal tornam-se peças editoriais. Isso cria um roleplay orgânico entre facções que os proprietários de servidores tentam constantemente encorajar, mas raramente conseguem apenas através da mecânica. Um bom sistema de notícias dá aos repórteres as ferramentas para capturar eventos, escrever artigos visíveis para todos os jogadores e transmitir reportagens ao vivo que aparecem nas telas ao redor do mapa. Quando os jogadores veem suas ações nas manchetes, isso reforça que sua interpretação é importante e os incentiva a criar histórias mais atraentes.

Configuração da estação de notícias e estrutura de trabalho

A estação de notícias serve como centro onde os repórteres marcam ponto, acessam equipamentos, escrevem artigos e coordenam-se com sua equipe. Defina a localização da estação, o armazenamento do equipamento e o estúdio de transmissão dentro da sua configuração. Estruture a hierarquia de cargos com funções como estagiário, repórter, âncora e editor-chefe, cada um com permissões crescentes. Os estagiários podem escrever rascunhos, mas precisam da aprovação do editor antes de publicar. Os repórteres podem publicar artigos e usar equipamentos de câmera. Os âncoras ganham acesso ao estúdio de transmissão para reportagens ao vivo. O editor-chefe gerencia a equipe e controla o noticiário que rola pela tela de cada jogador:

Config.NewsStation = {
    label = 'Weazel News',
    jobName = 'reporter',
    location = vector3(-598.97, -929.54, 23.89),
    studioRoom = vector3(-592.12, -924.88, 23.89),
    equipmentLocker = vector3(-601.33, -932.17, 23.89),
    grades = {
        [0] = { name = 'Intern',   canPublish = false, canBroadcast = false },
        [1] = { name = 'Reporter', canPublish = true,  canBroadcast = false },
        [2] = { name = 'Anchor',   canPublish = true,  canBroadcast = true  },
        [3] = { name = 'Editor',   canPublish = true,  canBroadcast = true,
                canManage = true },
    },
    equipment = {
        { item = 'news_camera',     label = 'News Camera' },
        { item = 'news_microphone', label = 'Microphone' },
        { item = 'press_badge',     label = 'Press Badge' },
        { item = 'news_notepad',    label = 'Notepad' },
    },
    vehicles = {
        { model = 'rumpo',  label = 'News Van',    grade = 1 },
        { model = 'frogger', label = 'News Chopper', grade = 2 },
    },
}

A van de notícias é essencial porque funciona como estação de transmissão móvel. Equipe-o com uma antena parabólica no teto e permita que os repórteres iniciem transmissões ao vivo de qualquer local, desde que estejam perto da van. O helicóptero fornece recursos de filmagem aérea para âncoras que cobrem eventos de grande escala, como perseguições policiais ou emergências em toda a cidade. Cada veículo deve ser restrito por categoria de trabalho para evitar que os estagiários pilotem o helicóptero no primeiro dia.

Câmera e sistema de gravação

O sistema de câmeras é o mecanismo central que faz com que as notícias pareçam autênticas. Quando um repórter equipar o item de câmera de notícias, mude para uma visão de câmera em primeira pessoa com uma sobreposição de gravação que mostra um indicador REC vermelho, um cronômetro e um nível de bateria. A câmera deve suportar controles de zoom usando a roda de rolagem e um modo de captura de foto que tira uma captura de tela do jogo e a armazena como um anexo de artigo. Use o sistema de câmera nativo do GTA para criar uma sensação suave de câmera portátil com leve oscilação de movimento que faz com que a filmagem pareça natural em vez de perfeitamente estática:

local isRecording = false
local recordingCam = nil
local recordTimer = 0

function StartCamera()
    if isRecording then return end
    isRecording = true

    local playerPed = PlayerPedId()
    recordingCam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)

    -- Position camera at player's head height
    local headBone = GetPedBoneCoords(playerPed, 31086, 0.0, 0.0, 0.0)
    SetCamCoord(recordingCam, headBone.x, headBone.y, headBone.z)
    SetCamRot(recordingCam, GetEntityRotation(playerPed, 2))
    SetCamFov(recordingCam, 50.0)
    SetCamActive(recordingCam, true)
    RenderScriptCams(true, true, 500, true, false)

    -- Show recording overlay via NUI
    SendNUIMessage({
        action = 'showRecordingOverlay',
        stationName = 'WEAZEL NEWS',
        reporterName = GetPlayerName(PlayerId())
    })

    -- Camera control thread
    CreateThread(function()
        local currentFov = 50.0
        while isRecording do
            -- Follow player head position
            local head = GetPedBoneCoords(playerPed, 31086, 0.0, 0.0, 0.0)
            SetCamCoord(recordingCam, head.x, head.y, head.z)

            -- Mouse look controls
            local pitch = GetDisabledControlNormal(0, 2) * -5.0
            local yaw = GetDisabledControlNormal(0, 1) * -8.0
            local rot = GetCamRot(recordingCam, 2)
            SetCamRot(recordingCam, rot.x + pitch, rot.y, rot.z + yaw, 2)

            -- Zoom with scroll wheel
            if IsDisabledControlPressed(0, 241) then
                currentFov = math.max(15.0, currentFov - 2.0)
            elseif IsDisabledControlPressed(0, 242) then
                currentFov = math.min(80.0, currentFov + 2.0)
            end
            SetCamFov(recordingCam, currentFov)

            -- Update timer
            recordTimer = recordTimer + 1
            SendNUIMessage({
                action = 'updateTimer',
                time = math.floor(recordTimer / 60)
            })

            DisableAllControlActions(0)
            EnableControlAction(0, 249, true) -- Allow push to talk
            Wait(0)
        end
    end)
end

A sobreposição de gravação exibida por meio do NUI deve replicar um visor de câmera de notícias profissional com colchetes emoldurando a cena, uma marca d'água com o logotipo da estação e uma barra de rolagem no terço inferior mostrando o nome do repórter. Quando o repórter parar de gravar, esmaeça a sobreposição e faça uma transição suave de volta para a câmera normal do jogo. Armazene a duração da gravação e os dados de localização para que possam ser referenciados ao escrever o artigo associado.

Redação e publicação de artigos

Dê aos repórteres um editor de artigos completo, acessível na estação de notícias ou por meio do bloco de notas em campo. O editor deve usar uma interface de rich text baseada em NUI, onde os repórteres digitam uma manchete, escrevem o corpo do artigo, selecionam uma categoria como crime, política, esportes ou entretenimento e anexam quaisquer fotos tiradas com o sistema de câmera. Os artigos publicados aparecem em um jornal do jogo acessível a partir de suportes de caixas de jornais colocados pela cidade e de aplicativos de telefone se o seu servidor usar um sistema telefônico. Armazene artigos no banco de dados com carimbos de data e hora, informações do autor e contagens de visualizações para rastrear quais histórias geram mais envolvimento do jogador:

RegisterNetEvent('news:server:publishArticle', function(articleData)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)

    -- Verify job and permissions
    if Player.PlayerData.job.name ~= 'reporter' then return end
    local grade = Config.NewsStation.grades[Player.PlayerData.job.grade.level]
    if not grade or not grade.canPublish then
        TriggerClientEvent('QBCore:Notify', src,
            'Your rank cannot publish articles', 'error')
        return
    end

    -- Sanitize input
    local headline = articleData.headline:sub(1, 120)
    local body = articleData.body:sub(1, 5000)
    local category = articleData.category or 'general'

    -- Insert into database
    local articleId = MySQL.insert.await(
        'INSERT INTO news_articles (author_id, author_name, headline, body, category, created_at) VALUES (?, ?, ?, ?, ?, NOW())',
        {Player.PlayerData.citizenid, Player.PlayerData.charinfo.firstname ..
         ' ' .. Player.PlayerData.charinfo.lastname,
         headline, body, category}
    )

    -- Broadcast notification to all players
    TriggerClientEvent('news:client:newArticle', -1, {
        id = articleId,
        headline = headline,
        category = category,
        author = Player.PlayerData.charinfo.firstname .. ' ' ..
                 Player.PlayerData.charinfo.lastname
    })

    -- Update news ticker
    TriggerClientEvent('news:client:updateTicker', -1,
        'BREAKING: ' .. headline)

    TriggerClientEvent('QBCore:Notify', src,
        'Article published successfully!', 'success')
end)

Sistema de transmissão ao vivo

As transmissões ao vivo são o recurso mais interessante de um sistema de repórteres de notícias porque criam eventos em todo o servidor que todos os jogadores podem testemunhar em tempo real. Quando um âncora inicia uma transmissão ao vivo do estúdio ou perto da van de notícias, seu áudio através do chat de voz deve ser direcionado para todos os jogadores no servidor dentro de um intervalo configurável ou em todo o servidor, dependendo de sua preferência. Exiba um banner de transmissão na tela de cada jogador mostrando o logotipo da estação, o nome do âncora e um indicador ao vivo. A transmissão pode opcionalmente exibir a imagem da câmera em telas de TV do jogo colocadas em interiores ao redor do mapa usando alvos de renderização. Implemente um resfriamento de transmissão para evitar spam e exija a função de âncora para evitar que todos os estagiários entrem ao vivo no primeiro dia. O sistema de transmissão deve lidar com casos extremos com elegância: se o âncora se desconectar no meio da transmissão, encerrará automaticamente a transmissão e exibirá uma mensagem de dificuldades técnicas. Se o âncora se afastar muito da van de notícias durante uma transmissão de campo, avise-o de que ele está perdendo o sinal e encerre a transmissão se ele não retornar a uma distância razoável.

Ticker de notícias e notificações

O noticiário é um elemento de interface de usuário persistente que rola as manchetes na parte inferior da tela de cada jogador, semelhante aos canais de notícias a cabo. Implemente-o como uma camada NUI que lê os artigos publicados mais recentes e alterna entre as manchetes em um cronômetro. Permita que o editor-chefe envie alertas urgentes de notícias de última hora que substituem o ticker normal com um banner destacado em vermelho e um som de alerta. O ticker deve ser descartado por jogadores individuais que o considerem uma distração, com uma configuração para ativá-lo ou desativá-lo por meio do telefone ou do menu de configurações. Atualizações do ticker com limite de taxa no lado do servidor para evitar abusos e manter a fila do ticker nas cinco manchetes mais recentes para evitar sobrecarregar os jogadores com notícias antigas. Quando um jogador clica em uma manchete, abra o artigo completo em um visualizador de jornal NUI para que ele possa ler a história completa sem visitar uma caixa física de jornal.

Mecânica de entrevistas e coletivas de imprensa

Adicione uma mecânica dedicada para conduzir entrevistas que vão além de uma conversa normal. Quando um repórter atingir outro jogador com o item do microfone, envie um pedido de entrevista que o alvo pode aceitar ou recusar. As entrevistas aceitas criam uma interação visível com a imprensa, onde os dois jogadores se enfrentam, o repórter segura o microfone e os jogadores próximos podem ver um indicador de imprensa acima de suas cabeças. Tudo o que foi dito durante a entrevista pode opcionalmente ser registrado como uma transcrição anexada ao bloco de notas do repórter para posterior redação do artigo. Para conferências de imprensa, crie locais designados para pódios na Prefeitura, na delegacia de polícia e no hospital, onde as autoridades possam se dirigir a vários repórteres simultaneamente. A localização do pódio amplifica o alcance da voz do palestrante e exibe seu nome e título em um gráfico no terço inferior, visível para todos os jogadores próximos, criando uma atmosfera autêntica de evento de imprensa que incentiva a representação política e institucional.

Dicas de desempenho e integração

O sistema de notícias atinge todos os jogadores do servidor por meio dos recursos de ticker e transmissão, portanto, a otimização do desempenho é crítica. Execute o noticiário como um elemento NUI leve que é atualizado em um longo intervalo, em vez de a cada quadro. Armazena em cache artigos publicados no lado do cliente após a busca inicial e somente solicita atualizações quando o jogador abre o visualizador de jornal ou quando chega uma notificação de novo artigo. Para transmissões ao vivo, direcione o áudio através do sistema de chat de voz existente em vez de criar um canal de áudio separado para evitar sobrecarga de largura de banda. Limite o número de artigos armazenados no banco de dados arquivando entradas com mais de trinta dias em uma tabela separada que os jogadores possam acessar através de um menu de arquivo de jornais. Limpe entidades de câmera e sobreposições de NUI agressivamente quando o trabalho do repórter muda, o recurso é reiniciado ou o jogador se desconecta para evitar artefatos visuais persistentes. Considere a integração com seu sistema telefônico para que os jogadores possam ler notícias diretamente de seus telefones, assinar categorias específicas e receber notificações push com as últimas notícias em suas áreas de interesse.

Partilhar este artigo

Pronto para melhorar o teu servidor?

Explora os nossos scripts FiveM premium na loja Agency Scripts ou junta-te à nossa comunidade no Discord para suporte e atualizações.