diff --git a/mercyv-deathscreen/client/main.lua b/mercyv-deathscreen/client/main.lua index 8d9659f..d6ca6ee 100644 --- a/mercyv-deathscreen/client/main.lua +++ b/mercyv-deathscreen/client/main.lua @@ -624,28 +624,39 @@ 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 -} +local currentMedicPed = nil -CreateThread(function() - -- NPC Erstellen - RequestModel(MedicNPC.model) - while not HasModelLoaded(MedicNPC.model) do Wait(10) end +-- Funktion zum Löschen des NPCs +local function RemoveMedicNPC() + if currentMedicPed then + if DoesEntityExist(currentMedicPed) then + DeleteEntity(currentMedicPed) + end + currentMedicPed = nil + end +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) +-- Funktion zum Erstellen des NPCs +local function SpawnMedicNPC() + if currentMedicPed then return end -- Schon da - -- ox_target Optionen für den NPC - exports.ox_target:addLocalEntity(npcEntity, { + 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, { { name = 'medic_npc_heal', icon = 'fas fa-kit-medical', - label = 'Sich selbst heilen (Kostenlos)', + label = 'Sich selbst heilen ($1000)', canInteract = function() return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200 end, @@ -656,40 +667,44 @@ CreateThread(function() { name = 'medic_npc_revive', icon = 'fas fa-heart-pulse', - label = 'Person in der Nähe wiederbeleben', + label = 'Person wiederbeleben ($1000)', 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 + if DownedPlayers[serverId] and serverId ~= GetPlayerServerId(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 - + local players = ESX.Game.GetPlayersInArea(GetEntityCoords(PlayerPedId()), 5.0) + local target = nil for _, player in ipairs(players) do - local serverId = GetPlayerServerId(player) - if DownedPlayers[serverId] and player ~= PlayerId() then - closestPlayer = serverId + local sId = GetPlayerServerId(player) + if DownedPlayers[sId] and sId ~= GetPlayerServerId(PlayerId()) then + target = sId break end end - - if closestPlayer then - TriggerServerEvent('mercyv-deathscreen:server:npcReviveOther', closestPlayer) - else - ESX.ShowNotification('Keine bewusstlose Person in der Nähe!') - end + if target then TriggerServerEvent('mercyv-deathscreen:server:npcReviveOther', target) 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 5277440..d56a48e 100644 --- a/mercyv-deathscreen/server/main.lua +++ b/mercyv-deathscreen/server/main.lua @@ -330,28 +330,39 @@ end) -- ============================================================ --- NPC MEDICAL SERVER LOGIC +-- NPC MEDICAL SERVER LOGIC (WITH COSTS) -- ============================================================ +local NPC_COST = 1000 -- Preis für Heilung/Revive + -- 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 + -- 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 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 rufe den Notruf.') + TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte nutze dein Handy.') return end - local xPlayer = ESX.GetPlayerFromId(src) - if xPlayer then + if xPlayer.getMoney() >= NPC_COST then + xPlayer.removeMoney(NPC_COST) TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big') - TriggerClientEvent('esx:showNotification', src, 'Der Arzt hat deine Wunden versorgt.') + 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 .. ')') end end) @@ -359,13 +370,86 @@ 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! Bitte rufe den Notruf.') + TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst!') 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.') + 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!') end end) \ No newline at end of file