نظام الموت والإحياء في FiveM: سكريبت إحياء واقعي
تصميم نظام وفاة وإعادة إحياء مصقول لـ FiveM. مؤقتات النزيف، إحياء EMS، تدفق المستشفى وأفضل سكربتات الموت لـ QBCore و ESX.
Agency Scripts
المؤسس والمطور الرئيسي في Agency Scripts
كشف وفاة اللاعب
نظام الموت وإعادة الظهور هو أحد أهم الآليات الأساسية في أي خادم FiveM للعب الأدوار، حيث يتحكم فيما يحدث عندما تصل صحة اللاعب إلى الصفر وكيف يعود إلى اللعب. سلوك الموت الافتراضي في GTA V يتضمن إعادة ظهور تلقائية في أقرب مستشفى بعد مشهد سينمائي قصير، وهو ما يكسر تمامًا انغماس اللعب التمثيلي. لبناء نظام مناسب، تحتاج إلى اعتراض حالة الموت قبل أن يتولى المعالج الافتراضي للعبة الأمر. راقب صحة اللاعب في كل إطار باستخدام GetEntityHealth وكشف متى ينخفض إلى عتبة الموت، وهي 0 للشخصيات. عند اكتشاف الموت، استخدم فورًا NetworkResurrectLocalPlayer لمنع ظهور شاشة الموت الافتراضية، ثم وضع اللاعب في حالة ragdoll باستخدام SetPedToRagdoll لمحاكاة الإعاقات. قم بتعطيل نظام الإنعاش الافتراضي عن طريق استدعاء SetPlayerInvincible مؤقتاً أثناء انتقالك إلى معالج حالة الموت المخصص الخاص بك. تمنحك هذه الطريقة السيطرة الكاملة على تجربة الموت مع الحفاظ على الواقعية البصرية.
نظام مؤقت النزيف
مؤقت النزيف يخلق نافذة حرجة بين السقوط والموت الكامل، يمكن خلالها للاعبين الآخرين التفاعل مع الشخص المعطل. عند دخول اللاعب حالة السقوط، يبدأ عد تنازلي يمثل نزيفه البطيء. يعرض هذا المؤقت بشكل بارز على الشاشة من خلال تراكب NUI يظهر الوقت المتبقي والتعليمات ذات الصلة. خلال مرحلة النزيف، يجب أن يكون اللاعب في حركة دمية قماشية أو زحف على الأرض، غير قادر على استخدام الأسلحة، قيادة المركبات، أو التفاعل مع معظم كائنات العالم. يسمح للاعبين الساقطين باستخدام دردشة صوتية قريبة حتى يتمكنوا من طلب المساعدة أو تمثيل إصاباتهم. يجب أن تكون مدة المؤقت قابلة للتكوين، عادة بين 5 و15 دقيقة، وطويلة بما يكفي لاستجابة EMS الواقعية. نفذ نظامًا حيث يتسارع المؤقت إذا تلقى اللاعب ضررًا إضافيًا أثناء السقوط، ويتباطأ أو يتوقف إذا بدأ لاعب آخر في تطبيق أدوات الإسعاف الأولي مثل الضمادات أو حقيبة الإسعافات.
-- Client-side death state management
local isDead = false
local bleedoutTime = Config.BleedoutDuration -- seconds
local bleedoutTimer = 0
local lastStandUsed = false
CreateThread(function()
while true do
local ped = PlayerPedId()
local health = GetEntityHealth(ped)
if health <= 0 and not isDead then
isDead = true
bleedoutTimer = bleedoutTime
lastStandUsed = false
-- Prevent default death
NetworkResurrectLocalPlayer(
GetEntityCoords(ped), GetEntityHeading(ped),
true, false
)
SetEntityHealth(ped, 1)
SetEntityInvincible(ped, true)
SetPedToRagdoll(ped, -1, -1, 0, false, false, false)
ClearPedTasks(ped)
-- Notify server
TriggerServerEvent('death:playerDowned', GetEntityCoords(ped))
-- Show death UI
SendNUIMessage({ action = 'showDeathScreen', timer = bleedoutTimer })
end
if isDead then
bleedoutTimer = bleedoutTimer - 1
SendNUIMessage({ action = 'updateTimer', timer = bleedoutTimer })
-- Disable controls while downed
DisableControlAction(0, 22, true) -- jump
DisableControlAction(0, 24, true) -- attack
DisableControlAction(0, 25, true) -- aim
DisableControlAction(0, 75, true) -- exit vehicle
if bleedoutTimer <= 0 then
-- Fully dead - offer respawn options
SendNUIMessage({ action = 'showRespawnOptions' })
end
end
Wait(isDead and 1000 or 500)
end
end)
آلية الوقوف الأخير
يمنح ميكانيكي الوقوف الأخير للاعبين المصابين فرصة قصيرة للرد أو الزحف إلى الأمان، مضيفًا طبقة تكتيكية لمواجهات القتال. عندما يسقط اللاعب لأول مرة، قدم له تفعيلًا لمرة واحدة يضعه في وضعية الانبطاح حيث يمكنه إطلاق سلاح جانبي بدقة وحركة منخفضة جدًا لمدة 15-30 ثانية قبل الانهيار الكامل. نفذ ذلك بوضع اللاعب في حركة زحف باستخدام TaskPlayAnim مع قاموس تحريك أرضي، ثم إعادة تمكين استخدام السلاح مؤقتًا مع تقييده على المسدسات فقط. طبق تأثير تمايل السلاح الثقيل باستخدام تحريك الكاميرا لمحاكاة صعوبة التصويب أثناء الإصابة المميتة. يجب أن يستنزف الوقوف الأخير مؤقت النزيف بشكل أسرع لأن الجهد يسرع فقدان الدم. عرض مؤشرات بصرية مثل إزالة تشبع الشاشة، تأثيرات الظل، وصوت نبض القلب الذي يبطئ مع الوقت لخلق توتر. يجب أن تكون هذه الميكانيكية متاحة مرة واحدة فقط لكل دورة موت لمنع الاستغلال، ويجب تعطيلها تمامًا إذا قُتل اللاعب برصاصة في الرأس، مما يمثل إصابة تعطل فورية.
تفاعل EMS والإحياء
نظام إحياء EMS هو حيث يخلق ميكانيك الموت تفاعلات لعب أدوار ذات مغزى بين اللاعب المصاب وخدمات الطوارئ الطبية. عندما يقترب لاعب EMS من لاعب مصاب، يجب أن يرى مطالبة تفاعل تبدأ تسلسل العلاج. يجب أن تستغرق عملية العلاج وقتًا واقعيًا، عادة من 10 إلى 20 ثانية، خلالها يؤدي لاعب EMS حركة طبية ولا يمكنه التحرك أو الدفاع عن نفسه، مما يخلق ضعفًا يضيف رهانات للاستجابات الطارئة في المناطق الخطرة. نفذ عدة مستويات علاج: التثبيت الأساسي الذي يوقف تقدم عداد النزيف، العلاج المتقدم الذي يبدأ ببطء في استعادة الصحة، والإحياء الكامل الذي يعيد اللاعب إلى وضع الوقوف مع صحة جزئية. كل مستوى يتطلب عناصر طبية محددة من مخزون لاعب EMS، مثل الضمادات للتثبيت، وحقيبة طبية للعلاج، والأدرينالين للإحياء. بعد الإحياء، طبق تأثير سلبي مؤقت حيث يكون لدى اللاعب صحة وطاقة قصوى منخفضة لعدة دقائق، مما يمثل التعافي من إصابات قريبة من الموت ويثني عن القفز فورًا إلى القتال.
-- Server-side EMS revival handler
RegisterNetEvent('death:attemptRevive')
AddEventHandler('death:attemptRevive', function(targetId, treatmentType)
local src = source
local emsPed = GetPlayerPed(src)
local targetPed = GetPlayerPed(targetId)
if not emsPed or not targetPed then return end
-- Check distance
local emsCoords = GetEntityCoords(emsPed)
local targetCoords = GetEntityCoords(targetPed)
if #(emsCoords - targetCoords) > 3.0 then return end
-- Check if EMS has required items
local requiredItems = Config.TreatmentItems[treatmentType]
for _, item in ipairs(requiredItems) do
if exports.ox_inventory:Search(src, 'count', item.name) < item.count then
TriggerClientEvent('ox_lib:notify', src, {
title = 'Missing supplies',
description = 'You need: ' .. item.label,
type = 'error'
})
return
end
end
-- Remove items and start treatment
for _, item in ipairs(requiredItems) do
exports.ox_inventory:RemoveItem(src, item.name, item.count)
end
-- Trigger animations on both players
TriggerClientEvent('death:startTreatmentAnim', src, targetId)
TriggerClientEvent('death:receivingTreatment', targetId, src, treatmentType)
-- After treatment duration, revive
SetTimeout(Config.TreatmentDurations[treatmentType], function()
TriggerClientEvent('death:revived', targetId, treatmentType)
TriggerClientEvent('death:treatmentComplete', src)
end)
end)
نظام إعادة الإحياء في المستشفى
عندما ينتهي مؤقت النزيف بدون تدخل EMS أو يختار اللاعب الاستسلام، يتولى نظام الولادة من جديد في المستشفى إعادة اللاعب إلى اللعب. قدم للاعب شاشة وفاة NUI تعرض خيارين: الانتظار لـ EMS مع مؤشر بصري للمسعفين المتاحين بالقرب، أو الولادة من جديد في أقرب مستشفى مقابل رسوم. يجب ألا تكون الولادة من جديد في المستشفى فورية. طبق رسوم تحميل أو انتقال تدريجي إلى السواد، ثم انقل اللاعب إلى داخل المستشفى مع رسوم إيقاظ في السرير باستخدام ديكور غرفة مستشفى مناسب وأثاث السرير. خصم فاتورة طبية تتناسب مع الوضع المالي الحالي للاعب، تأخذ نسبة من النقود المتوفرة بدلاً من رسوم ثابتة، مما يمنع أن تكون التكلفة تافهة للاعبين الأثرياء ومدمرة للوافدين الجدد. بعد الولادة من جديد في المستشفى، طبق فترة تبريد للإصابة حيث يكون للاعب إحصائيات مخفضة ويرتدي زي المستشفى بصريًا قبل أن يتمكن من تغيير الملابس. تتبع تكرار الوفاة لتطبيق عقوبة ناعمة حيث يواجه اللاعبون الذين يموتون بشكل متكرر خلال فترة قصيرة تكاليف ولادة متزايدة وفترات تعافي أطول، مما يثني عن السلوك المتهور دون جعل الموت عقوبة مفرطة للحوادث العرضية.
تصميم واجهة شاشة الموت
شاشة الموت هي الواجهة الأساسية التي يراها اللاعبون خلال لحظاتهم الأكثر ضعفًا في اللعب، لذا يجب أن تكون نظيفة، إعلامية، وجوّية. ابنِها كطبقة NUI تسيطر على الشاشة عندما يدخل اللاعب حالة الإغماء. طبق فلتر إزالة التشبع التدريجي الذي يزيل اللون من عالم اللعبة، ظل أحمر خفيف حول حواف الشاشة ينبض بإيقاع نبض القلب، وتأثير ضبابي خفيف يزداد مع تناقص مؤقت النزيف. عرض الوقت المتبقي للنزيف كعد تنازلي بارز في مركز أو أعلى الشاشة، مع تعليمات الإجراءات: اضغط E للاتصال بالمساعدة عبر الهاتف داخل اللعبة، اضغط مطولًا G لتفعيل الوقوف الأخير إذا كان متاحًا، أو اضغط مطولًا X للاستسلام وإعادة الظهور في المستشفى. أظهر إشعارًا عندما تكون خدمات الطوارئ في الطريق مع وقت وصول تقديري، وعرض أسماء ومسافات اللاعبين القريبين الذين قد يساعدون. اجعل واجهة المستخدم بسيطة وتجنب ازدحام الشاشة بمعلومات غير ضرورية خلال لحظة توتر وانغماس. استخدم تحريكات GSAP خفيفة لعناصر الواجهة عند الظهور والعد التنازلي للحفاظ على التلميع البصري.
نظام الإصابة والتعافي
قم بتوسيع نظام الموت بطبقة إصابة تستمر بعد الإحياء لإضافة عمق وعواقب. عند إحياء لاعب من قبل EMS أو إعادة ظهوره في المستشفى، قم بتعيين تأثيرات الإصابة بناءً على سبب الوفاة. تسبب جروح الطلقات النارية حركة عرج تقلل سرعة الحركة بنسبة 20% لمدة 15 دقيقة. تسبب حوادث المركبات تأثير دوار مع اهتزاز دوري للشاشة لمدة 10 دقائق. تسبب السقوط من ارتفاع إصابة في الساق تمنع الجري السريع. يسبب الغرق حركة سعال وتقليل في القدرة على التحمل. خزّن الإصابات النشطة في حقيبة حالة اللاعب بحيث تستمر عبر إعادة تشغيل السكربت وتكون مرئية للاعبين الآخرين. أنشئ مسار علاج الإصابة حيث يمكن للاعبين زيارة NPC طبيب أو صيدلي لاعب لتلقي دواء يقلل من مدة تأثيرات الإصابة. نفذ نظام ألم حيث تسبب الإصابات الشديدة ارتجافًا عرضيًا في الشاشة وأصوات أنين مكتومة يمكن للاعبين القريبين سماعها، مما يخلق فرصًا للمواطنين المهتمين أو المجرمين المفترسين لتحديد والتفاعل مع اللاعبين المصابين حديثًا. يجسر نظام الإصابة الفجوة بين الموت والتعافي الكامل، مما يجعل كل موت تجربة متعددة المراحل تمتد في التمثيل بدلاً من أن تكون إزعاجًا لحظيًا.
التكوين وضوابط الإدارة
نظام وفاة مرن يحتاج إلى خيارات تكوين شاملة وأدوات إدارية. قدم لمالكي الخوادم ملف تكوين يتحكم في كل جانب زمني: مدة النزيف، مدة وتوفر الوقوف الأخير، صيغة تكلفة إعادة الظهور في المستشفى، مدد علاج EMS لكل مستوى، مدد تأثيرات الإصابات لكل نوع، وفترة التهدئة بين الوفيات قبل تطبيق العقوبات التصاعدية. أضف أوامر إدارية تسمح لأعضاء الطاقم بإحياء لاعب فورًا، قتل لاعب لأغراض إدارية، تعديل مؤقت النزيف للاعب معين، مسح كل الإصابات النشطة، وتبديل وضع الإله للأحداث أو الحالات الإدارية. أنشئ سجل وفاة يسجل كل وفاة لاعب مع الطابع الزمني، إحداثيات الموقع، سبب الوفاة، معرف القاتل إذا كان ذلك ممكنًا، وقت استجابة EMS، وما إذا تم إحياء اللاعب أو إعادة ظهوره. اكشف هذا السجل من خلال لوحة الإدارة حتى يتمكن الطاقم من التحقيق في أنماط مشبوهة مثل تكرار الوفيات في نفس الموقع مما يشير إلى كمين الظهور، أو الإحياءات السريعة غير المعتادة التي توحي بإساءة استخدام EMS. يجب أن يصدر نظام الوفاة أحداثًا يمكن للسكريبتات الأخرى الربط بها، مما يسمح لنظام الوظائف الخاص بك بإخطار EMS المناوب عن اللاعبين المصابين القريبين ولنظام الشرطة بوضع علامات على المواقع التي تشهد وفيات عنيفة متكررة.