Bloga Geri Dön
Tutorial7 dk. okuma

FiveM Ölüm ve Yeniden Doğma Sistemi: Gerçekçi Canlandırmalar Scriptleyin

Kusursuz bir FiveM ölüm ve respawn sistemi tasarlayın. Kanama zamanlayıcıları, EMS canlandırmaları, hastane akışı ve QBCore ile ESX için en iyi ölüm scriptleri.

Agency Scripts

Agency Scripts Kurucusu ve Baş Geliştiricisi

Oyuncu Ölümünü Tespit Etme

Ölüm ve respawn sistemi, bir oyuncunun canı sıfıra ulaştığında ne olacağını ve oyuna nasıl döneceğini yöneten, herhangi bir FiveM roleplay sunucusundaki en temel mekaniklerden biridir. GTA V'in varsayılan ölüm davranışı, kısa bir sinematiğin ardından en yakın hastanede otomatik respawn olmayı içerir; bu da roleplay atmosferini tamamen bozar. Düzgün bir sistem oluşturmak için, oyunun varsayılan işleyicisi devreye girmeden önce ölüm durumunu yakalamanız gerekir. Şu fonksiyonu kullanarak her karede oyuncunun canını izleyin: GetEntityHealth ve ped'ler için 0 olan ölüm eşiğine ne zaman düştüğünü tespit edin. Ölüm tespit edildiğinde hemen şunu kullanın: NetworkResurrectLocalPlayer varsayılan ölüm ekranının görünmesini engellemek, ardından oyuncuyu şununla ragdoll durumuna geçirmek için: SetPedToRagdoll etkisiz hale gelme durumunu simüle etmek için. Şunu çağırarak varsayılan respawn sistemini devre dışı bırakın: SetPlayerInvincible özel ölüm durumu işleyicinize geçiş yaparken geçici olarak. Bu yaklaşım, görsel gerçekçiliği korurken ölüm deneyimi üzerinde tam kontrol sahibi olmanızı sağlar.

Kan Kaybı Zamanlayıcı Sistemi

Kan kaybı zamanlayıcısı, yere düşme ile tamamen ölme arasında diğer oyuncuların etkisiz hale gelen kişiyle etkileşime girebileceği kritik bir zaman aralığı oluşturur. Bir oyuncu yere düşme durumuna girdiğinde, yavaşça kan kaybettiğini temsil eden bir geri sayım zamanlayıcısı başlatın. Bu zamanlayıcıyı, kalan süreyi ve ilgili talimatları gösteren bir NUI arayüzü ile ekranda belirgin şekilde sergileyin. Kan kaybı aşamasında oyuncu, silah kullanamayacak, araç süremeyecek veya çoğu dünya nesnesiyle etkileşime giremeyecek şekilde yerde bir ragdoll veya sürünme animasyonunda olmalıdır. Yere düşen oyuncuların yardım çağırabilmesi veya yaralanmalarının rolünü yapabilmesi için yakınlık tabanlı sesli sohbeti kullanmalarına izin verin. Zamanlayıcı süresi yapılandırılabilir olmalı, genellikle 5 ila 15 dakika arasında tutulmalı ve EMS ekiplerinin gerçekçi bir şekilde müdahale etmesine yetecek kadar uzun olmalıdır. Oyuncu yerdeyken ek hasar alırsa zamanlayıcının hızlandığı, başka bir oyuncu bandaj veya ilk yardım kiti gibi ilk yardım eşyaları uygulamaya başladığında ise yavaşladığı veya durakladığı bir sistem kurun.

-- 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)

Son Direniş Mekaniği

Son direniş (last stand) mekaniği, yere düşen oyunculara karşılık verme veya güvenli bir yere sürünme konusunda kısa bir fırsat vererek çatışmalara taktiksel bir katman katar. Bir oyuncu ilk kez yere düştüğünde, tamamen yığılmadan önce 15-30 saniye boyunca büyük ölçüde azaltılmış isabet oranı ve hareket hızıyla tabanca ateşleyebileceği yüzüstü bir konuma getiren tek seferlik bir etkinleştirme sunun. Bunu, şu fonksiyonu kullanarak oyuncuyu bir sürünme animasyonuna sokarak uygulayın: TaskPlayAnim yer tabanlı bir animasyon sözlüğü ile, ardından silah kullanımını geçici olarak yeniden etkinleştirip yalnızca tabancalarla sınırlandırarak. Ağır yaralıyken nişan almanın zorluğunu simüle etmek için kamera manipülasyonu kullanarak ağır bir silah sallantı efekti uygulayın. Last stand, efor sarfiyatı kan kaybını hızlandırdığı için kanama zamanlayıcısını daha hızlı tüketmelidir. Gerilim yaratmak için ekran doygunluğunu azaltma, vinyet efektleri ve zamanla yavaşlayan bir kalp atışı sesi gibi görsel göstergeler sergileyin. Bu mekanik, suistimali önlemek için ölüm döngüsü başına yalnızca bir kez kullanılabilir olmalı ve anında etkisiz hale getiren bir yarayı temsil ettiği için oyuncu kafadan vurularak öldürüldüyse tamamen devre dışı bırakılmalıdır.

