Le rôle des journalistes dans le jeu de rôle
Un travail de journaliste ajoute une couche sociale unique à ton serveur FiveM qu'aucun autre travail ne fournit. Les journalistes servent de tissu conjonctif entre les événements du serveur, documentant les crimes, interviewant les joueurs et diffusant des histoires qui façonnent le récit de ton ville. Contrairement à la plupart des emplois qui fonctionnent de manière isolée, le reportage recoupe naturellement toutes les factions présentes sur le serveur : les poursuites policières deviennent des faits d'actualité, les conflits de gangs deviennent des reportages d'enquête et les décisions du conseil municipal deviennent des articles éditoriaux. Cela crée un jeu de rôle organique entre factions que les propriétaires de serveurs essaient constamment d’encourager mais qu’ils réalisent rarement grâce aux seuls mécanismes. Un bon système d'information donne aux journalistes les outils nécessaires pour capturer les événements, rédiger des articles visibles par tous les joueurs et diffuser des rapports en direct qui apparaissent sur les écrans autour de la carte. Lorsque les joueurs voient leurs actions faire la une des journaux, cela renforce l’importance de leur jeu de rôle et les encourage à créer des histoires plus convaincantes.
Configuration de la station d'information et structure du travail
La chaîne d'information sert de plaque tournante où les journalistes pointent, accèdent à l'équipement, rédigent des articles et se coordonnent avec leur équipe. Définissez l'emplacement de la station, le stockage de l'équipement et le studio de diffusion dans ton configuration. Structurez la hiérarchie des tâches avec des rôles tels que stagiaire, journaliste, présentateur et rédacteur en chef, chacun avec des autorisations croissantes. Les stagiaires peuvent rédiger des brouillons mais ont besoin de l’approbation de l’éditeur avant de les publier. Les journalistes peuvent publier des articles et utiliser du matériel photographique. Les présentateurs ont accès au studio de diffusion pour des reportages en direct. Le rédacteur en chef gère l'équipe et contrôle le téléscripteur qui défile sur l'écran de chaque joueur :
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 },
},
}
Le fourgon d'information est essentiel car il sert de station de diffusion mobile. Équipez-le d'une antenne parabolique sur le toit et permettez aux journalistes de démarrer des émissions en direct depuis n'importe quel endroit, à condition qu'ils soient à proximité de la camionnette. L'hélicoptère fournit des capacités d'images aériennes aux présentateurs couvrant des événements à grande échelle comme des poursuites policières ou des urgences à l'échelle de la ville. Chaque véhicule doit être limité par niveau d'emploi pour empêcher les stagiaires de piloter l'hélicoptère dès leur premier jour.
Caméra et système d'enregistrement
Le système de caméra est le mécanisme de base qui donne l’impression que les reportages d’actualité sont authentiques. Lorsqu'un journaliste équipe l'élément de caméra d'information, passez à une vue de caméra à la première personne avec une superposition d'enregistrement qui affiche un indicateur REC rouge, une minuterie et un niveau de batterie. L'appareil photo doit prendre en charge les commandes de zoom à l'aide de la molette de défilement et un mode de capture de photos qui prend une capture d'écran dans le jeu et la stocke sous forme de pièce jointe à un article. Utilisez le système de caméra natif de GTA pour créer une sensation de caméra portable fluide avec un léger mouvement qui donne aux images un aspect naturel plutôt que parfaitement statique :
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 superposition d'enregistrement affichée via NUI doit reproduire un viseur de caméra d'information professionnelle avec des supports d'angle encadrant la prise de vue, un filigrane du logo de la station et une barre inférieure défilante indiquant le nom du journaliste. Lorsque le journaliste arrête l'enregistrement, faites disparaître la superposition et revenez en douceur à la caméra de jeu normale. Stockez la durée de l'enregistrement et les données de localisation afin qu'elles puissent être référencées lors de la rédaction de l'article associé.
Rédaction et publication d'articles
Offrez aux journalistes un éditeur d'articles complet accessible depuis la chaîne d'information ou via leur bloc-notes sur le terrain. L'éditeur doit utiliser une interface de texte enrichi basée sur NUI dans laquelle les journalistes saisissent un titre, rédigent le corps de l'article, sélectionnent une catégorie comme le crime, la politique, le sport ou le divertissement, et joignent toutes les photos prises avec le système de caméra. Les articles publiés apparaissent dans un journal du jeu accessible depuis les boîtes à journaux placées dans la ville et depuis les applications téléphoniques si ton serveur utilise un système téléphonique. Stockez les articles dans la base de données avec des horodatages, des informations sur l'auteur et le nombre de vues pour suivre les histoires qui génèrent le plus d'engagement des joueurs :
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)
Système de diffusion en direct
Les diffusions en direct sont la fonctionnalité la plus intéressante d'un système de journaliste car elles créent des événements à l'échelle du serveur dont chaque joueur peut être témoin en temps réel. Lorsqu'un présentateur démarre une diffusion en direct depuis le studio ou à proximité du fourgon d'information, son audio via le chat vocal doit être acheminé vers tous les joueurs du serveur dans une plage configurable ou à l'échelle du serveur, selon tes préférences. Affichez une bannière de diffusion sur l'écran de chaque joueur affichant le logo de la station, le nom du présentateur et un indicateur en direct. La diffusion peut éventuellement afficher le flux de la caméra sur les écrans de télévision du jeu placés à l'intérieur de la carte à l'aide de cibles de rendu. Mettez en œuvre un temps de recharge de diffusion pour éviter le spam et exigez le rôle d'ancre pour empêcher chaque stagiaire de passer en direct le premier jour. Le système de diffusion doit gérer les cas extrêmes avec élégance : si le présentateur se déconnecte en cours de diffusion, met automatiquement fin à la diffusion et affiche un message de difficultés techniques. Si le présentateur s'éloigne trop de la camionnette d'information pendant une émission sur le terrain, prévenez-le qu'il perd le signal et mettez fin à l'émission s'il ne revient pas à une distance raisonnable.
Téléscripteur d'actualités et notifications
Le téléscripteur d'actualités est un élément d'interface utilisateur persistant qui fait défiler les titres en bas de l'écran de chaque joueur, à l'instar des chaînes d'information par câble. Implémentez-le en tant que couche NUI qui lit les articles publiés les plus récents et fait défiler les titres selon une minuterie. Autorisez le rédacteur en chef à émettre des alertes d'actualité urgentes qui remplacent le ticker habituel avec une bannière surlignée en rouge et un son d'alerte. Le téléscripteur doit pouvoir être ignoré par les joueurs individuels qui le trouvent distrayant, avec un paramètre permettant de l'activer ou de le désactiver via le téléphone ou le menu des paramètres. Limitez le débit des mises à jour des tickers côté serveur pour éviter les abus et maintenez la file d'attente des tickers aux cinq titres les plus récents pour éviter de submerger les joueurs avec d'anciennes nouvelles. Lorsqu'un joueur clique sur le titre d'un téléscripteur, ouvrez l'article complet dans une visionneuse de journal NUI afin qu'il puisse lire l'histoire complète sans visiter une boîte de journal physique.
Mécanismes d’interview et de conférence de presse
Ajoutez des mécanismes dédiés pour mener des entretiens qui vont au-delà d’une conversation régulière. Lorsqu'un journaliste cible un autre joueur avec l'élément microphone, envoyez une demande d'interview que la cible peut accepter ou refuser. Les interviews acceptées créent une interaction visible avec la presse où les deux joueurs se font face, le journaliste tient le microphone et les joueurs à proximité peuvent voir un indicateur de presse au-dessus de leur tête. Tout ce qui a été dit au cours de l'entretien peut éventuellement être enregistré sous forme de transcription jointe au bloc-notes du journaliste pour la rédaction ultérieure d'un article. Pour les conférences de presse, créez des podiums désignés à l'hôtel de ville, au commissariat de police et à l'hôpital où les responsables peuvent s'adresser simultanément à plusieurs journalistes. L'emplacement du podium amplifie la gamme de voix de l'orateur et affiche son nom et son titre sur un tiers inférieur visible par tous les joueurs à proximité, créant ainsi une atmosphère d'événement de presse authentique qui encourage le jeu de rôle politique et institutionnel.
Conseils en matière de performances et d'intégration
Le système de nouvelles touche chaque joueur du serveur via les fonctionnalités de téléscripteur et de diffusion, l'optimisation des performances est donc essentielle. Exécutez le téléscripteur d'actualités en tant qu'élément NUI léger qui se met à jour sur un long intervalle plutôt que sur chaque image. Mettez en cache les articles publiés côté client après la récupération initiale et ne demandez des mises à jour que lorsque le lecteur ouvre la visionneuse de journaux ou lorsqu'une nouvelle notification d'article arrive. Pour les diffusions en direct, acheminez l'audio via le système de chat vocal existant plutôt que de créer un canal audio distinct pour éviter une surcharge de bande passante. Limitez le nombre d'articles stockés dans la base de données en archivant les entrées datant de plus de trente jours dans un tableau séparé auquel les joueurs peuvent accéder via un menu d'archives de journaux. Nettoyez les entités de caméra et les superpositions NUI de manière agressive lorsque le travail du journaliste change, que la ressource redémarre ou que le lecteur se déconnecte pour éviter les artefacts visuels persistants. Pensez à l'intégrer à ton système téléphonique afin que les joueurs puissent lire des articles d'actualité directement depuis leur téléphone, s'abonner à des catégories spécifiques et recevoir des notifications push pour les dernières nouvelles dans leurs domaines d'intérêt.
