Auto-sync 2026-04-15 22:05

This commit is contained in:
root 2026-04-15 22:05:01 +02:00
parent d92af58338
commit 1a79186780
2 changed files with 144 additions and 45 deletions

View File

@ -624,28 +624,39 @@ end)
-- MEDICAL NPC SYSTEM (AUTO-MEDIC) -- MEDICAL NPC SYSTEM (AUTO-MEDIC)
-- ============================================================ -- ============================================================
local MedicNPC = { local currentMedicPed = nil
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() -- Funktion zum Löschen des NPCs
-- NPC Erstellen local function RemoveMedicNPC()
RequestModel(MedicNPC.model) if currentMedicPed then
while not HasModelLoaded(MedicNPC.model) do Wait(10) end 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) -- Funktion zum Erstellen des NPCs
SetEntityHeading(npcEntity, MedicNPC.coords.w) local function SpawnMedicNPC()
FreezeEntityPosition(npcEntity, true) if currentMedicPed then return end -- Schon da
SetEntityInvincible(npcEntity, true)
SetBlockingOfNonTemporaryEvents(npcEntity, true)
-- ox_target Optionen für den NPC local model = `s_m_m_doctor_01`
exports.ox_target:addLocalEntity(npcEntity, { 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', name = 'medic_npc_heal',
icon = 'fas fa-kit-medical', icon = 'fas fa-kit-medical',
label = 'Sich selbst heilen (Kostenlos)', label = 'Sich selbst heilen ($1000)',
canInteract = function() canInteract = function()
return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200 return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200
end, end,
@ -656,40 +667,44 @@ CreateThread(function()
{ {
name = 'medic_npc_revive', name = 'medic_npc_revive',
icon = 'fas fa-heart-pulse', icon = 'fas fa-heart-pulse',
label = 'Person in der Nähe wiederbeleben', label = 'Person wiederbeleben ($1000)',
canInteract = function() canInteract = function()
-- Prüfen ob jemand am Boden liegt in der Nähe des Spielers
local coords = GetEntityCoords(PlayerPedId()) local coords = GetEntityCoords(PlayerPedId())
local players = ESX.Game.GetPlayersInArea(coords, 5.0) local players = ESX.Game.GetPlayersInArea(coords, 5.0)
for _, player in ipairs(players) do for _, player in ipairs(players) do
local serverId = GetPlayerServerId(player) local serverId = GetPlayerServerId(player)
if DownedPlayers[serverId] and player ~= PlayerId() then if DownedPlayers[serverId] and serverId ~= GetPlayerServerId(PlayerId()) then
return true return true
end end
end end
return false return false
end, end,
onSelect = function() onSelect = function()
local coords = GetEntityCoords(PlayerPedId()) local players = ESX.Game.GetPlayersInArea(GetEntityCoords(PlayerPedId()), 5.0)
local players = ESX.Game.GetPlayersInArea(coords, 5.0) local target = nil
local closestPlayer = nil
local shortestDist = 5.0
for _, player in ipairs(players) do for _, player in ipairs(players) do
local serverId = GetPlayerServerId(player) local sId = GetPlayerServerId(player)
if DownedPlayers[serverId] and player ~= PlayerId() then if DownedPlayers[sId] and sId ~= GetPlayerServerId(PlayerId()) then
closestPlayer = serverId target = sId
break break
end end
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
} }
}) })
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) end)

View File

@ -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 -- Hilfsfunktion: Prüft ob EMS im Dienst ist
local function IsEMSOnDuty() local function IsEMSOnDuty()
local xPlayers = ESX.GetExtendedPlayers('job', 'ambulance') -- Ersetze 'ambulance' falls dein Job anders heißt -- Wir nutzen hier Config.EMSJobNames aus deinem Script
return #xPlayers > 0 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 end
-- NPC Selbstheilung -- NPC Selbstheilung
RegisterNetEvent('mercyv-deathscreen:server:npcHealSelf') RegisterNetEvent('mercyv-deathscreen:server:npcHealSelf')
AddEventHandler('mercyv-deathscreen:server:npcHealSelf', function() AddEventHandler('mercyv-deathscreen:server:npcHealSelf', function()
local src = source local src = source
local xPlayer = ESX.GetPlayerFromId(src)
if not xPlayer then return end
if IsEMSOnDuty() then 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 return
end end
local xPlayer = ESX.GetPlayerFromId(src) if xPlayer.getMoney() >= NPC_COST then
if xPlayer then xPlayer.removeMoney(NPC_COST)
TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big') 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
end) end)
@ -359,13 +370,86 @@ end)
RegisterNetEvent('mercyv-deathscreen:server:npcReviveOther') RegisterNetEvent('mercyv-deathscreen:server:npcReviveOther')
AddEventHandler('mercyv-deathscreen:server:npcReviveOther', function(targetId) AddEventHandler('mercyv-deathscreen:server:npcReviveOther', function(targetId)
local src = source local src = source
local xPlayer = ESX.GetPlayerFromId(src)
if not xPlayer then return end
if IsEMSOnDuty() then 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 return
end end
if RevivePlayer(targetId) then if xPlayer.getMoney() >= NPC_COST then
TriggerClientEvent('esx:showNotification', src, 'Du hast die Person mit Hilfe des Arztes wiederbelebt.') if RevivePlayer(targetId) then
TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest von jemandem beim NPC-Arzt gerettet.') 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
end) end)