Auto-sync 2026-04-15 22:10

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

View File

@ -624,39 +624,28 @@ end)
-- MEDICAL NPC SYSTEM (AUTO-MEDIC) -- 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 CreateThread(function()
local function RemoveMedicNPC() -- NPC Erstellen
if currentMedicPed then RequestModel(MedicNPC.model)
if DoesEntityExist(currentMedicPed) then while not HasModelLoaded(MedicNPC.model) do Wait(10) end
DeleteEntity(currentMedicPed)
end
currentMedicPed = nil
end
end
-- Funktion zum Erstellen des NPCs local npcEntity = CreatePed(4, MedicNPC.model, MedicNPC.coords.x, MedicNPC.coords.y, MedicNPC.coords.z, MedicNPC.coords.w, false, true)
local function SpawnMedicNPC() SetEntityHeading(npcEntity, MedicNPC.coords.w)
if currentMedicPed then return end -- Schon da FreezeEntityPosition(npcEntity, true)
SetEntityInvincible(npcEntity, true)
SetBlockingOfNonTemporaryEvents(npcEntity, true)
local model = `s_m_m_doctor_01` -- ox_target Optionen für den NPC
local coords = vector4(-327.2433, -588.2013, 31.7755, 211.5617) exports.ox_target:addLocalEntity(npcEntity, {
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 ($1000)', label = 'Sich selbst heilen (Kostenlos)',
canInteract = function() canInteract = function()
return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200 return deathState == 'ALIVE' and GetEntityHealth(PlayerPedId()) < 200
end, end,
@ -667,44 +656,40 @@ local function SpawnMedicNPC()
{ {
name = 'medic_npc_revive', name = 'medic_npc_revive',
icon = 'fas fa-heart-pulse', icon = 'fas fa-heart-pulse',
label = 'Person wiederbeleben ($1000)', label = 'Person in der Nähe wiederbeleben',
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 serverId ~= GetPlayerServerId(PlayerId()) then if DownedPlayers[serverId] and player ~= PlayerId() then
return true return true
end end
end end
return false return false
end, end,
onSelect = function() onSelect = function()
local players = ESX.Game.GetPlayersInArea(GetEntityCoords(PlayerPedId()), 5.0) local coords = GetEntityCoords(PlayerPedId())
local target = nil local players = ESX.Game.GetPlayersInArea(coords, 5.0)
local closestPlayer = nil
local shortestDist = 5.0
for _, player in ipairs(players) do for _, player in ipairs(players) do
local sId = GetPlayerServerId(player) local serverId = GetPlayerServerId(player)
if DownedPlayers[sId] and sId ~= GetPlayerServerId(PlayerId()) then if DownedPlayers[serverId] and player ~= PlayerId() then
target = sId closestPlayer = serverId
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,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 -- Hilfsfunktion: Prüft ob EMS im Dienst ist
local function IsEMSOnDuty() local function IsEMSOnDuty()
-- Wir nutzen hier Config.EMSJobNames aus deinem Script local xPlayers = ESX.GetExtendedPlayers('job', 'ambulance') -- Ersetze 'ambulance' falls dein Job anders heißt
for _, jobName in ipairs(Config.EMSJobNames or {'ambulance'}) do return #xPlayers > 0
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 nutze dein Handy.') TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.')
return return
end end
if xPlayer.getMoney() >= NPC_COST then local xPlayer = ESX.GetPlayerFromId(src)
xPlayer.removeMoney(NPC_COST) if xPlayer then
TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big') TriggerClientEvent('mercyv-deathscreen:client:healed', src, 200, 'big')
TriggerClientEvent('esx:showNotification', src, ('Du hast $%s für die Behandlung bezahlt.'):format(NPC_COST)) TriggerClientEvent('esx:showNotification', src, 'Der Arzt hat deine Wunden versorgt.')
else
TriggerClientEvent('esx:showNotification', src, 'Du hast nicht genug Geld dabei (Benötigt: $' .. NPC_COST .. ')')
end end
end) end)
@ -370,86 +359,13 @@ 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!') TriggerClientEvent('esx:showNotification', src, 'Es sind Sanitäter im Dienst! Bitte rufe den Notruf.')
return return
end end
if xPlayer.getMoney() >= NPC_COST then
if RevivePlayer(targetId) then if RevivePlayer(targetId) then
xPlayer.removeMoney(NPC_COST) TriggerClientEvent('esx:showNotification', src, 'Du hast die Person mit Hilfe des Arztes wiederbelebt.')
TriggerClientEvent('esx:showNotification', src, ('Du hast $%s für die Wiederbelebung bezahlt.'):format(NPC_COST)) TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest von jemandem beim NPC-Arzt gerettet.')
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)