Bloga Geri Dön
Tutorial9 dk. okuma

FiveM Hastane ve EMS Sistemi: Gerçekçi Sağlık Meslekleri Scripti

FiveM için eksiksiz bir hastane ve EMS döngüsü tasarlayın. Canlandırmalar, hasta kaydı, eczane, ambulans bağlantıları ve roleplay için en iyi medikal scriptler.

Agency Scripts

Agency Scripts Kurucusu ve Baş Geliştiricisi

Hastane Sistemi Mimarisi

Bir hastane ve EMS sistemi, oyuncuların bir FiveM roleplay sunucusunda sağlık ve yaralanmayı deneyimleme biçimini dönüştürür. Oyuncular yere düştükten sonra doğrudan yeniden doğmak yerine, sahada EMS tarafından stabilize edilebildikleri, ambulansla taşındıkları, hastaneye giriş yaptıkları, teşhis konuldukları, tedavi edildikleri ve hizmetler için faturalandırıldıkları tıbbi bir roleplay sürecine dahil olurlar. Sistem mimarisi birbirine bağlı dört katmana ayrılır: Oyuncuya ne olduğunu ve vücudunun neresinde gerçekleştiğini takip eden yaralanma sistemi, EMS dispatch ve saha müdahale araçları, hastane kayıt ve tedavi iş akışı ile tıbbi bakımı sunucu ekonomisine bağlayan faturalandırma sistemi. Her katman sunucu event'leri aracılığıyla iletişim kurar, böylece bir hastayı tedavi eden doktor, EMS görevlisinin saha triyajı sırasında belgelediği yaralanmaları tam olarak görebilir. Bunu ayrı scriptler yerine birleşik bir sistem olarak inşa etmek, birinin 911'i aradığı andan elinde faturayla hastaneden çıktığı ana kadar hasta verilerinin sorunsuz bir şekilde akmasını sağlar.

Yaralanma Türü Sistemi

Ayrıntılı bir yaralanma sistemi, ikili canlı veya ölü durumunun yerine farklı tedaviler gerektiren geniş bir durum yelpazesi getirir. EMS ve doktorların gerçekçi tıbbi senaryolar canlandırabilmesi için yaralanmaları vücut bölgesine, ciddiyetine ve nedenine göre takip edin. Bir oyuncu hasar aldığında, silah veya ölüm nedeni hash değerine göre yaralanma türünü belirleyin ve bunu ilgili vücut bölgesine uygulayın. Gövdeye alınan ateşli silah yaraları kola atılan bir yumruktan daha ciddidir ve her yaralanma türünün doktorların uyması gereken belirli tedavi gereksinimleri vardır:

Config.InjuryTypes = {
    gunshot = {
        label = 'Gunshot Wound',
        severity = { min = 60, max = 100 },
        bleedRate = 2.5,
        treatments = {'clean_wound', 'remove_bullet', 'stitch', 'bandage'},
        requiredItems = {'tweezers', 'suture_kit', 'bandage'},
        healTime = 120,
    },
    stabbing = {
        label = 'Stab Wound',
        severity = { min = 40, max = 80 },
        bleedRate = 1.8,
        treatments = {'clean_wound', 'stitch', 'bandage'},
        requiredItems = {'suture_kit', 'bandage'},
        healTime = 90,
    },
    blunt = {
        label = 'Blunt Force Trauma',
        severity = { min = 20, max = 60 },
        bleedRate = 0.5,
        treatments = {'examine', 'ice_pack', 'painkillers'},
        requiredItems = {'ice_pack', 'painkillers'},
        healTime = 60,
    },
    burn = {
        label = 'Burn Injury',
        severity = { min = 30, max = 90 },
        bleedRate = 0,
        treatments = {'cool_burn', 'apply_cream', 'bandage'},
        requiredItems = {'burn_cream', 'bandage'},
        healTime = 100,
    },
    fracture = {
        label = 'Bone Fracture',
        severity = { min = 50, max = 70 },
        bleedRate = 0,
        treatments = {'x_ray', 'set_bone', 'apply_cast'},
        requiredItems = {'splint', 'cast_material'},
        healTime = 180,
    },
    vehicle_crash = {
        label = 'Vehicle Collision Injury',
        severity = { min = 30, max = 95 },
        bleedRate = 1.0,
        treatments = {'examine', 'clean_wound', 'stitch', 'bandage', 'painkillers'},
        requiredItems = {'suture_kit', 'bandage', 'painkillers'},
        healTime = 110,
    },
}

Config.BodyRegions = {
    'head', 'torso', 'left_arm', 'right_arm', 'left_leg', 'right_leg'
}