EMS Etkileşimi ve Canlandırma

EMS canlandırma sistemi, ölüm mekaniğinin yere düşen oyuncu ile acil tıbbi hizmetler arasında anlamlı roleplay etkileşimleri oluşturduğu yerdir. Bir EMS oyuncusu yere düşmüş bir oyuncuya yaklaştığında, bir tedavi dizisini başlatan bir etkileşim istemi görmelidir. Tedavi süreci gerçekçi bir zaman almalıdır, genellikle 10-20 saniye; bu süre boyunca EMS oyuncusu tıbbi bir animasyon gerçekleştirir ve hareket edemez veya kendini savunamaz, bu da tehlikeli bölgelerdeki acil müdahalelere risk katan bir savunmasızlık yaratır. Birden fazla tedavi kademesi uygulayın: kan kaybı zamanlayıcısının ilerlemesini durduran temel stabilizasyon, sağlığı yavaşça geri kazandırmaya başlayan gelişmiş tedavi ve oyuncuyu kısmi sağlıkla ayağa kaldıran tam canlandırma. Her kademe, stabilizasyon için bandajlar, tedavi için bir ilk yardım kiti ve canlandırma için adrenalin gibi EMS oyuncusunun envanterinden belirli tıbbi eşyalar gerektirmelidir. Canlandırmadan sonra, oyuncunun birkaç dakika boyunca maksimum sağlığının ve dayanıklılığının azaldığı geçici bir debuff uygulayın; bu, oyuncuların doğrudan savaşa geri dönmesini engelleyen ve ölümden dönülen yaralanmalardan iyileşmeyi temsil eden bir durumdur.

-- 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)

Hastane Respawn Sistemi

EMS müdahalesi olmadan kan kaybı süresi dolduğunda veya oyuncu pes etmeyi seçtiğinde, hastanede yeniden doğma sistemi onları oyuna geri döndürme sürecini yönetir. Oyuncuya iki seçenek gösteren bir ölüm ekranı NUI'si sunun: yakındaki görevli sağlık görevlilerinin görsel bir göstergesiyle EMS beklemek veya bir ücret karşılığında en yakın hastanede yeniden doğmak. Hastanede yeniden doğma anlık olmamalıdır. Bir yükleme animasyonu veya kararma geçişi uygulayın, ardından uygun bir hastane odası içi ve yatak prop'u kullanarak oyuncuyu yatakta uyanma animasyonuyla hastane içine ışınlayın. Sabit bir ücret yerine nakit parasının belirli bir yüzdesini alarak oyuncunun mevcut mali durumuna göre ölçeklenen bir tıbbi fatura kesin: bu, maliyetin zengin oyuncular için önemsiz, yeni gelenler için yıkıcı olmasını engeller. Hastanede yeniden doğduktan sonra, oyuncunun istatistiklerinin azaldığı ve kıyafet değiştirmeden önce görsel olarak bir hastane önlüğü giydiği bir yaralanma bekleme süresi uygulayın. Kısa bir süre içinde çok sık ölen oyuncuların artan yeniden doğma maliyetleriyle ve daha uzun iyileşme süreleriyle karşılaştığı hafif bir ceza mekanizması uygulamak için ölüm sıklığını takip edin: bu durum, ara sıra yaşanan olaylar için ölümü aşırı cezalandırıcı hissettirmeden pervasız davranışların önüne geçer.

Ölüm Ekranı UI Tasarımı

