Zurück zum Blog
Tutorial9 Min. Lesezeit

FiveM-Nachrichtensystem: Live-TV-Übertragungen mit Skript

Füge FiveM einen Nachrichtenjob hinzu. Mit Live-Kameras, Sendeoberfläche, Tipps und Skripten für stadtweite Rollenspiel-Storys.

Agency Scripts

Gründer und leitender Entwickler bei Agency Scripts

Die Rolle von Nachrichtenreportern im Roleplay

Ein Reporterjob ergänzt deinen FiveM-Server um eine einzigartige soziale Ebene, die kein anderer Job bietet. Reporter verbinden Serverereignisse miteinander, dokumentieren Verbrechen, interviewen Spieler und veröffentlichen Berichte, die die Erzählung deiner Stadt prägen. Anders als die meisten Jobs, die isoliert funktionieren, überschneidet sich die Berichterstattung ganz natürlich mit jeder Fraktion auf dem Server: Verfolgungsjagden der Polizei werden zu Eilmeldungen, Konflikte zwischen Gangs zu investigativen Geschichten und Stadtratsentscheidungen zu Kommentaren. So entsteht ein fraktionsübergreifendes Roleplay, das Serverbetreiber ständig zu fördern versuchen, mit Spielmechaniken allein aber nur selten erreichen. Ein gutes Nachrichtensystem gibt Reportern die Werkzeuge an die Hand, um Ereignisse festzuhalten, für alle Spieler sichtbare Artikel zu verfassen und Live-Berichte zu senden, die auf Bildschirmen in der ganzen Stadt erscheinen. Wenn Spieler sehen, dass ihre Handlungen Schlagzeilen machen, erkennen sie, dass ihr Roleplay Bedeutung hat, und werden dazu ermutigt, spannendere Geschichten zu erschaffen.

Nachrichtenredaktion einrichten und Jobstruktur

Die Nachrichtenredaktion ist der zentrale Ort, an dem Reporter sich zum Dienst melden, auf Ausrüstung zugreifen, Artikel schreiben und mit ihrem Team zusammenarbeiten. Lege in deiner Konfiguration den Standort der Redaktion, die Ausrüstungslagerung und das Sendestudio fest. Gliedere die Jobhierarchie in Rollen wie Praktikant, Reporter, Moderator und Chefredakteur, jeweils mit schrittweise erweiterten Berechtigungen. Praktikanten können Entwürfe verfassen, brauchen aber die Freigabe eines Redakteurs, bevor sie etwas veröffentlichen. Reporter können Artikel veröffentlichen und Kameraausrüstung verwenden. Moderatoren erhalten Zugang zum Sendestudio für Live-Berichte. Der Chefredakteur verwaltet das Team und steuert den Nachrichtenticker, der über die Bildschirme aller Spieler läuft:

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

Der Nachrichtenwagen ist unverzichtbar, da er als mobile Sendestation dient. Statte ihn mit einer Satellitenschüssel auf dem Dach aus und erlaube Reportern, von jedem Standort aus Live-Sendungen zu starten, solange sie sich in der Nähe des Wagens befinden. Der Helikopter ermöglicht Luftaufnahmen für Moderatoren, die über Großereignisse wie Verfolgungsjagden der Polizei oder stadtweite Notfälle berichten. Beschränke den Zugang zu jedem Fahrzeug anhand des Jobrangs, damit Praktikanten nicht gleich am ersten Tag den Helikopter fliegen können.

Kamera- und Aufnahmesystem

Das Kamerasystem ist die zentrale Mechanik, durch die sich die Berichterstattung authentisch anfühlt. Wenn ein Reporter das Nachrichtenkamera-Item ausrüstet, wechsle zu einer Ego-Kameraansicht mit einer Aufnahmeeinblendung, die eine rote REC-Anzeige, einen Timer und den Akkustand zeigt. Die Kamera sollte Zoomsteuerungen über das Scrollrad unterstützen und einen Fotomodus bieten, der einen Screenshot im Spiel aufnimmt und als Artikelanhang speichert. Verwende das native Kamerasystem von GTA, um eine sanfte Handkamera zu erzeugen, deren leichtes Schwanken die Aufnahmen natürlich statt völlig statisch wirken lässt:

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

Die über NUI angezeigte Aufnahmeeinblendung sollte den Sucher einer professionellen Nachrichtenkamera nachbilden, mit Eckmarkierungen zur Rahmung, einem Wasserzeichen mit dem Senderlogo und einem durchlaufenden Bauchbinden-Balken mit dem Namen des Reporters. Wenn der Reporter die Aufnahme beendet, blende die Einblendung aus und kehre mit einem fließenden Übergang zur normalen Spielkamera zurück. Speichere die Aufnahmedauer und Standortdaten, damit sie beim Schreiben des dazugehörigen Artikels als Referenz dienen können.

Artikel schreiben und veröffentlichen

Gib Reportern einen vollständigen Artikel-Editor, der in der Nachrichtenredaktion oder unterwegs über ihr Notizblock-Item zugänglich ist. Der Editor sollte eine Rich-Text-Oberfläche auf NUI-Basis verwenden, in der Reporter eine Überschrift eingeben, den Artikeltext verfassen, eine Kategorie wie Kriminalität, Politik, Sport oder Unterhaltung auswählen und mit dem Kamerasystem aufgenommene Fotos anhängen können. Veröffentlichte Artikel erscheinen in einer digitalen Zeitung im Spiel, die über Zeitungsständer-Props in der Stadt und über Handy-Apps zugänglich ist, sofern dein Server ein Handysystem nutzt. Speichere Artikel mit Zeitstempeln, Informationen zum Autor und Aufrufzahlen in der Datenbank, um zu verfolgen, welche Geschichten das größte Interesse bei Spielern wecken:

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)