-- Severity multipliers per body region
Config.RegionMultipliers = {
    head = 1.5,
    torso = 1.3,
    left_arm = 0.8,
    right_arm = 0.8,
    left_leg = 0.9,
    right_leg = 0.9,
}

EMS Dispatch ve Saha Müdahalesi

EMS dispatch sistemi, yaralanıp yere düşen oyuncuları görevdeki sağlık personeliyle buluşturur. Bir oyuncu yere düşme durumuna geçtiğinde 911'i aramayı seçebilir; bu da görevdeki tüm EMS personeli tarafından görülebilen bir dispatch uyarısı oluşturur. Uyarı, arayanın GPS koordinatlarını, yaralanma verilerinden oluşturulan kısa bir açıklamayı ve yaralanmanın ciddiyetine dayalı bir öncelik seviyesini içerir. EMS görevlileri çağrıyı bir dispatch arayüzü üzerinden kabul edebilir; bu durum çağrıyı üstlenilmiş olarak işaretler ve hastaya giden GPS navigasyonunu sağlar. Çağrının oluşturulmasından hastayla temasa kadar geçen süreyi takip eden bir müdahale zamanlayıcısı uygulayın; bu, EMS performansını izlemek ve personel ihtiyaçlarını ayarlamak için kullanışlıdır. Saha tedavisi, nakil sırasında ölümü önlemek amacıyla EMS personelinin bandaj, turnike ve adrenalin iğnesi gibi temel malzemeleri kullanarak hastaları stabilize edebildiği hastane tedavisinin basitleştirilmiş bir versiyonudur:

-- Server-side dispatch handler
local activeDispatches = {}

RegisterNetEvent('hospital:server:call911', function(description)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local ped = GetPlayerPed(src)
    local coords = GetEntityCoords(ped)
    local injuries = Player.Functions.GetMetaData('injuries') or {}

    -- Determine priority from injury severity
    local maxSeverity = 0
    for _, injury in ipairs(injuries) do
        if injury.severity > maxSeverity then
            maxSeverity = injury.severity
        end
    end

    local priority = maxSeverity >= 80 and 'CRITICAL' or maxSeverity >= 50 and 'URGENT' or 'STANDARD'

    local dispatch = {
        id = #activeDispatches + 1,
        callerId = src,
        citizenid = Player.PlayerData.citizenid,
        callerName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname,
        coords = { x = coords.x, y = coords.y, z = coords.z },
        description = description or GenerateInjuryDescription(injuries),
        priority = priority,
        injuries = injuries,
        timestamp = os.time(),
        status = 'pending',
        responderId = nil,
    }

    table.insert(activeDispatches, dispatch)

    -- Notify all on-duty EMS
    local emsPlayers = QBCore.Functions.GetQBPlayers()
    for _, emsPlayer in pairs(emsPlayers) do
        if emsPlayer.PlayerData.job.name == 'ambulance' and emsPlayer.PlayerData.job.onduty then
            TriggerClientEvent('hospital:client:newDispatch', emsPlayer.PlayerData.source, dispatch)
        end
    end
end)

RegisterNetEvent('hospital:server:acceptDispatch', function(dispatchId)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player or Player.PlayerData.job.name ~= 'ambulance' then return end

    for i, dispatch in ipairs(activeDispatches) do
        if dispatch.id == dispatchId and dispatch.status == 'pending' then
            dispatch.status = 'responding'
            dispatch.responderId = src
            dispatch.responseTime = os.time()

            -- Notify caller
            TriggerClientEvent('QBCore:Notify', dispatch.callerId, 'EMS is on the way!', 'success')
            -- Set GPS blip for responder
            TriggerClientEvent('hospital:client:setDispatchGPS', src, dispatch.coords)
            break
        end
    end
end)

Hastane Girişi ve Tedavi UI

Hastane check-in sistemi, gelişten taburcu olmaya kadar hasta akışını yönetir. Bir EMS görevlisi hastaneye bir hasta getirdiğinde veya bir oyuncu tek başına geldiğinde, giriş yapmak için bir danışma masası NPC'si veya hedef noktasıyla etkileşime girer. Check-in işlemi, faturalandırma amacıyla mevcut yaralanmalarını, yaşamsal belirtilerini ve benzersiz bir ziyaret kimliğini içeren bir hasta kaydı oluşturur. Görevdeki doktorlar, gelen hastaları bekleme odası sırasını, her hastanın triyaj önceliğini ve belgelenmiş yaralanmalarını gösteren bir hastane yönetimi NUI panelinde görür. Bir doktor bir hastayı seçtiğinde, yaralanma yerleri vurgulanmış hasta vücut diyagramını gösteren tedavi UI açılır. Doktor, gerekli tedavi adımlarını görmek için her bir yaralanmaya tıklar ve envanterinden tıbbi malzeme eşyalarını tüketip animasyonları tetikleyerek her adımı sırayla gerçekleştirebilir. Her tedavi adımında, doktorun yetenek meta verilerine bağlı bir ilerleme çubuğu ve başarı kontrolü bulunur, bu da tıbbi roleplay deneyimine bir ilerleme unsuru katar.

