This documentation covers all configuration options available to server owners. The script automatically detects your framework (ESX, QBCore) and requires baseevents to function properly.
1) Overview
Risk Revive Station is a player-operated revival system featuring:
💊 Pay-to-revive mechanics with customizable pricing
⏱️ Two-tier revival system (fast/expensive or slow/cheap)
👨⚕️ Doctor presence requirement (optional)
📍 Multiple station locations (NPCs or markers)
🎯 ox_target support for modern interactions
📊 Discord webhook logging with full identifier tracking
🌍 Multi-language support (easily expandable)
🎨 Fully customizable UI and visuals
2) Basic Configuration
Framework Detection
Config.Framework="auto"
Options:"auto", "esx", "qb"Recommended: Leave as "auto" for automatic detection
Language
Add custom languages in Config.Locales (see Section 11)
Payment Method
Options:"cash" or "bank"Effect: Determines which account is charged for revivals
Revive Radius
Maximum distance in meters for both:
Reviver must be within radius of station
Target (dead player) must be within radius of station
Examples:
3) Doctor Requirement System
How it works:
System counts online players with jobs listed in DoctorJobs
If count < MinimunDoctor, revive station is disabled
Players see error: "Too many doctors online" (counter-intuitive, needs locale fix)
Configuration examples:
No doctor requirement (always available):
Require at least 1 doctor offline:
Require multiple EMS jobs offline:
Best practice explanation: The current logic is inverted - it checks if doctors are below the minimum and allows revives when there are fewer doctors. This is typically used when you want the revive station to be a backup option when no EMS is available.
4) Pricing System
How it works:
Players choose between two revival options
low price = slower revival time
high price = faster revival time
Both options revive the player fully
Pricing strategies:
Budget-friendly server:
Balanced economy:
High-stakes server:
Discourage use (prefer EMS):
5) Revive Time System
Time is in milliseconds
How it works:
low time = longer wait, cheaper price
high time = shorter wait, higher price
Timer shows countdown in UI
Player is revived when timer reaches 0
Time conversion reference:
Configuration examples:
Quick revival (encourage use):
Slow revival (discourage use):
Instant revival (high tier only):
6) Revive Events Configuration
How it works:
When a player is revived, all events in this list are triggered
Ensures compatibility with various ambulance/hospital scripts
Add your server's custom revive events here
Common ambulance script events:
ESX Legacy:
QBCore:
Custom ambulance scripts:
⚠️ IMPORTANT: If your revive events don't work, check your ambulance script documentation for the correct event names.
7) Location System
Each location can be either a marker or NPC:
Location Types
NPC (Recommended):
Spawns a non-playable character
More immersive and visible
Better for ox_target integration
Players interact by pressing E or using ox_target
Marker:
Shows a 3D marker on the ground
Less immersive but uses fewer resources
Good for multiple locations
Players interact by standing in marker and pressing E
✅ Balance pricing with revival time — Faster revival = higher cost
✅ Use doctor requirement strategically — Set to 0 for always-available, or 1+ for backup-only
✅ Place stations strategically — Hospitals, clinics, not random locations
✅ Use NPCs for better visibility — More immersive than markers
✅ Enable webhooks for logging — Track usage patterns and potential abuse
✅ Test with ox_target — Better UX if you use it
✅ Keep revival radius reasonable — 5-10 meters recommended
✅ Add multiple locations — Cover different areas of the map
✅ Customize for your economy — Don't make too cheap or too expensive
✅ Require baseevents — Essential dependency, always ensure it
Config.ReviveRadius = 5.0 -- Close proximity (recommended for tight spaces)
Config.ReviveRadius = 10.0 -- Larger area (recommended for open areas)
Config.ReviveRadius = 15.0 -- Very large (may allow exploits)
Config.ReviveEvents = {
"esx_ambulancejob:revive",
"qb-ambulancejob:revive",
"hospital:client:Revive",
"myambulance:revive", -- Your custom event
"medic_system:client:revive" -- Another custom event
}
Config.Coords = {
{
type = "npc", -- Use NPC
coord = vector3(296.7453, -588.5380, 42.2608),
marker = {
type = 1,
scale = vector3(0.5, 0.5, 0.5),
color = { r = 255, g = 255, b = 255, a = 100 }
},
npc = {
model = "s_m_m_paramedic_01",
heading = 71.1424
}
},
{
type = "marker", -- Use marker instead
coord = vector3(298.2853, -578.0949, 43.1324),
marker = {
type = 21,
scale = vector3(0.5, 0.5, 0.5),
color = { r = 250, g = 273, b = 39, a = 100 }
},
npc = {
model = "s_m_m_paramedic_01", -- Ignored when type = "marker"
heading = 0.0
}
},
}
{
type = "npc",
coord = vector3(x, y, z), -- Get with /getcoords
npc = {
model = "s_m_m_paramedic_01", -- NPC model
heading = 90.0 -- Direction NPC faces
},
marker = { -- Can be left as-is, ignored for NPCs
type = 1,
scale = vector3(0.5, 0.5, 0.5),
color = { r = 255, g = 255, b = 255, a = 100 }
}
}
{
type = "marker",
coord = vector3(x, y, z),
marker = {
type = 21, -- Arrow pointing down
scale = vector3(0.5, 0.5, 0.5),
color = { r = 255, g = 0, b = 0, a = 150 } -- Red
},
npc = { -- Can be left as-is, ignored for markers
model = "s_m_m_paramedic_01",
heading = 0.0
}
}
{
type = "npc",
coord = vector3(296.7453, -588.5380, 42.2608),
npc = {
model = "s_m_m_paramedic_01",
heading = 71.1424
},
marker = { type = 1, scale = vector3(0.5, 0.5, 0.5), color = { r = 255, g = 255, b = 255, a = 100 } }
}
{
type = "npc",
coord = vector3(1839.6, 3672.9, 34.3),
npc = {
model = "s_m_m_paramedic_01",
heading = 210.0
},
marker = { type = 1, scale = vector3(0.5, 0.5, 0.5), color = { r = 255, g = 255, b = 255, a = 100 } }
}
{
type = "npc",
coord = vector3(-254.8, 6331.5, 32.4),
npc = {
model = "s_m_m_paramedic_01",
heading = 45.0
},
marker = { type = 1, scale = vector3(0.5, 0.5, 0.5), color = { r = 255, g = 255, b = 255, a = 100 } }
}
Config.OxTargetIcon = "fa-solid fa-notes-medical" -- Default
Config.OxTargetIcon = "fa-solid fa-heart-pulse" -- Heart with pulse
Config.OxTargetIcon = "fa-solid fa-briefcase-medical" -- Medical briefcase
Config.OxTargetIcon = "fa-solid fa-user-doctor" -- Doctor
Config.OxTargetIcon = "fa-solid fa-suitcase-medical" -- Medical kit
Config.Locales = {} -- Define in locales.lua or config
Config.Language = "en"
Config.Locales["de"] = { -- German example
["open_menu"] = "Drücke E um Wiederbelebungsstation zu öffnen",
["you_are_dead"] = "Du bist tot und kannst dies nicht verwenden",
["no_players"] = "Keine toten Spieler in der Nähe",
["not_enough_money"] = "Du hast nicht genug Geld",
["player_not_dead"] = "Dieser Spieler ist nicht tot",
["so_many_doctors"] = "Zu viele Ärzte im Dienst",
["revive_success"] = "{name} wurde erfolgreich wiederbelebt",
["you_have_been_revived"] = "Du wurdest von {name} wiederbelebt",
["not_in_radius"] = "Du bist nicht in Reichweite der Station",
["web"] = {
title = "WIEDERBELEBUNGSSTATION",
subtitle = "Wähle einen Patienten aus, um ihn wiederzubeleben",
select_player = "Spieler auswählen",
select_option = "Option wählen",
low_cost = "Günstig",
high_cost = "Teuer",
revive = "Wiederbeleben",
time = "Zeit: {time}s",
price = "Preis: ${price}",
your_money = "Dein Geld: ${money}",
no_dead_players = "Keine toten Spieler in der Nähe"
}
}
Config.Locales["es"] = {
["open_menu"] = "Presiona E para abrir estación de reanimación",
["you_are_dead"] = "Estás muerto y no puedes usar esto",
["no_players"] = "No hay jugadores muertos cerca",
["not_enough_money"] = "No tienes suficiente dinero",
["player_not_dead"] = "Este jugador no está muerto",
["so_many_doctors"] = "Demasiados médicos en servicio",
["revive_success"] = "{name} fue reanimado exitosamente",
["you_have_been_revived"] = "Fuiste reanimado por {name}",
["not_in_radius"] = "No estás en el radio de la estación",
["web"] = {
title = "ESTACIÓN DE REANIMACIÓN",
subtitle = "Selecciona un paciente para reanimar",
select_player = "Seleccionar jugador",
select_option = "Seleccionar opción",
low_cost = "Económico",
high_cost = "Caro",
revive = "Reanimar",
time = "Tiempo: {time}s",
price = "Precio: ${price}",
your_money = "Tu dinero: ${money}",
no_dead_players = "No hay jugadores muertos cerca"
}
}
Config.Locales["fr"] = {
["open_menu"] = "Appuyez sur E pour ouvrir la station de réanimation",
["you_are_dead"] = "Vous êtes mort et ne pouvez pas utiliser ceci",
["no_players"] = "Aucun joueur mort à proximité",
["not_enough_money"] = "Vous n'avez pas assez d'argent",
["player_not_dead"] = "Ce joueur n'est pas mort",
["so_many_doctors"] = "Trop de médecins en service",
["revive_success"] = "{name} a été réanimé avec succès",
["you_have_been_revived"] = "Vous avez été réanimé par {name}",
["not_in_radius"] = "Vous n'êtes pas à portée de la station",
["web"] = {
title = "STATION DE RÉANIMATION",
subtitle = "Sélectionnez un patient à réanimer",
select_player = "Sélectionner le joueur",
select_option = "Sélectionner l'option",
low_cost = "Économique",
high_cost = "Cher",
revive = "Réanimer",
time = "Temps: {time}s",
price = "Prix: ${price}",
your_money = "Votre argent: ${money}",
no_dead_players = "Aucun joueur mort à proximité"
}
}
color = 16777045, -- Gold/yellow (default)
color = 16711680, -- Red
color = 65280, -- Green
color = 255, -- Blue
color = 16776960, -- Yellow
color = 16753920, -- Orange