Live-Übertragungssystem

Live-Übertragungen sind das spannendste Feature eines Nachrichtensystems, denn sie schaffen serverweite Events, die alle Spieler in Echtzeit miterleben können. Wenn ein Moderator im Studio oder in der Nähe des News-Vans eine Live-Übertragung startet, sollte sein Sprachchat-Audio je nach deiner Einstellung innerhalb einer konfigurierbaren Reichweite oder serverweit an alle Spieler übertragen werden. Zeige auf dem Bildschirm jedes Spielers ein Übertragungsbanner mit dem Senderlogo, dem Namen des Moderators und einer Live-Anzeige an. Optional kann die Übertragung mithilfe von Render Targets auch das Kamerabild auf Ingame-Fernsehern in Gebäuden auf der Karte anzeigen. Implementiere eine Abklingzeit für Übertragungen, um Spam zu verhindern, und beschränke diese Funktion auf die Moderatorenrolle, damit nicht jeder Praktikant gleich am ersten Tag live geht. Das Übertragungssystem sollte Sonderfälle zuverlässig behandeln: Wenn der Moderator während der Übertragung die Verbindung trennt, beende die Übertragung automatisch und zeige eine Meldung zu technischen Schwierigkeiten an. Wenn sich der Moderator während einer Außenübertragung zu weit vom News-Van entfernt, warne ihn, dass das Signal abbricht, und beende die Übertragung, falls er nicht innerhalb einer angemessenen Reichweite zurückkehrt.

Nachrichtenticker und Benachrichtigungen

Der Nachrichtenticker ist ein dauerhaft sichtbares UI-Element, das Schlagzeilen am unteren Bildschirmrand aller Spieler entlanglaufen lässt, ähnlich wie bei Nachrichtensendern im Kabel-TV. Setze ihn als NUI-Ebene um, die die zuletzt veröffentlichten Artikel lädt und die Schlagzeilen zeitgesteuert wechselt. Gib dem Chefredakteur die Möglichkeit, dringende Eilmeldungen zu senden, die den regulären Ticker mit einem rot hervorgehobenen Banner und einem Warnton ersetzen. Spieler sollten den Ticker ausblenden können, wenn er sie stört, und ihn über das Handy oder das Einstellungsmenü ein- und ausschalten können. Begrenze die Häufigkeit der Ticker-Updates serverseitig, um Missbrauch zu verhindern, und beschränke die Warteschlange auf die fünf neuesten Schlagzeilen, damit Spieler nicht mit alten Meldungen überflutet werden. Wenn ein Spieler auf eine Schlagzeile im Ticker klickt, öffne den vollständigen Artikel in einer NUI-Zeitungsansicht, damit er die ganze Geschichte lesen kann, ohne einen Zeitungsständer aufsuchen zu müssen.

Mechaniken für Interviews und Pressekonferenzen

Füge spezielle Mechaniken für Interviews hinzu, die über normale Gespräche hinausgehen. Wenn ein Reporter einen anderen Spieler mit dem Mikrofon-Item anvisiert, sende dem Ziel eine Interviewanfrage, die es annehmen oder ablehnen kann. Bei angenommenen Interviews wird eine sichtbare Presseinteraktion gestartet: Beide Spieler wenden sich einander zu, der Reporter hält das Mikrofon-Prop in der Hand und Spieler in der Nähe sehen über ihren Köpfen eine Presse-Anzeige. Alles, was während des Interviews gesagt wird, kann optional als Transkript im Notizblock des Reporters gespeichert werden, damit es später für Artikel verwendet werden kann. Richte für Pressekonferenzen ausgewiesene Rednerpulte im Rathaus, auf der Polizeiwache und im Krankenhaus ein, an denen Amtsträger gleichzeitig mehrere Reporter ansprechen können. Am Rednerpult wird die Reichweite der Stimme des Sprechers erhöht und sein Name und Titel werden in einer Bauchbinde angezeigt, die alle Spieler in der Nähe sehen können. So entsteht eine authentische Presseatmosphäre, die politisches und institutionelles Roleplay fördert.

Tipps zu Performance und Integration

Das Nachrichtensystem erreicht über den Ticker und die Übertragungsfunktionen jeden Spieler auf dem Server, deshalb ist die Performance-Optimierung entscheidend. Lass den Nachrichtenticker als leichtgewichtiges NUI-Element laufen, das in größeren Abständen statt in jedem Frame aktualisiert wird. Cache veröffentlichte Artikel nach dem ersten Abruf clientseitig und fordere Updates nur an, wenn ein Spieler die Zeitungsansicht öffnet oder eine Benachrichtigung über einen neuen Artikel erhält. Übertrage bei Live-Übertragungen Audio über das vorhandene Sprachchatsystem, anstatt einen separaten Audiokanal zu erstellen, um zusätzlichen Bandbreitenverbrauch zu vermeiden. Begrenze die Anzahl der in der Datenbank gespeicherten Artikel, indem du Einträge, die älter als dreißig Tage sind, in eine separate Tabelle archivierst. Spieler können über ein Zeitungsarchiv-Menü darauf zugreifen. Räume Kamera-Entities und NUI-Overlays konsequent auf, wenn sich der Reporterjob ändert, die Resource neu startet oder der Spieler die Verbindung trennt, damit keine visuellen Artefakte zurückbleiben. Verbinde das System gegebenenfalls mit deinem Handysystem, damit Spieler Nachrichtenartikel direkt auf dem Handy lesen, bestimmte Kategorien abonnieren und Push-Benachrichtigungen zu Eilmeldungen in ihren Interessengebieten erhalten können.

Bereit loszulegen?

Hol dir die Scripts in unserem Shop, oder komm auf den Discord für Support, Updates und einen Blick auf das, was kommt.