Tedavi İş Akışı

Tedavi iş akışını, her yaralanmanın sırayla gerçekleştirilen belirli eylemler gerektirdiği adım adım bir süreç olarak tasarlayın. Gövdedeki bir kurşun yarası yaranın temizlenmesini, cımbız kullanarak merminin çıkarılmasını, dikiş setiyle yaranın dikilmesini ve bandaj uygulanmasını gerektirebilir. Her adım, doktorun envanterinden uygun eşyayı tüketir ve bir tedavi animasyonu oynatır. Adımları atlamak veya sırasız uygulamak işlemi başarısız kılmalı veya etkinliğini azaltmalıdır, bu da kurallara uygun medikal roleplay'i teşvik eder. Tüm yaralanmalar tedavi edildikten sonra hasta, canı anında yenilenmek yerine zamanla kademeli olarak toparlanan bir iyileşme sürecine girer:

RegisterNetEvent('hospital:server:treatInjury', function(patientId, injuryIndex, treatmentStep)
    local src = source
    local Doctor = QBCore.Functions.GetPlayer(src)
    local Patient = QBCore.Functions.GetPlayer(patientId)

    if not Doctor or not Patient then return end
    if Doctor.PlayerData.job.name ~= 'ambulance' or not Doctor.PlayerData.job.onduty then
        TriggerClientEvent('QBCore:Notify', src, 'You must be on duty', 'error')
        return
    end

    local injuries = Patient.Functions.GetMetaData('injuries') or {}
    local injury = injuries[injuryIndex]
    if not injury then return end

    local injuryConfig = Config.InjuryTypes[injury.type]
    if not injuryConfig then return end

    -- Validate treatment step order
    local expectedStep = injury.currentStep or 1
    if treatmentStep ~= expectedStep then
        TriggerClientEvent('QBCore:Notify', src, 'Complete previous treatment steps first', 'error')
        return
    end

    local stepName = injuryConfig.treatments[treatmentStep]
    if not stepName then return end

    -- Check required item
    local requiredItem = Config.TreatmentItems[stepName]
    if requiredItem then
        local hasItem = Doctor.Functions.GetItemByName(requiredItem.name)
        if not hasItem or hasItem.amount < 1 then
            TriggerClientEvent('QBCore:Notify', src, 'Missing: ' .. requiredItem.label, 'error')
            return
        end
        Doctor.Functions.RemoveItem(requiredItem.name, 1)
    end

    -- Apply treatment
    injury.currentStep = treatmentStep + 1
    injury.treated = treatmentStep >= #injuryConfig.treatments

    if injury.treated then
        injury.bleedRate = 0
        injury.healStartTime = os.time()
    end

    injuries[injuryIndex] = injury
    Patient.Functions.SetMetaData('injuries', injuries)

    -- Notify both parties
    TriggerClientEvent('QBCore:Notify', src, 'Treatment step complete: ' .. stepName, 'success')
    TriggerClientEvent('QBCore:Notify', patientId, 'You received treatment: ' .. stepName, 'success')
    TriggerClientEvent('hospital:client:updateInjuries', patientId, injuries)
end)

Mesai İçi ve Mesai Dışı Sistemi

Mesai sistemi, EMS ve hastane personelinin ne zaman aktif olduğunu ve dispatch çağrılarını almaya uygun olduğunu kontrol eder. Ambulans mesleğine sahip bir oyuncu hastane içindeki bir mesai noktasında mesaiye başladığında, tıbbi komutlara erişim kazanır, dispatch bildirimleri alır ve diğer personelin görebileceği aktif EMS listesinde görünür. Sunucunuz otomatik maaş ödemeleri kullanıyorsa mesai sistemi, bordro hesaplamaları için mesaiye giriş ve çıkış saatlerini takip etmelidir. EMS mesleği içinde her rolün farklı tedavi yeteneklerine erişebildiği paramedik, doktor ve cerrah gibi farklı mesai rolleri uygulayın. Bir paramedik sahada stabilizasyon ve temel tedavileri gerçekleştirebilir, bir doktor standart hastane prosedürlerini yürütebilir ve bir cerrah mermi çıkarma ile kemik sabitleme gibi karmaşık ameliyatları yapabilir. Dispatch sisteminin uygun müdahale ekiplerini doğru şekilde sayabilmesi ve baygın oyuncuların otomatik yeniden doğma süresini EMS mevcudiyetine göre ayarlayabilmesi için mesai listesini paylaşılan bir sunucu durumunda saklayın.

