Auto-sync 2026-04-15 22:10
This commit is contained in:
parent
1a79186780
commit
89788d790e
@ -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)
|
||||
@ -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)
|
||||
Loading…
x
Reference in New Issue
Block a user