System reportera wiadomości FiveM: Skryptowanie transmisji telewizyjnych na żywo
Dodaj działającą pracę reportera wiadomości do FiveM. Kamery na żywo, interfejs transmisji, cynki i najlepsze skrypty informacyjne napędzające ogólnomiejskie wątki roleplay.
Agency Scripts
Założyciel i główny deweloper w Agency Scripts
Rola reporterów wiadomości w roleplayu
Praca reportera wiadomości dodaje do Twojego serwera FiveM unikalną warstwę społeczną, jakiej nie zapewnia żadna inna praca. Reporterzy działają jak spoiwo łączące wydarzenia na serwerze, dokumentując przestępstwa, przeprowadzając wywiady z graczami i emitując materiały, które kształtują narrację Twojego miasta. W przeciwieństwie do większości prac działających w izolacji, dziennikarstwo naturalnie przecina się z każdą frakcją na serwerze: pościgi policyjne stają się wiadomościami z ostatniej chwili, konflikty gangów stają się artykułami śledczymi, a decyzje rady miasta felietonami. Tworzy to naturalny roleplay międzyfrakcyjny, do którego właściciele serwerów nieustannie dążą, ale rzadko osiągają za pomocą samych mechanik. Dobry system wiadomości daje reporterom narzędzia do rejestrowania wydarzeń, pisania artykułów widocznych dla wszystkich graczy i nadawania relacji na żywo wyświetlanych na ekranach na całej mapie. Gdy gracze widzą, że ich działania trafiają na pierwsze strony gazet, utwierdza ich to w przekonaniu, że ich roleplay ma znaczenie, i motywuje do tworzenia jeszcze ciekawszych historii.
Konfiguracja stacji informacyjnej i struktura pracy
Stacja informacyjna służy jako centrum, w którym reporterzy rozpoczynają służbę, pobierają sprzęt, piszą artykuły i koordynują działania z zespołem. Zdefiniuj w swojej konfiguracji lokalizację stacji, magazyn sprzętu i studio transmisyjne. Zaplanuj hierarchię pracy z rolami takimi jak stażysta, reporter, prezenter i redaktor naczelny, każda z rosnącymi uprawnieniami. Stażyści mogą pisać wersje robocze, ale wymagają zatwierdzenia przez redaktora przed publikacją. Reporterzy mogą publikować artykuły i korzystać ze sprzętu fotograficznego. Prezenterzy uzyskują dostęp do studia transmisyjnego na potrzeby relacji na żywo. Redaktor naczelny zarządza zespołem i kontroluje pasek informacyjny przewijający się na ekranach wszystkich graczy:
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 },
},
}
Wóz transmisyjny jest niezbędny, ponieważ służy jako mobilna stacja nadawcza. Wyposaż go w prop anteny satelitarnej na dachu i pozwól reporterom rozpoczynać transmisje na żywo z dowolnego miejsca, o ile znajdują się w pobliżu vana. Helikopter zapewnia możliwość nagrywania ujęć z powietrza dla prezenterów relacjonujących wydarzenia na dużą skalę, takie jak pościgi policyjne czy sytuacje kryzysowe w całym mieście. Dostęp do każdego pojazdu powinien być ograniczony stopniem pracy, aby stażyści nie latali helikopterem już pierwszego dnia.
System kamery i nagrywania
System kamery to podstawowa mechanika, dzięki której praca reportera wydaje się autentyczna. Gdy reporter wyposaży przedmiot kamery informacyjnej, przełącz widok na kamerę pierwszoosobową z nakładką nagrywania, która pokazuje czerwony wskaźnik REC, timer i poziom naładowania baterii. Kamera powinna obsługiwać sterowanie zoomem za pomocą kółka myszy oraz tryb robienia zdjęć, który wykonuje zrzut ekranu w grze i zapisuje go jako załącznik do artykułu. Wykorzystaj natywny system kamer GTA, aby uzyskać płynny efekt kamery trzymanej w dłoni z lekkim kołysaniem, co sprawia, że materiał wygląda naturalnie, a nie idealnie statycznie:
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
Nakładka nagrywania wyświetlana przez NUI powinna odwzorowywać profesjonalny wizjer kamery telewizyjnej z narożnymi ramkami kadrującymi ujęcie, znakiem wodnym z logo stacji oraz przewijanym paskiem informacyjnym z nazwiskiem reportera. Gdy reporter zakończy nagrywanie, wygaś nakładkę i płynnie przejdź z powrotem do zwykłej kamery rozgrywki. Zapisz czas trwania nagrania oraz dane lokalizacyjne, aby można było się do nich odnieść podczas pisania powiązanego artykułu.
Pisanie i publikowanie artykułów
Daj reporterom pełny edytor artykułów dostępny ze stacji informacyjnej lub za pośrednictwem notatnika w terenie. Edytor powinien korzystać z interfejsu tekstu sformatowanego opartego na NUI, w którym reporterzy wpisują nagłówek, piszą treść artykułu, wybierają kategorię, taką jak przestępczość, polityka, sport lub rozrywka, oraz dołączają zdjęcia zrobione aparatem. Opublikowane artykuły pojawiają się w gazecie w grze, dostępnej ze stojaków na gazety rozmieszczonych w mieście oraz w aplikacjach na telefonie, jeśli Twój serwer korzysta z systemu telefonu. Zapisuj artykuły w bazie danych ze znacznikami czasu, danymi autora i liczbą wyświetleń, aby śledzić, które materiały najbardziej angażują graczy:
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)
System transmisji na żywo
Transmisje na żywo są najbardziej ekscytującą funkcją systemu reportera wiadomości, ponieważ tworzą wydarzenia na całym serwerze, których każdy gracz może być świadkiem w czasie rzeczywistym. Gdy prezenter rozpoczyna transmisję na żywo ze studia lub w pobliżu furgonetki informacyjnej, jego dźwięk z czatu głosowego powinien trafiać do każdego gracza na serwerze w konfigurowalnym zasięgu lub na całym serwerze, w zależności od twoich preferencji. Wyświetlaj na ekranie każdego gracza baner transmisji z logo stacji, nazwiskiem prezentera i wskaźnikiem na żywo. Transmisja może opcjonalnie wyświetlać obraz z kamery na ekranach telewizorów w grze, umieszczonych we wnętrzach na całej mapie za pomocą render targets. Wprowadź cooldown transmisji, aby zapobiec spamowi, oraz wymagaj roli prezentera, aby każdy stażysta nie zaczynał transmisji pierwszego dnia. System transmisji powinien płynnie obsługiwać nietypowe sytuacje: jeśli prezenter rozłączy się w trakcie transmisji, automatycznie zakończ transmisję i wyświetl komunikat o problemach technicznych. Jeśli prezenter oddali się zbyt daleko od furgonetki informacyjnej podczas transmisji w terenie, ostrzeż go o utracie sygnału i zakończ transmisję, jeśli nie wróci na odpowiednią odległość.
Pasek informacyjny i powiadomienia
Pasek informacyjny to stały element interfejsu, który przewija nagłówki na dole ekranu każdego gracza, podobnie jak na kanałach informacyjnych. Zaimplementuj go jako warstwę NUI odczytującą dane z ostatnio opublikowanych artykułów i cyklicznie zmieniającą nagłówki według timera. Zezwól redaktorowi naczelnemu na wysyłanie pilnych komunikatów breaking news, które zastępują standardowy pasek czerwonym, wyróżnionym banerem i dźwiękiem powiadomienia. Pasek powinien mieć możliwość ukrycia przez poszczególnych graczy, którym przeszkadza, za pomocą opcji włączenia lub wyłączenia w telefonie lub menu ustawień. Ogranicz częstotliwość aktualizacji paska po stronie serwera (rate limit), aby zapobiec nadużyciom, i ogranicz kolejkę paska do pięciu najnowszych nagłówków, aby nie przytłaczać graczy starymi wiadomościami. Gdy gracz kliknie nagłówek na pasku, otwórz pełny artykuł w przeglądarce gazet NUI, aby mógł przeczytać całą historię bez konieczności podchodzenia do fizycznego punktu z prasą.
Mechanika wywiadów i konferencji prasowych
Dodaj dedykowane mechaniki przeprowadzania wywiadów, które wykraczają poza zwykłą rozmowę. Gdy reporter wyceluje w innego gracza z przedmiotem mikrofonu, wyślij prośbę o wywiad, którą cel może zaakceptować lub odrzucić. Zaakceptowany wywiad tworzy widoczną interakcję prasową, w której obaj gracze stoją naprzeciwko siebie, reporter trzyma prop mikrofonu, a pobliscy gracze widzą wskaźnik prasy nad ich głowami. Wszystko, co powiedziano podczas wywiadu, można opcjonalnie zapisać w formie transkrypcji dołączonej do notatnika reportera w celu późniejszego pisania artykułów. Na potrzeby konferencji prasowych utwórz wyznaczone miejsca z mównicą w ratuszu, na komisariacie policji i w szpitalu, gdzie urzędnicy mogą przemawiać do wielu reporterów jednocześnie. Mównica zwiększa zasięg głosu mówcy i wyświetla jego imię, nazwisko oraz stanowisko na pasku informacyjnym widocznym dla wszystkich graczy w pobliżu, tworząc autentyczną atmosferę wydarzenia prasowego sprzyjającą politycznemu i instytucjonalnemu roleplayowi.
Wskazówki dotyczące wydajności i integracji
System wiadomości wpływa na każdego gracza na serwerze za sprawą paska informacyjnego i funkcji transmisji, dlatego optymalizacja wydajności jest kluczowa. Uruchamiaj pasek informacyjny jako lekki element NUI, który aktualizuje się w dłuższych odstępach czasu, a nie w każdej klatce. Buforuj opublikowane artykuły po stronie klienta po ich wstępnym pobraniu i żądaj aktualizacji tylko wtedy, gdy gracz otworzy przeglądarkę gazet lub gdy nadejdzie powiadomienie o nowym artykule. W przypadku transmisji na żywo przekierowuj dźwięk przez istniejący system czatu głosowego zamiast tworzyć osobny kanał audio, aby uniknąć obciążenia przepustowości. Ogranicz liczbę przechowywanych artykułów w bazie danych, archiwizując wpisy starsze niż trzydzieści dni w osobnej tabeli, do której gracze mają dostęp przez menu archiwum gazet. Usuwaj byty kamer i nakładki NUI, gdy praca reportera ulega zmianie, zasób jest restartowany lub gracz się rozłącza, aby zapobiec pozostałościom artefaktów wizualnych. Rozważ integrację z systemem telefonu, aby gracze mogli czytać wiadomości bezpośrednio ze swoich telefonów, subskrybować określone kategorie i otrzymywać powiadomienia push o najświeższych informacjach z interesujących ich dziedzin.