نظام مراسل الأخبار في FiveM: بث تلفزيوني مباشر في السكربت
إضافة وظيفة مراسل أخبار تعمل إلى FiveM. كاميرات مباشرة، واجهة البث، نصائح وأفضل سكربتات الأخبار لتعزيز قصص لعب الأدوار على مستوى المدينة.
Agency Scripts
المؤسس والمطور الرئيسي في Agency Scripts
دور المراسلين الإخباريين في التمثيل
تضيف وظيفة مراسل الأخبار طبقة اجتماعية فريدة إلى خادم FiveM الخاص بك لا توفرها أي وظيفة أخرى. يعمل المراسلون كنسيج رابط بين أحداث الخادم، حيث يوثقون الجرائم، ويجرون مقابلات مع اللاعبين، وينقلون القصص التي تشكل سرد مدينتك. على عكس معظم الوظائف التي تعمل بمعزل، يتقاطع التغطية الإخبارية بشكل طبيعي مع كل فصيل على الخادم: تصبح مطاردات الشرطة أخبار عاجلة، وتتحول صراعات العصابات إلى تقارير تحقيقية، وتصبح قرارات مجلس المدينة مقالات تحريرية. هذا يخلق تمثيل أدوار عضوي عبر الفصائل يحاول مالكو الخوادم تشجيعه باستمرار ولكن نادراً ما يتحقق من خلال الآليات وحدها. يوفر نظام أخبار جيد للمراسلين الأدوات اللازمة لالتقاط الأحداث، وكتابة مقالات مرئية لجميع اللاعبين، وبث تقارير مباشرة تظهر على الشاشات في جميع أنحاء الخريطة. عندما يرى اللاعبون أن أفعالهم تصنع العناوين الرئيسية، يعزز ذلك أهمية تمثيل أدوارهم ويشجعهم على خلق قصص أكثر إثارة.
إعداد محطة الأخبار وهيكل الوظائف
محطة الأخبار تعمل كمركز حيث يسجل الصحفيون دخولهم، يصلون إلى المعدات، يكتبون المقالات، وينسقون مع فريقهم. حدد موقع المحطة، تخزين المعدات، واستوديو البث ضمن تكوينك. هيكل تسلسل الوظائف بأدوار مثل المتدرب، الصحفي، المذيع، ورئيس التحرير، كل منهم بصلاحيات متصاعدة. يمكن للمتدربين كتابة مسودات لكن يحتاجون موافقة المحرر قبل النشر. يمكن للصحفيين نشر المقالات واستخدام معدات الكاميرا. يحصل المذيعون على وصول لاستوديو البث للتقارير الحية. يدير رئيس التحرير الفريق ويتحكم في شريط الأخبار الذي يمر عبر شاشة كل لاعب:
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 },
},
}
شاحنة الأخبار ضرورية لأنها تعمل كمحطة بث متنقلة. جهزها بصحن قمر صناعي على السقف واسمح للصحفيين ببدء البث المباشر من أي موقع طالما كانوا بالقرب من الشاحنة. توفر المروحية قدرات تصوير جوي للمذيعين الذين يغطون أحداثًا واسعة النطاق مثل مطاردات الشرطة أو الطوارئ على مستوى المدينة. يجب تقييد كل مركبة حسب درجة الوظيفة لمنع المتدربين من قيادة المروحية في يومهم الأول.
نظام الكاميرا والتسجيل
نظام الكاميرا هو الميكانيكية الأساسية التي تجعل تغطية الأخبار تبدو واقعية. عندما يجهز المراسل عنصر كاميرا الأخبار، يتم التبديل إلى عرض الكاميرا من منظور الشخص الأول مع تراكب تسجيل يُظهر مؤشر REC أحمر، مؤقت، ومستوى البطارية. يجب أن تدعم الكاميرا ضوابط التكبير باستخدام عجلة التمرير ووضع التقاط الصور الذي يلتقط لقطة شاشة داخل اللعبة ويخزنها كمرفق مقال. استخدم نظام الكاميرا الأصلي في GTA لإنشاء إحساس سلس بالكاميرا المحمولة مع حركة طفيفة تجعل اللقطات تبدو طبيعية بدلاً من أن تكون ثابتة تمامًا:
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 منظر كاميرا أخبار احترافية مع أقواس في الزوايا تأطر اللقطة، وشعار محطة كعلامة مائية، وشريط نصي متحرك في الأسفل يعرض اسم المراسل. عندما يتوقف المراسل عن التسجيل، يتلاشى التراكب بسلاسة ويعود إلى كاميرا اللعب العادية. خزّن مدة التسجيل وبيانات الموقع ليتم الرجوع إليها عند كتابة المقال المرتبط.
كتابة ونشر المقالات
امنح الصحفيين محرر مقالات كامل يمكن الوصول إليه من محطة الأخبار أو عبر عنصر المفكرة الخاص بهم في الميدان. يجب أن يستخدم المحرر واجهة نص غني مبنية على NUI حيث يكتب الصحفيون عنوانًا، ويكتبون نص المقال، ويختارون فئة مثل الجريمة، السياسة، الرياضة، أو الترفيه، ويرفقون أي صور تم التقاطها باستخدام نظام الكاميرا. تظهر المقالات المنشورة في صحيفة داخل اللعبة يمكن الوصول إليها من صناديق الصحف الموضوعة في المدينة ومن تطبيقات الهاتف إذا كان الخادم يستخدم نظام هاتف. خزّن المقالات في قاعدة البيانات مع الطوابع الزمنية، معلومات المؤلف، وعدد المشاهدات لتتبع القصص التي تولد أكبر تفاعل من اللاعبين:
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)
نظام البث المباشر
البث المباشر هو أكثر ميزات نظام مراسل الأخبار إثارة لأنه يخلق أحداثًا على مستوى الخادم يمكن لكل لاعب مشاهدتها في الوقت الحقيقي. عندما يبدأ المذيع بثًا مباشرًا من الاستوديو أو بالقرب من سيارة الأخبار، يجب أن يتم توجيه صوتهم عبر الدردشة الصوتية إلى كل لاعب على الخادم ضمن نطاق قابل للتكوين أو على مستوى الخادم حسب تفضيلك. عرض لافتة البث على شاشة كل لاعب تُظهر شعار المحطة، واسم المذيع، ومؤشر البث المباشر. يمكن للبث أن يعرض اختياريًا تغذية الكاميرا على شاشات التلفاز داخل اللعبة الموضوعة في الداخل حول الخريطة باستخدام render targets. نفذ فترة تبريد للبث لمنع الرسائل المزعجة واطلب دور المذيع لمنع كل متدرب من البث المباشر في يومه الأول. يجب أن يتعامل نظام البث مع الحالات الطارئة بسلاسة: إذا انقطع اتصال المذيع أثناء البث، يتم إنهاء البث تلقائيًا وعرض رسالة صعوبات تقنية. إذا تحرك المذيع بعيدًا جدًا عن سيارة الأخبار أثناء البث الميداني، يتم تحذيره من فقدان الإشارة وينتهي البث إذا لم يعد ضمن مسافة معقولة.
شريط الأخبار والإشعارات
شريط الأخبار هو عنصر واجهة مستخدم دائم يمرر العناوين عبر أسفل شاشة كل لاعب، مشابه لقنوات الأخبار التلفزيونية. نفذه كطبقة NUI تقرأ من أحدث المقالات المنشورة وتدور بين العناوين على مؤقت. اسمح لرئيس التحرير بدفع تنبيهات أخبار عاجلة تتجاوز الشريط العادي بشريط أحمر مميز وصوت تنبيه. يجب أن يكون الشريط قابلًا للإغلاق من قبل اللاعبين الذين يجدونه مزعجًا، مع إعداد لتشغيله أو إيقافه عبر الهاتف أو قائمة الإعدادات. حد من تحديثات الشريط على جانب الخادم لمنع الإساءة، واحتفظ بطابور الشريط لأحدث خمسة عناوين لتجنب إغراق اللاعبين بأخبار قديمة. عند نقر اللاعب على عنوان في الشريط، افتح المقال الكامل في عارض صحيفة NUI ليتمكن من قراءة القصة كاملة دون زيارة صندوق صحيفة فعلي.
آليات المقابلات والمؤتمرات الصحفية
إضافة ميكانيكيين مخصصين لإجراء مقابلات تتجاوز المحادثات العادية. عندما يستهدف المراسل لاعبًا آخر باستخدام عنصر الميكروفون، يرسل طلب مقابلة يمكن للهدف قبوله أو رفضه. المقابلات المقبولة تخلق تفاعلًا صحفيًا مرئيًا حيث يواجه اللاعبان بعضهما البعض، يحمل المراسل مجسم الميكروفون، ويمكن للاعبين القريبين رؤية مؤشر صحفي فوق رؤوسهم. يمكن تسجيل كل ما يُقال خلال المقابلة كسجل نصي مرفق بدفتر ملاحظات المراسل لكتابة المقالات لاحقًا. للمؤتمرات الصحفية، إنشاء مواقع منابر مخصصة في قاعة المدينة، مركز الشرطة والمستشفى حيث يمكن للمسؤولين مخاطبة عدة مراسلين في نفس الوقت. موقع المنبر يعزز مدى صوت المتحدث ويعرض اسمه ولقبه على رسم بياني في الجزء السفلي من الشاشة مرئي لجميع اللاعبين القريبين، مما يخلق جو حدث صحفي أصيل يشجع على لعب الأدوار السياسية والمؤسسية.
الأداء ونصائح التكامل
نظام الأخبار يؤثر على كل لاعب في الخادم من خلال شريط الأخبار وميزات البث، لذا تحسين الأداء أمر حاسم. شغّل شريط الأخبار كعنصر NUI خفيف الوزن يتم تحديثه بفاصل زمني طويل بدلاً من كل إطار. خزّن المقالات المنشورة على جانب العميل بعد الجلب الأولي واطلب التحديثات فقط عندما يفتح اللاعب عارض الصحيفة أو عندما تصل إشعارات مقالات جديدة. للبث المباشر، وجه الصوت عبر نظام الدردشة الصوتية الموجود بدلاً من إنشاء قناة صوت منفصلة لتجنب استهلاك النطاق الترددي. حد من عدد المقالات المخزنة في قاعدة البيانات بأرشفة الإدخالات الأقدم من ثلاثين يومًا في جدول منفصل يمكن للاعبين الوصول إليه من خلال قائمة أرشيف الصحيفة. نظف كيانات الكاميرا وطبقات NUI بشكل مكثف عند تغيير وظيفة الصحفي، إعادة تشغيل المورد، أو فصل اللاعب لمنع بقاء الآثار البصرية. فكر في التكامل مع نظام الهاتف الخاص بك حتى يتمكن اللاعبون من قراءة مقالات الأخبار مباشرة من هاتفهم، الاشتراك في فئات محددة، وتلقي إشعارات فورية للأخبار العاجلة في مجالات اهتمامهم.