Cómo funcionan las integraciones#
Biohazard Creator es independiente: nada en su interior depende de un framework. Todo lo que toca otro recurso está en dos archivos abiertos, client/custom.lua y server/custom.lua, que nunca están cifrados. Edítalos libremente y guarda una copia antes de actualizar.
Qué | Por defecto | Dónde cambiarlo |
|---|---|---|
Notificaciones | qs-interface cuando está en ejecución; si no, el feed de GTA. |
|
Ropa tras el modelo de zombi | El evento de recarga de qs-appearance. |
|
¿Está muerto el jugador? | El state bag |
|
Revivir a un jugador zombi abatido | El evento de cliente | Un puente en client/custom.lua — ver abajo |
Identificador del jugador | La licencia de Rockstar. |
|
Nombre en la clasificación | El nombre de jugador de FiveM. |
|
Recompensas de supervivientes | Solo se imprimen en la consola. |
|
La progresión se guarda por identificador. Cambiar
GetIdentifieren un servidor en producción hace que el nivel de todos empiece desde cero con la nueva clave, así que decídelo antes de que los jugadores acumulen XP.
Identificadores y nombres#
Por defecto, la progresión se guarda por licencia de Rockstar y la clasificación muestra el nombre de FiveM. Para guardarla por personaje y mostrar el nombre del personaje, reemplaza las dos funciones de server/custom.lua por la versión de tu framework:
local ESX = exports['es_extended']:getSharedObject()
function GetIdentifier(source)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer then return xPlayer.identifier end
return ('src:%s'):format(source)
end
function GetDisplayName(source)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer then
return ('%s %s'):format(xPlayer.get('firstName') or '', xPlayer.get('lastName') or '')
end
return GetPlayerName(source)
endlocal QBCore = exports['qb-core']:GetCoreObject()
function GetIdentifier(source)
local Player = QBCore.Functions.GetPlayer(source)
if Player then return Player.PlayerData.citizenid end
return ('src:%s'):format(source)
end
function GetDisplayName(source)
local Player = QBCore.Functions.GetPlayer(source)
if Player then
local c = Player.PlayerData.charinfo
return ('%s %s'):format(c.firstname, c.lastname)
end
return GetPlayerName(source)
endfunction GetIdentifier(source)
local Player = exports.qbx_core:GetPlayer(source)
if Player then return Player.PlayerData.citizenid end
return ('src:%s'):format(source)
end
function GetDisplayName(source)
local Player = exports.qbx_core:GetPlayer(source)
if Player then
local c = Player.PlayerData.charinfo
return ('%s %s'):format(c.firstname, c.lastname)
end
return GetPlayerName(source)
endRecompensas de supervivientes#
GiveReward se ejecuta una vez por cada jugador que termina un brote como humano, con la sección Rewards de ese evento: { enable, money, item, itemCount }. La versión incluida solo imprime [Biohazard] Survivor reward for 12 -> money: 5000, item: medikit x1 en la consola. Reemplázala por la de tu servidor:
local ESX = exports['es_extended']:getSharedObject()
function GiveReward(source, rewards)
if not rewards or not rewards.enable then return end
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return end
if rewards.money > 0 then xPlayer.addMoney(rewards.money) end
if rewards.item ~= '' then xPlayer.addInventoryItem(rewards.item, rewards.itemCount) end
endlocal QBCore = exports['qb-core']:GetCoreObject()
function GiveReward(source, rewards)
if not rewards or not rewards.enable then return end
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
if rewards.money > 0 then Player.Functions.AddMoney('cash', rewards.money) end
if rewards.item ~= '' then Player.Functions.AddItem(rewards.item, rewards.itemCount) end
endfunction GiveReward(source, rewards)
if not rewards or not rewards.enable then return end
local Player = exports.qbx_core:GetPlayer(source)
if not Player then return end
if rewards.money > 0 then Player.Functions.AddMoney('cash', rewards.money) end
if rewards.item ~= '' then exports.ox_inventory:AddItem(source, rewards.item, rewards.itemCount) end
endfunction GiveReward(source, rewards)
if not rewards or not rewards.enable or rewards.item == '' then return end
exports.ox_inventory:AddItem(source, rewards.item, rewards.itemCount)
-- exports['qs-inventory']:AddItem(source, rewards.item, rewards.itemCount)
endNotificaciones y chat#
Los mensajes como You turned into a zombie! Infect someone to survive. pasan por Notify en client/custom.lua: qs-interface cuando está en ejecución, el feed de GTA cuando no lo está. Mientras el creador está abierto, aparecen como toasts dentro de él. Para otro recurso de notificaciones, reemplaza la función:
-- client/custom.lua
function Notify(msg)
exports['okokNotify']:Alert('Biohazard', msg, 3500, 'info')
endCon el recurso chat en ejecución, cada brote se anuncia en el chat (Config.AutoStart.AnnounceInChat) y /biohazardcreator aparece en las sugerencias de comandos.
Ropa y reanimaciones#
Ropa#
Los jugadores infectados llevan el modelo de zombi. Cuando vuelven a ser humanos, o el brote termina, ReloadSkin les devuelve su propia ropa. Llama a qs-appearance; para otro script de ropa, cambia la línea:
-- client/custom.lua
function ReloadSkin()
TriggerEvent('qs-appearance:client:reloadSkin', true)
-- TriggerEvent('illenium-appearance:client:reloadSkin')
endReanimaciones#
Un jugador zombi abatido se revive con el evento de cliente ambulance:revivePlayer. Si tu script de ambulancia revive con otro evento, crea un puente al final de client/custom.lua:
AddEventHandler('ambulance:revivePlayer', function()
TriggerEvent('esx_ambulancejob:revive') -- esx_ambulancejob
-- TriggerEvent('hospital:client:Revive') -- qb-ambulancejob
end)Si tu sistema de muerte marca a los jugadores muertos con un estado distinto de LocalPlayer.state.isDead, ajusta IsAlive en el mismo archivo para que la horda deje de atacar a los jugadores caídos.
La app del teléfono#