Ölüm ekranı, oyuncuların oynanışın en savunmasız anında gördükleri birincil arayüzdür; bu nedenle sade, bilgilendirici ve atmosferik olmalıdır. Oyuncu baygınlık (downed) durumuna girdiğinde ekranın kontrolünü devralan bir NUI overlay olarak oluşturun. Oyun dünyasından rengi kaldıran kademeli bir doygunluk azaltma (desaturation) filtresi, ekran kenarlarında kalp atışı ritmiyle atan hafif kırmızı bir vinyet ve kanama (bleedout) süresi azaldıkça yoğunlaşan hafif bir bulanıklık efekti uygulayın. Kalan kanama süresini ekranın ortasında veya üstünde belirgin bir geri sayım olarak ve eylem ipuçlarıyla birlikte görüntüleyin: oyun içi telefonla yardım çağırmak için E'ye basın, varsa son direnişi (last stand) etkinleştirmek için G'yi basılı tutun veya pes edip hastanede respawn olmak için X'i basılı tutun. EMS yoldayken tahmini varış süresiyle birlikte bir bildirim gösterin ve potansiyel olarak yardım edebilecek yakındaki oyuncuların adlarını ve mesafelerini görüntüleyin. Gergin ve sürükleyici olması gereken bir an boyunca arayüzü sade tutun ve ekranı gereksiz bilgilerle doldurmaktan kaçının. Görsel şıklığı korumak adına UI ögelerinin belirmesi ve zamanlayıcının geri sayımı için hafif GSAP animasyonları kullanın.

Yaralanma ve İyileşme Sistemi

Derinlik ve sonuçlar eklemek için ölüm sistemini, canlanma sonrasında da devam eden bir yaralanma katmanıyla genişletin. Bir oyuncu EMS tarafından canlandırıldığında veya hastanede yeniden doğduğunda, ölüm nedenine bağlı olarak yaralanma etkileri atayın. Kurşun yaraları, 15 dakika boyunca hareket hızını %20 azaltan bir topallama animasyonuna neden olur. Araç kazaları, 10 dakika boyunca periyodik ekran sarsıntısıyla sersemleme etkisi uygular. Yüksekten düşmeler, depar atmayı engelleyen bir bacak yaralanmasına yol açar. Boğulma, öksürük animasyonuna ve azalan dayanıklılığa neden olur. Aktif yaralanmaları, script yeniden başlatmalarında korunmaları ve diğer oyuncular tarafından görülebilmeleri için oyuncunun state bag'inde saklayın. Oyuncuların bir doktor NPC'sini veya oyuncu eczacıyı ziyaret ederek yaralanma etkilerinin süresini azaltan ilaçlar alabileceği bir yaralanma tedavi süreci oluşturun. Ağır yaralanmaların ara sıra ekranda irkilmelere ve yakındaki oyuncuların duyabileceği bastırılmış inleme seslerine yol açtığı bir acı sistemi uygulayın; bu da endişeli vatandaşların veya fırsatçı suçluların yeni yaralanmış oyuncuları tespit edip onlarla etkileşime girmesi için fırsatlar yaratır. Yaralanma sistemi, ölüm ile tam iyileşme arasındaki boşluğu doldurarak her ölümü anlık bir rahatsızlık yerine rolü genişleten çok aşamalı bir deneyim haline getirir.

Yapılandırma ve Yönetici Kontrolleri

Esnek bir ölüm sistemi, kapsamlı yapılandırma seçeneklerine ve yönetim araçlarına ihtiyaç duyar. Sunucu sahiplerine her zamanlama yönünü kontrol eden bir config dosyası sağlayın: Kanama süresi, son direniş süresi ve kullanılabilirliği, hastanede respawn maliyet formülü, kademe başına EMS tedavi süreleri, türe göre yaralanma etkisi süreleri ve artan cezalar uygulanmadan önce ölümler arasındaki bekleme süresi. Yetkililerin bir oyuncuyu anında canlandırmasına, yönetimsel amaçlarla bir oyuncuyu öldürmesine, belirli bir oyuncunun kanama zamanlayıcısını ayarlamasına, tüm aktif yaralanmaları temizlemesine ve etkinlikler veya yönetimsel durumlar için ölümsüzlük modunu açıp kapatmasına olanak tanıyan admin komutları ekleyin. Her oyuncu ölümünü zaman damgası, konum koordinatları, ölüm nedeni, varsa katil tanımlayıcısı, EMS müdahale süresi ve oyuncunun canlandırılıp canlandırılmadığı veya respawn olup olmadığı ile kaydeden bir ölüm günlüğü oluşturun. Yetkililerin aynı konumda spawn camp yapıldığını gösteren tekrarlanan ölümler veya EMS suistimaline işaret eden olağandışı hızlı canlandırmalar gibi şüpheli durumları inceleyebilmesi için bu günlüğü admin paneliniz üzerinden sunun. Ölüm sistemi, diğer scriptlerin bağlanabileceği event'ler tetiklemelidir; bu sayede meslek sisteminiz görevdeki EMS personeline yakındaki yaralı oyuncuları bildirebilir ve polis sisteminiz sık şiddetli ölümlerin yaşandığı konumları işaretleyebilir.

Başlamaya Hazır mısınız?

Scriptleri mağazamızdan edinin veya destek, güncellemeler ve gelecek yeniliklere göz atmak için Discord'a katılın.