Auto-sync 2026-04-15 22:05
This commit is contained in:
parent
d92af58338
commit
1a79186780
@ -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)
|
||||||
@ -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 xPlayer.getMoney() >= NPC_COST then
|
||||||
if RevivePlayer(targetId) then
|
if RevivePlayer(targetId) then
|
||||||
TriggerClientEvent('esx:showNotification', src, 'Du hast die Person mit Hilfe des Arztes wiederbelebt.')
|
xPlayer.removeMoney(NPC_COST)
|
||||||
TriggerClientEvent('esx:showNotification', targetId, 'Du wurdest von jemandem beim NPC-Arzt gerettet.')
|
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)
|
||||||
Loading…
x
Reference in New Issue
Block a user