Volver al blog
Tutorial10 min de lectura

Sistema de reporteros de noticias para FiveM: retransmisiones en directo

Añade un trabajo de reportero a FiveM con cámaras en directo, interfaz de emisión, propinas y guiones para crear historias en toda la ciudad.

Agency Scripts

Fundador y desarrollador principal en Agency Scripts

El papel de los reporteros en el roleplay

Un trabajo de reportero añade una capa social única a tu servidor de FiveM que ningún otro trabajo ofrece. Los reporteros conectan los eventos del servidor: documentan delitos, entrevistan a jugadores y difunden noticias que dan forma a la narrativa de tu ciudad. A diferencia de la mayoría de los trabajos, que funcionan de forma aislada, el periodismo se cruza de manera natural con todas las facciones del servidor: las persecuciones policiales se convierten en noticias de última hora, los conflictos entre bandas dan lugar a reportajes de investigación y las decisiones del ayuntamiento se convierten en artículos de opinión. Esto crea roleplay orgánico entre facciones, algo que los propietarios de servidores intentan fomentar constantemente, pero que rara vez consiguen solo con mecánicas. Un buen sistema de noticias da a los reporteros herramientas para documentar eventos, escribir artículos visibles para todos los jugadores y emitir reportajes en directo que aparecen en pantallas por todo el mapa. Cuando los jugadores ven sus acciones en los titulares, sienten que su roleplay importa y se animan a crear historias más interesantes.

Configuración de la redacción y estructura del trabajo

La redacción sirve como centro donde los reporteros fichan, acceden al equipo, escriben artículos y se coordinan con su equipo. Define la ubicación de la redacción, el almacenamiento del equipo y el estudio de transmisión en tu configuración. Estructura la jerarquía del trabajo con rangos como becario, reportero, presentador y editor jefe, cada uno con permisos progresivos. Los becarios pueden escribir borradores, pero necesitan la aprobación de un editor antes de publicar. Los reporteros pueden publicar artículos y usar equipo de cámara. Los presentadores tienen acceso al estudio de transmisión para hacer reportajes en directo. El editor jefe gestiona al equipo y controla el teletipo de noticias que aparece en la pantalla de cada jugador:

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

La furgoneta de noticias es esencial porque funciona como una estación móvil de transmisión. Equípala con una antena parabólica en el techo y permite que los reporteros inicien transmisiones en directo desde cualquier ubicación, siempre que estén cerca de la furgoneta. El helicóptero permite obtener imágenes aéreas para los presentadores que cubren eventos a gran escala, como persecuciones policiales o emergencias en toda la ciudad. Restringe cada vehículo según el rango del trabajo para evitar que los becarios vuelen el helicóptero desde su primer día.

Sistema de cámara y grabación

El sistema de cámara es la mecánica principal que hace que el trabajo de reportero se sienta auténtico. Cuando un reportero equipa el objeto de cámara de noticias, cambia a una vista en primera persona con una interfaz de grabación que muestre el indicador REC en rojo, un temporizador y el nivel de batería. La cámara debe admitir controles de zoom con la rueda del ratón y un modo de fotografía que tome una captura de pantalla del juego y la guarde como archivo adjunto de un artículo. Usa el sistema de cámara nativo de GTA para crear una sensación natural de cámara en mano, con un ligero balanceo que haga que las imágenes se vean naturales en lugar de perfectamente estáticas:

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

La interfaz de grabación que se muestra mediante NUI debe recrear el visor de una cámara de noticias profesional, con marcas en las esquinas que enmarquen la toma, una marca de agua con el logotipo de la emisora y una barra inferior desplazable con el nombre del reportero. Cuando el reportero deje de grabar, desvanece la interfaz y vuelve gradualmente a la cámara normal del juego. Guarda la duración de la grabación y los datos de ubicación para poder consultarlos al escribir el artículo correspondiente.

Redacción y publicación de artículos

Dales a los reporteros un editor de artículos completo, accesible desde la redacción o mediante su objeto de bloc de notas cuando estén trabajando en el terreno. El editor debe usar una interfaz de texto enriquecido basada en NUI, donde los reporteros puedan escribir un titular y el cuerpo del artículo, elegir una categoría como crímenes, política, deportes o entretenimiento, y adjuntar fotos tomadas con el sistema de cámara. Los artículos publicados aparecen en un periódico del juego, accesible desde los quioscos de periódicos colocados por la ciudad y desde las aplicaciones del teléfono si tu servidor tiene un sistema de teléfono. Guarda los artículos en la base de datos con marcas de tiempo, información del autor y recuentos de visitas para saber qué historias generan más interacción entre los jugadores:

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 transmisiones en directo

