diff --git a/mercyv-deathscreen/client/main.lua b/mercyv-deathscreen/client/main.lua index 0da74cf..8d9659f 100644 --- a/mercyv-deathscreen/client/main.lua +++ b/mercyv-deathscreen/client/main.lua @@ -618,4 +618,78 @@ AddEventHandler('onResourceStop', function(resourceName) SetHudVisible(true) HideDeathscreen() end +end) + +-- ============================================================ +-- MEDICAL NPC SYSTEM (AUTO-MEDIC) +-- ============================================================ + +local MedicNPC = { + model = `s_m_m_doctor_01`, -- Der Skin des Arztes + coords = vector4(-327.2433, -588.2013, 31.7755, 211.5617), -- Z leicht gesenkt für Bodenhaftung +} + +CreateThread(function() + -- NPC Erstellen + RequestModel(MedicNPC.model) + while not HasModelLoaded(MedicNPC.model) do Wait(10) end + + local npcEntity = CreatePed(4, MedicNPC.model, MedicNPC.coords.x, MedicNPC.coords.y, MedicNPC.coords.z, MedicNPC.coords.w, false, true) + SetEntityHeading(npcEntity, MedicNPC.coords.w) + FreezeEntityPosition(npcEntity, true) + SetEntityInvincible(npcEntity, true) + SetBlockingOfNonTemporaryEvents(npcEntity, true) + + -- ox_target Optionen für den NPC + exports.ox_target:addLocalEntity(npcEntity, { + { + name = 'medic_npc_heal', + icon = 'fas fa-kit-medical', + label = 'Sich selbst heilen (Kostenlos)', + canInteract = function() + return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200 + end, + onSelect = function() + TriggerServerEvent('mercyv-deathscreen:server:npcHealSelf') + end + }, + { + name = 'medic_npc_revive', + icon = 'fas fa-heart-pulse', + label = 'Person in der Nähe wiederbeleben', + canInteract = function() + -- Prüfen ob jemand am Boden liegt in der Nähe des Spielers + local coords = GetEntityCoords(PlayerPedId()) + local players = ESX.Game.GetPlayersInArea(coords, 5.0) + + for _, player in ipairs(players) do + local serverId = GetPlayerServerId(player) + if DownedPlayers[serverId] and player ~= PlayerId() then + return true + end + end + return false + end, + onSelect = function() + local coords = GetEntityCoords(PlayerPedId()) + local players = ESX.Game.GetPlayersInArea(coords, 5.0) + local closestPlayer = nil + local shortestDist = 5.0 + + for _, player in ipairs(players) do + local serverId = GetPlayerServerId(player) + if DownedPlayers[serverId] and player ~= PlayerId() then + closestPlayer = serverId + break + end + end + + if closestPlayer then + TriggerServerEvent('mercyv-deathscreen:server:npcReviveOther', closestPlayer) + else + ESX.ShowNotification('Keine bewusstlose Person in der Nähe!') + end + end + } + }) end) \ No newline at end of file diff --git a/mercyv-deathscreen/server/main.lua b/mercyv-deathscreen/server/main.lua index 4e96142..5277440 100644 --- a/mercyv-deathscreen/server/main.lua +++ b/mercyv-deathscreen/server/main.lua @@ -327,3 +327,45 @@ AddEventHandler('onResourceStop', function(resourceName) if resourceName ~= GetCurrentResourceName() then return end PlayerDeathStates = {} end) + + +-- ============================================================ +-- NPC MEDICAL SERVER LOGIC +-- ============================================================ + +-- Hilfsfunktion: Prüft ob EMS im Dienst ist +local function IsEMSOnDuty() + local xPlayers = ESX.GetExtendedPlayers('job', 'ambulance') -- Ersetze 'ambulance' falls dein Job anders heißt + return #xPlayers > 0 +end + +-- NPC Selbstheilung +RegisterNetEvent('mercyv-deathscreen:server:npcHealSelf') +AddEventHandler('mercyv-deathscreen:server:npcHealSelf', function() + local src = source + if IsEMSOnDuty() then + TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.') + return + end + + local xPlayer = ESX.GetPlayerFromId(src) + if xPlayer then + TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big') + TriggerClientEvent('esx:showNotification', src, 'Der Arzt hat deine Wunden versorgt.') + end +end) + +-- NPC Wiederbelebung für andere +RegisterNetEvent('mercyv-deathscreen:server:npcReviveOther') +AddEventHandler('mercyv-deathscreen:server:npcReviveOther', function(targetId) + local src = source + if IsEMSOnDuty() then + TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.') + return + end + + if RevivePlayer(targetId) then + TriggerClientEvent('esx:showNotification', src, 'Du hast die Person mit Hilfe des Arztes wiederbelebt.') + TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest von jemandem beim NPC-Arzt gerettet.') + end +end) \ No newline at end of file