FiveM Haber Muhabiri Sistemi: Canlı TV Yayınlarını Scriptleyin
FiveM'e çalışan bir haber muhabiri mesleği ekleyin. Şehir çapındaki rol yapma hikayelerini canlandırmak için canlı kameralar, yayın UI'ı, ihbarlar ve en iyi haber scriptleri.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Roleplay'de Haber Muhabirlerinin Rolü
Haber muhabirliği mesleği, FiveM sunucunuza başka hiçbir mesleğin sağlayamayacağı benzersiz bir sosyal katman ekler. Muhabirler sunucu olayları arasında bağlayıcı bir köprü görevi görür: Suçları belgeler, oyuncularla röportaj yapar ve şehrinizin anlatısını şekillendiren hikayeler yayınlar. Yalıtılmış şekilde yürütülen çoğu mesleğin aksine muhabirlik sunucudaki her fraksiyonla doğal olarak kesişir: Polis kovalamacaları son dakika haberlerine, çete çatışmaları araştırmacı dosyalara ve belediye meclisi kararları köşe yazılarına dönüşür. Bu durum, sunucu sahiplerinin sürekli teşvik etmeye çalıştığı ancak yalnızca mekaniklerle nadiren başarabildiği organik gruplar arası roleplay yaratır. İyi bir haber sistemi muhabirlere olayları kaydetme, tüm oyuncular tarafından görülebilen makaleler yazma ve haritadaki ekranlarda görünen canlı yayınlar yapma araçlarını sunar. Oyuncular eylemlerinin manşetlere çıktığını gördüklerinde, roleplay'lerinin önemli olduğu pekişir ve onları daha ilgi çekici hikayeler yaratmaya teşvik eder.
Haber İstasyonu Kurulumu ve Meslek Yapısı
Haber merkezi; muhabirlerin mesaiye başladığı, ekipmanlara eriştiği, makaleler yazdığı ve ekipleriyle koordinasyon sağladığı merkez işlevi görür. Yapılandırmanızda merkez konumunu, ekipman deposunu ve yayın stüdyosunu tanımlayın. Meslek hiyerarşisini stajyer, muhabir, spiker ve genel yayın yönetmeni gibi her biri artan yetkilere sahip rollerle yapılandırın. Stajyerler taslak yazabilir ancak yayınlamadan önce editör onayına ihtiyaç duyar. Muhabirler makale yayınlayabilir ve kamera ekipmanlarını kullanabilir. Spikerler canlı yayınlar için yayın stüdyosuna erişim kazanır. Genel yayın yönetmeni ekibi yönetir ve her oyuncunun ekranında kayan haber bandını kontrol eder:
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 },
},
}
Haber minibüsü, mobil bir yayın istasyonu olarak hizmet verdiği için vazgeçilmezdir. Tavanına bir uydu anteni propu ekleyin ve muhabirlerin minibüsün yakınında oldukları sürece her konumdan canlı yayın başlatmalarına izin verin. Helikopter, polis takipleri veya şehir çapındaki acil durumlar gibi büyük ölçekli olayları aktaran spikerler için havadan görüntü alma yeteneği sunar. Stajyerlerin ilk günden helikopter uçurmasını önlemek için her araç meslek rütbesine göre kısıtlanmalıdır.
Kamera ve Kayıt Sistemi
Kamera sistemi, haber muhabirliğinin gerçekçi hissettirmesini sağlayan temel mekaniktir. Bir muhabir haber kamerası eşyasını kuşandığında, kırmızı bir REC göstergesi, zamanlayıcı ve pil seviyesi gösteren bir kayıt arayüzü ile birinci şahıs kamera görünümüne geçin. Kamera, kaydırma tekerleği girişini kullanan yakınlaştırma kontrollerini ve oyun içi ekran görüntüsü alıp bunu bir makale eki olarak saklayan fotoğraf çekme modunu desteklemelidir. Görüntülerin tamamen statik görünmek yerine doğal görünmesini sağlayan hafif hareket sallantısıyla pürüzsüz bir el kamerası hissi oluşturmak için GTA'nın yerel kamera sistemini kullanın:
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
NUI üzerinden görüntülenen kayıt katmanı, çekimi çerçeveleyen köşe parantezleri, kanal logosu filigranı ve muhabirin adını gösteren kayan bir alt yazı çubuğu ile profesyonel bir haber kamerası vizörünü taklit etmelidir. Muhabir kaydı durdurduğunda, katmanı karartarak kapatın ve normal oyun içi kameraya sorunsuzca geri dönün. Kayıt süresini ve konum verilerini, ilgili makaleyi yazarken başvurulabilmesi için saklayın.
Makale Yazma ve Yayınlama
Muhabirlere haber merkezinden veya sahadayken not defteri eşyası üzerinden erişilebilen kapsamlı bir makale editörü sunun. Editör, muhabirlerin bir başlık yazdığı, makale metnini girdiği, suç, politika, spor veya eğlence gibi bir kategori seçtiği ve kamera sistemiyle çekilen fotoğrafları eklediği NUI tabanlı bir zengin metin arayüzü kullanmalıdır. Yayınlanan makaleler, şehrin etrafına yerleştirilmiş gazete kutusu prop objelerinden ve sunucunuz bir telefon sistemi kullanıyorsa telefon uygulamalarından erişilebilen oyun içi bir gazetede görünür. Hangi haberlerin en çok oyuncu etkileşimi oluşturduğunu takip etmek için makaleleri zaman damgaları, yazar bilgileri ve görüntülenme sayılarıyla birlikte veritabanında saklayın:
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)
Canlı Yayın Sistemi
Canlı yayınlar, bir haber muhabiri sisteminin en heyecan verici özelliğidir çünkü her oyuncunun gerçek zamanlı olarak tanık olabileceği sunucu genelinde etkinlikler yaratır. Bir spiker stüdyodan veya haber aracının yakınından canlı yayın başlattığında, sesli sohbet üzerinden iletilen sesi tercihinize bağlı olarak yapılandırılabilir bir menzildeki veya sunucu genelindeki her oyuncuya yönlendirilmelidir. Her oyuncunun ekranında kanal logosunu, spikerin adını ve canlı yayın göstergesini içeren bir yayın başlığı gösterin. Yayın, haritanın çeşitli iç mekanlarına yerleştirilmiş oyun içi TV ekranlarında render target kullanarak kamera akışını isteğe bağlı olarak gösterebilir. Spam yapılmasını önlemek için bir yayın bekleme süresi uygulayın ve her stajyerin ilk gününde canlı yayına geçmesini engellemek için spiker rolü şartı koyun. Yayın sistemi istisnai durumları sorunsuzca yönetmelidir: Spiker yayının ortasında sunucudan ayrılırsa, yayını otomatik olarak sonlandırın ve teknik arıza mesajı görüntüleyin. Saha yayını sırasında spiker haber aracından çok uzaklaşırsa, sinyal kaybettiğini belirten bir uyarı verin ve makul bir mesafe içine dönmezse yayını sonlandırın.
Kayan Haber Bandı ve Bildirimler
Haber bandı, televizyon haber kanallarına benzer şekilde her oyuncunun ekranının altından başlıkları kaydıran kalıcı bir UI öğesidir. En son yayınlanan makaleleri okuyan ve bir zamanlayıcıyla başlıklar arasında geçiş yapan bir NUI katmanı olarak uygulayın. Genel yayın yönetmeninin normal haber bandının üzerine geçen, kırmızı vurgulu bir şerit ve uyarı sesiyle acil son dakika haber uyarıları göndermesine izin verin. Haber bandı, dikkat dağıtıcı bulan bireysel oyuncular tarafından kapatılabilmeli, telefon veya ayarlar menüsünden açılıp kapatılabilen bir ayara sahip olmalıdır. Kötüye kullanımı önlemek için sunucu tarafında haber bandı güncellemelerine hız sınırı uygulayın ve oyuncuları eski haberlerle boğmamak için haber bandı kuyruğunu en son beş başlıkla sınırlı tutun. Bir oyuncu haber bandı başlığına tıkladığında, fiziksel bir gazete kutusuna gitmeden hikayenin tamamını okuyabilmesi için tam makaleyi bir NUI gazete görüntüleyicisinde açın.
Röportaj ve Basın Toplantısı Mekanikleri
Röportaj yapmak için sıradan sohbetlerin ötesine geçen özel mekanikler ekleyin. Bir muhabir mikrofon eşyası ile başka bir oyuncuyu hedeflediğinde, hedefin kabul edebileceği veya reddedebileceği bir röportaj isteği gönderin. Kabul edilen röportajlar, her iki oyuncunun da birbirine baktığı, muhabirin mikrofon prop'unu tuttuğu ve yakındaki oyuncuların başlarının üzerinde bir basın göstergesi görebildiği görünür bir basın etkileşimi oluşturur. Röportaj sırasında söylenen her şey, daha sonra makale yazmak için isteğe bağlı olarak muhabirin not defterine eklenen bir döküm olarak kaydedilebilir. Basın toplantıları için Belediye Binası, polis merkezi ve hastanede yetkililerin aynı anda birden fazla muhabire hitap edebileceği özel podyum konumları oluşturun. Podyum konumu, konuşmacının ses menzilini güçlendirir ve adını ile unvanını yakındaki tüm oyuncuların görebileceği bir alt bant grafiğinde (lower-third) görüntüleyerek, siyasi ve kurumsal rol yapmayı teşvik eden özgün bir basın etkinliği atmosferi yaratır.
Performans ve Entegrasyon İpuçları
Haber sistemi, haber bandı ve canlı yayın özellikleri aracılığıyla sunucudaki her oyuncuya temas eder, bu nedenle performans optimizasyonu kritiktir. Haber bandını her kare yerine uzun aralıklarla güncellenen hafif bir NUI öğesi olarak çalıştırın. Yayınlanan makaleleri ilk getirmeden sonra client tarafında önbelleğe alın ve güncellemeleri yalnızca oyuncu gazete görüntüleyicisini açtığında veya yeni bir makale bildirimi geldiğinde talep edin. Canlı yayınlar için bant genişliği yükünü önlemek adına sesi ayrı bir ses kanalı oluşturmak yerine mevcut sesli sohbet sistemi üzerinden yönlendirin. Veri tabanında saklanan makale sayısını, otuz günden eski kayıtları oyuncuların gazete arşiv menüsünden erişebileceği ayrı bir tabloya arşivleyerek sınırlayın. Kalan görsel kalıntıları önlemek için muhabir mesleği değiştiğinde, resource yeniden başlatıldığında veya oyuncu oyundan çıktığında kamera entity yapılarını ve NUI katmanlarını agresif bir şekilde temizleyin. Oyuncuların haber makalelerini doğrudan telefonlarından okuyabilmeleri, belirli kategorilere abone olabilmeleri ve ilgi alanlarındaki son dakika haberleri için anlık bildirimler alabilmeleri amacıyla telefon sisteminizle entegrasyonu değerlendirin.