From 89788d790e9dd532798273c514b6f2bfc280c021 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 15 Apr 2026 22:10:01 +0200 Subject: [PATCH] Auto-sync 2026-04-15 22:10 --- mercyv-deathscreen/client/main.lua | 83 +++++++++------------- mercyv-deathscreen/server/main.lua | 106 +++-------------------------- 2 files changed, 45 insertions(+), 144 deletions(-) diff --git a/mercyv-deathscreen/client/main.lua b/mercyv-deathscreen/client/main.lua index d6ca6ee..8d9659f 100644 --- a/mercyv-deathscreen/client/main.lua +++ b/mercyv-deathscreen/client/main.lua @@ -624,39 +624,28 @@ end) -- MEDICAL NPC SYSTEM (AUTO-MEDIC) -- ============================================================ -local currentMedicPed = nil +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 +} --- Funktion zum Löschen des NPCs -local function RemoveMedicNPC() - if currentMedicPed then - if DoesEntityExist(currentMedicPed) then - DeleteEntity(currentMedicPed) - end - currentMedicPed = nil - end -end +CreateThread(function() + -- NPC Erstellen + RequestModel(MedicNPC.model) + while not HasModelLoaded(MedicNPC.model) do Wait(10) end --- Funktion zum Erstellen des NPCs -local function SpawnMedicNPC() - if currentMedicPed then return end -- Schon da + 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) - local model = `s_m_m_doctor_01` - local coords = vector4(-327.2433, -588.2013, 31.7755, 211.5617) - - RequestModel(model) - while not HasModelLoaded(model) do Wait(10) end - - currentMedicPed = CreatePed(4, model, coords.x, coords.y, coords.z, coords.w, false, true) - SetEntityHeading(currentMedicPed, coords.w) - FreezeEntityPosition(currentMedicPed, true) - SetEntityInvincible(currentMedicPed, true) - SetBlockingOfNonTemporaryEvents(currentMedicPed, true) - - exports.ox_target:addLocalEntity(currentMedicPed, { + -- 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 ($1000)', + label = 'Sich selbst heilen (Kostenlos)', canInteract = function() return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200 end, @@ -667,44 +656,40 @@ local function SpawnMedicNPC() { name = 'medic_npc_revive', icon = 'fas fa-heart-pulse', - label = 'Person wiederbeleben ($1000)', + 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 serverId ~= GetPlayerServerId(PlayerId()) then + if DownedPlayers[serverId] and player ~= PlayerId() then return true end end return false end, onSelect = function() - local players = ESX.Game.GetPlayersInArea(GetEntityCoords(PlayerPedId()), 5.0) - local target = nil + 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 sId = GetPlayerServerId(player) - if DownedPlayers[sId] and sId ~= GetPlayerServerId(PlayerId()) then - target = sId + local serverId = GetPlayerServerId(player) + if DownedPlayers[serverId] and player ~= PlayerId() then + closestPlayer = serverId break end end - if target then TriggerServerEvent('mercyv-deathscreen:server:npcReviveOther', target) end + + if closestPlayer then + TriggerServerEvent('mercyv-deathscreen:server:npcReviveOther', closestPlayer) + else + ESX.ShowNotification('Keine bewusstlose Person in der Nähe!') + end end } }) -end - --- Thread der prüft, ob Sanitäter da sind -CreateThread(function() - while true do - Wait(5000) -- Check alle 5 Sekunden - ESX.TriggerServerCallback('mercyv-deathscreen:server:getEMSCount', function(count) - if count > 0 then - RemoveMedicNPC() - else - SpawnMedicNPC() - end - end) - end end) \ No newline at end of file diff --git a/mercyv-deathscreen/server/main.lua b/mercyv-deathscreen/server/main.lua index d56a48e..5277440 100644 --- a/mercyv-deathscreen/server/main.lua +++ b/mercyv-deathscreen/server/main.lua @@ -330,39 +330,28 @@ end) -- ============================================================ --- NPC MEDICAL SERVER LOGIC (WITH COSTS) +-- NPC MEDICAL SERVER LOGIC -- ============================================================ -local NPC_COST = 1000 -- Preis für Heilung/Revive - -- Hilfsfunktion: Prüft ob EMS im Dienst ist local function IsEMSOnDuty() - -- Wir nutzen hier Config.EMSJobNames aus deinem Script - for _, jobName in ipairs(Config.EMSJobNames or {'ambulance'}) do - local xPlayers = ESX.GetExtendedPlayers('job', jobName) - if #xPlayers > 0 then return true end - end - return false + 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 - local xPlayer = ESX.GetPlayerFromId(src) - if not xPlayer then return end - if IsEMSOnDuty() then - TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte nutze dein Handy.') + TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.') return end - if xPlayer.getMoney() >= NPC_COST then - xPlayer.removeMoney(NPC_COST) + local xPlayer = ESX.GetPlayerFromId(src) + if xPlayer then TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big') - TriggerClientEvent('esx:showNotification', src, ('Du hast $%s für die Behandlung bezahlt.'):format(NPC_COST)) - else - TriggerClientEvent('esx:showNotification', src, 'Du hast nicht genug Geld dabei (Benötigt: $' .. NPC_COST .. ')') + TriggerClientEvent('esx:showNotification', src, 'Der Arzt hat deine Wunden versorgt.') end end) @@ -370,86 +359,13 @@ end) RegisterNetEvent('mercyv-deathscreen:server:npcReviveOther') AddEventHandler('mercyv-deathscreen:server:npcReviveOther', function(targetId) local src = source - local xPlayer = ESX.GetPlayerFromId(src) - if not xPlayer then return end - if IsEMSOnDuty() then - TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst!') + TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.') return end - if xPlayer.getMoney() >= NPC_COST then - if RevivePlayer(targetId) then - xPlayer.removeMoney(NPC_COST) - TriggerClientEvent('esx:showNotification', src, ('Du hast $%s für die Wiederbelebung bezahlt.'):format(NPC_COST)) - TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest medizinisch gerettet!') - else - TriggerClientEvent('esx:showNotification', src, 'Wiederbelebung fehlgeschlagen.') - end - else - TriggerClientEvent('esx:showNotification', src, 'Du hast nicht genug Geld dabei (Benötigt: $' .. NPC_COST .. ')') - end -end) - --- Callback für den Client-Check -ESX.RegisterServerCallback('mercyv-deathscreen:server:getEMSCount', function(source, cb) - local count = 0 - local xPlayers = ESX.GetExtendedPlayers() - - for _, xPlayer in ipairs(xPlayers) do - for _, jobName in ipairs(Config.EMSJobNames) do - if xPlayer.job.name == jobName then - count = count + 1 - break - end - end - end - cb(count) -end) - --- NPC Selbstheilung (angepasst) -RegisterNetEvent('mercyv-deathscreen:server:npcHealSelf') -AddEventHandler('mercyv-deathscreen:server:npcHealSelf', function() - local src = source - local xPlayer = ESX.GetPlayerFromId(src) - if not xPlayer then return end - - -- Nochmalige Sicherheitsprüfung auf dem Server - local emsCount = 0 - local xPlayers = ESX.GetExtendedPlayers() - for _, p in ipairs(xPlayers) do - for _, job in ipairs(Config.EMSJobNames) do - if p.job.name == job then emsCount = emsCount + 1 end - end - end - - if emsCount > 0 then - TriggerClientEvent('esx:showNotification', src, 'Sanitäter sind nun im Dienst!') - return - end - - if xPlayer.getMoney() >= 1000 then - xPlayer.removeMoney(1000) - TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big') - TriggerClientEvent('esx:showNotification', src, 'Behandlung abgeschlossen. $1000 bezahlt.') - else - TriggerClientEvent('esx:showNotification', src, 'Nicht genug Geld!') - end -end) - --- NPC Wiederbelebung (angepasst) -RegisterNetEvent('mercyv-deathscreen:server:npcReviveOther') -AddEventHandler('mercyv-deathscreen:server:npcReviveOther', function(targetId) - local src = source - local xPlayer = ESX.GetPlayerFromId(src) - if not xPlayer or not targetId then return end - - if xPlayer.getMoney() >= 1000 then - if RevivePlayer(targetId) then - xPlayer.removeMoney(1000) - TriggerClientEvent('esx:showNotification', src, 'Person wiederbelebt. $1000 bezahlt.') - end - else - TriggerClientEvent('esx:showNotification', src, 'Nicht genug Geld!') + 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