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.