Las transmisiones en directo son la función más emocionante de un sistema de noticias, porque crean eventos para todo el servidor que cada jugador puede presenciar en tiempo real. Cuando un presentador inicia una transmisión en directo desde el estudio o cerca de la furgoneta de noticias, su audio del chat de voz debe llegar a todos los jugadores del servidor, dentro de un alcance configurable o a todo el servidor, según prefieras. Muestra un banner de transmisión en la pantalla de cada jugador con el logotipo de la emisora, el nombre del presentador y un indicador de directo. Opcionalmente, la transmisión puede mostrar la señal de cámara en las pantallas de TV del juego colocadas en interiores por el mapa mediante render targets. Implementa un tiempo de espera entre transmisiones para evitar el spam y exige el rango de presentador para que los becarios no puedan salir en directo desde su primer día. El sistema de transmisión debe gestionar correctamente los casos excepcionales: si el presentador se desconecta durante la transmisión, termínala automáticamente y muestra un mensaje de problemas técnicos. Si el presentador se aleja demasiado de la furgoneta durante una transmisión en exteriores, avísale de que está perdiendo señal y termina la transmisión si no vuelve a una distancia razonable.

Teletipo de noticias y notificaciones

El teletipo de noticias es un elemento persistente de la interfaz que desplaza titulares por la parte inferior de la pantalla de cada jugador, como en los canales de noticias por cable. Impleméntalo como una capa NUI que lea los artículos publicados más recientes y vaya rotando los titulares con un temporizador. Permite que el editor jefe envíe alertas urgentes de última hora que sustituyan el teletipo habitual por un banner rojo destacado y un sonido de alerta. Cada jugador debe poder ocultar el teletipo si le resulta molesto, con un ajuste para activarlo o desactivarlo desde el teléfono o el menú de configuración. Limita la frecuencia de las actualizaciones del teletipo en el servidor para evitar abusos y conserva en la cola solo los cinco titulares más recientes para no abrumar a los jugadores con noticias antiguas. Cuando un jugador haga clic en un titular del teletipo, abre el artículo completo en un visor de periódico NUI para que pueda leerlo sin tener que ir a un quiosco físico.

Mecánicas de entrevistas y ruedas de prensa

Añade mecánicas específicas para hacer entrevistas que vayan más allá de una conversación normal. Cuando un reportero apunte a otro jugador con el objeto de micrófono, envía una solicitud de entrevista que el jugador objetivo pueda aceptar o rechazar. Si acepta, se inicia una interacción de prensa visible: ambos jugadores se ponen frente a frente, el reportero sostiene el objeto de micrófono y los jugadores cercanos ven un indicador de prensa sobre sus cabezas. Opcionalmente, todo lo que se diga durante la entrevista puede guardarse como una transcripción adjunta al bloc de notas del reportero para escribir artículos más adelante. Para las ruedas de prensa, crea ubicaciones con podio en el ayuntamiento, la comisaría y el hospital, donde los funcionarios puedan dirigirse a varios reporteros a la vez. La ubicación del podio amplifica el alcance de voz del orador y muestra su nombre y cargo en un gráfico inferior visible para todos los jugadores cercanos, creando una atmósfera auténtica de rueda de prensa que fomenta el roleplay político e institucional.

Consejos de rendimiento e integración

El sistema de noticias afecta a todos los jugadores del servidor mediante el teletipo y las transmisiones, así que optimizar el rendimiento es fundamental. Ejecuta el teletipo como un elemento NUI ligero que se actualice en intervalos largos, no en cada fotograma. Guarda en caché los artículos publicados en el cliente tras la carga inicial y solicita actualizaciones solo cuando el jugador abra el visor del periódico o llegue una notificación de un artículo nuevo. Para las transmisiones en directo, envía el audio mediante el sistema de chat de voz existente en lugar de crear un canal de audio independiente, para evitar sobrecargar el ancho de banda. Limita la cantidad de artículos almacenados en la base de datos archivando en una tabla independiente las entradas de más de treinta días, a las que los jugadores puedan acceder desde un menú de archivo de periódicos. Elimina de forma rigurosa las entidades de cámara y las capas NUI cuando cambie el trabajo de reportero, se reinicie el recurso o el jugador se desconecte, para evitar que queden elementos visuales persistentes. Considera integrar el sistema con el teléfono para que los jugadores puedan leer artículos directamente desde él, suscribirse a categorías específicas y recibir notificaciones push sobre noticias de última hora relacionadas con sus intereses.

¿Listo para empezar?

Consigue los scripts en nuestra tienda, o únete al Discord para soporte, novedades y un adelanto de lo que viene.