Tıbbi Faturalandırma Sistemi

Tıbbi faturalandırma, hastane sistemini sunucu ekonomisine bağlar ve riskli davranışlar için finansal bir sonuç doğurur. Bir hasta tedavi edildiğinde sistem: uygulanan her tedaviyi, tüketilen malzemeleri ve tesis ücretlerini listeleyen ayrıntılı bir fatura oluşturur. Faturalar danışma masasından çıkış sırasında ödenebilir, doğrudan hastanın banka hesabından tahsil edilebilir veya hastanın belirlenen bir süre içinde ödemesi gereken bir fatura olarak gönderilebilir. Oyuncuların tıbbi masraflarının belirli bir yüzdesini karşılayan sigorta poliçeleri satın alabileceği bir sağlık sigortası sistemi uygulayarak sık hastane ziyaretlerinin mali yükünü hafifletebilirsiniz. Sigorta primleri, sunucunun ekonomik simülasyonunu zenginleştiren düzenli bir kesinti olabilir. Ödeme yapamayan oyuncular için, ödenmemiş faturaların faiz biriktirdiği ve borç temizlenene kadar iş maaşlarından haciz kesintisi yapılması veya belirli hizmetlere erişimin kısıtlanması gibi sonuçları tetikleyen bir tıbbi borç sistemi uygulayabilirsiniz. Tüm fatura kayıtlarını yönetici incelemesi için saklayın ve hastadan hastaneye para akışının denetlenebilmesi için işlem günlüğü sistemine bağlayın.

Ambulans Aracı ve Ekipmanları

Ambulans aracı, sirenli hızlı bir arabadan daha fazlası olmalıdır. Ambulansı mobil bir tedavi istasyonu haline getiren araca özel özellikler uygulayın. Bir EMS görevlisi araç etkileşimi yoluyla ambulansın arka kapılarını açtığında; bandajlama, ağrı kesici verme, atel uygulama ve defibrilatör kullanma gibi hastane yeteneklerinin bir alt kümesini içeren bir mobil tedavi menüsüne erişir. Tıbbi malzemeleri ambulansın bagaj envanterinde saklayın, böylece görevlilerin çağrılar arasında hastaneden stok yenilemesi gerekir. Defibrilatör, ölüm durumuna girmiş oyuncuları canlandırabilen özel bir eşyadır ancak uygun CPR tekniğini simüle etmek için zamanlama tabanlı girdilere sahip bir mini oyun gerektirmelidir. EMS'in yere düşen bir oyuncuyu ambulansa bağlı bir sedyeye yerleştirebildiği ve nakil sırasında hastayı araç içinde yatma animasyonuna kilitleyen bir sedye sistemi uygulayın. Kullanın AttachEntityToEntity sedye yerleşimini yönetmek ve SetPedIntoVehicle hasta yükleme için.

Entegrasyon ve Yaşam Kalitesi

Hastane sisteminiz, oyuncuların telefon uygulamasından doğrudan 911'i arayabilmesi, tıbbi geçmişlerini ve ödenmemiş faturalarını görebilmesi ve yardım çağırmaya veya eczaneden temel eşyalarla kendi kendilerini tedavi etmeye karar vermeden önce EMS bekleme sürelerini kontrol edebilmesi için sunucunun telefon kaynağıyla entegre olmalıdır. Bacak yaralanmalarının hareket hızını düşürmesi ve kol yaralanmalarının nişan alma isabetini etkilemesi için yaralanma sistemini hareket cezalarına bağlayarak, oyuncuları yaralanmalarını görmezden gelmek yerine tedavi aramaya teşvik eden somut oynanış sonuçları yaratın. Doktorların bir hastanın tüm tedavi geçmişini, diğer hekimler tarafından not edilen alerjileri ve mevcut ilaçları görebileceği, hastane MDT'si üzerinden erişilebilen bir tıbbi kayıt sistemi uygulayın. Yaralanma ve tedavi fonksiyonlarınızı export edin; böylece uyuşturucu etkileri, gıda zehirlenmesi veya çevresel tehlikeler gibi diğer kaynaklar da aynı tıbbi akışa dahil olabilir. Görevde hiçbir EMS olmadığında devreye giren yapılandırılabilir bir zamanlayıcıya sahip otomatik yeniden doğma (auto-respawn) sistemi ekleyin; bu sayede personel varken oyuncu odaklı tıbbi rol yapma önceliklendirilirken, oyuncuların süresiz olarak baygın (downed) durumda takılı kalması engellenir.

Eşleşen script

Sunucunuz için hazır, güncellemeler dahil.

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.