phone-biohazard es una app complementaria para Quasar Smartphone. Inícialo y Biohazard Creator lo detecta por sí solo — no hay nada que activar, y se detecta incluso si arranca después del script del brote.
En la app | Qué muestra |
|---|---|
Live outbreak | El evento en curso, su cuenta atrás, los participantes, la zona, el clima y la hora, las reglas de la horda y de infección, y la clasificación de bajas en vivo. |
Outbreak types | Tus presets guardados, de solo lectura, con el que está en curso marcado — y cuándo puede llegar el próximo Auto Start. |
Profile | Nivel, rango, progreso de XP, bajas, infecciones, partidas, victorias, derrotas, mejor número de bajas, MVPs, porcentaje de victorias y posición en la clasificación. Se actualiza en el momento en que termina un brote, con la XP recién ganada. |
Leaderboard | Los mejores jugadores del servidor, ordenados por nivel, bajas, victorias, partidas o MVPs, con tu propia fila resaltada. |
Notificación | Un aviso push a todos los teléfonos cuando empieza un brote. |
Config.Phone = {
Enabled = DependencyCheck({ ['phone-biohazard'] = true }), -- automatic
BroadcastMs = 2000, -- how often the live outbreak is refreshed
LeaderboardMax = 50, -- rows in the leaderboard
ExposePresets = true, -- list your presets as outbreak types
NotifyOnStart = true -- phone notification when an outbreak starts
}Idiomas#
Se incluyen dos idiomas en locales/: inglés (en) y español (es). Elige uno con Config.Language.
Para añadir otro, copia en.json a locales/<key>.json, traduce los valores y establece Config.Language con esa clave. Cualquier línea que falte en tu archivo usa el inglés, así que una traducción parcial nunca rompe nada. El bloque _ui contiene las etiquetas del creador y del marcador; los códigos como ~o~ son colores de texto de GTA.
{
"notify_event_start": "The Biohazard night has begun!",
"hud_time": "~o~BIOHAZARD EVENT~s~ | Time:",
"_ui": {
"creator_title": "Biohazard Event Creator",
"sb_title": "BIOHAZARD"
}
}


