mri-QboxResourcesARS Ambulancejob

ars_ambulancejob — Manual

Emprego de paramédico com sistema de morte, ferimentos por parte do corpo, macas, chamados de emergência e log de mortes no Discord.


Sumário

  1. Dependências
  2. Instalação
  3. Itens
  4. Configuração
  5. Hospitais
  6. Sistema de ferimentos
  7. Paramédico NPC
  8. Editor de hospitais
  9. Deathlog no Discord
  10. Comandos
  11. Integrações
  12. Entrypoints para outros recursos
  13. Localização
  14. Estrutura de arquivos

Dependências

RecursoObrigatórioObservação
ox_libSimZonas, callbacks, comandos, progress bar, locale, lib.load do config
oxmysqlSimCarregado no server_scripts
qb-core ou es_extendedSimO framework é detectado em runtime. Sem um dos dois, a camada Framework não é criada
ox_inventoryNãoDetectado automaticamente (Config.useOxInventory). Habilita durabilidade dos itens, stash da bolsa médica e as lojas das farmácias
ox_target ou qb-targetNãoInterações com pacientes, macas, bolsa médica e o uso da adrenalina
illenium-appearanceNãoVestiário do hospital. Ver Config.clothingScript
mri_QcarkeysNãoEntrega e remoção das chaves da ambulância. Ver Config.giveVehicleKeys
qbx_managementNãoMenu do patrão (bossmenu)
pma-voiceNãoCorta o mumble do jogador morto quando Config.mumbleDisable = true
monitor (txAdmin)NãoReage ao evento txAdmin:events:healedPlayer

O fluxo da adrenalina no client.lua chama ox_target e ox_inventory diretamente, sem checar o estado do recurso — se o seu servidor não usa esses dois, remova aquele bloco.


Instalação

  1. Copie a pasta ars_ambulancejob para resources/.
  2. Adicione ao server.cfg:
    ensure ars_ambulancejob
  3. Cadastre os itens de !INSTALLATION/items.lua no seu inventário e copie as imagens de !INSTALLATION/images/ para a pasta de ícones do inventário.
  4. Cadastre o job de paramédico no framework com um dos nomes de Config.emsJobs (padrão: ambulance e ems).
  5. Configure o webhook do deathlog em Config.Discord.Settings.Webhook (ver Deathlog no Discord).
  6. Conflitos — o recurso substitui o sistema de morte e revive do framework. Ele escuta hospital:client:Revive e qbx_medical:client:playerRevived para se manter em sincronia, mas não deve rodar junto com outro ambulance job (qb-ambulancejob, ou o qbx_medical atuando como sistema de morte).

Não há SQL a importar.


Itens

Os itens já vêm prontos em !INSTALLATION/items.lua.

ItemUso
bandageCura básica. Recupera 1/16 da vida máxima
analgesicRecupera 1/20 da vida máxima
medicalbagColoca a bolsa médica no chão. Com ox_inventory, vira um stash de 10 slots e 50 kg
defibrillatorReanimação feita pelo paramédico
adrenalineReanima um jogador caído pelo ox_target, sem exigir o job
tweezersTrata ferimento de corte ou perfuração
suturekitTrata ferimento de tiro
burncreamTrata queimadura
icepackTrata contusão
stretcherMaca
emstabletTablet do EMS: abre a lista de chamados de emergência

Com ox_inventory, cada uso de um item de tratamento consome Config.consumeItemPerUse por cento da durabilidade, em vez de gastar o item inteiro.


Configuração

Todas as opções ficam em config.lua.

CampoTipoObrigatórioDescrição
Config.debugboolSimDesenha as zonas dos hospitais e imprime logs de diagnóstico
Config.useOxInventoryboolSimPreenchido automaticamente pelo estado do recurso ox_inventory. Não edite
Config.clothingScriptstring | falseSimillenium-appearance, fivem-appearance, core, ou false para desativar o vestiário
Config.emsJobsstring[]SimJobs que contam como paramédico. Padrão: {"ambulance", "ems"}
Config.respawnTimenumberSimMinutos até o jogador poder dar respawn sozinho. Padrão: 5
Config.waitTimeForNewCallnumberSimMinutos de cooldown entre dois chamados do mesmo jogador. Padrão: 5
Config.reviveCommandstringSimNome do comando de reviver. Padrão: revive
Config.reviveAreaCommandstringSimNome do comando de reviver em área. Padrão: revivearea
Config.healCommandstringSimNome do comando de curar. Padrão: heal
Config.healAreaCommandstringSimNome do comando de curar em área. Padrão: healarea
Config.reviveAllCommandstringSimNome do comando de reviver todos. Padrão: reviveall
Config.adminGroupstring[]SimGrupos com acesso aos comandos administrativos e ao editor. Padrão: {"admin", "mod", "support"}
Config.mumbleDisableboolSimDesativa o mumble do jogador enquanto ele estiver morto
Config.healthRegenboolSimQuando true, zera a regeneração automática de vida do GTA
Config.medicBagPropstringSimProp da bolsa médica. Padrão: xm_prop_x17_bag_med_01a
Config.medicBagItemstringSimItem da bolsa médica. Padrão: medicalbag
Config.tabletItemstringSimItem do tablet do EMS. Padrão: emstablet
Config.helpCommandstringSimComando do chamado de emergência. Padrão: 911
Config.disableEMSCallsboolSimDesativa os chamados de emergência
Config.removeItemsOnRespawnboolSimLimpa o inventário do jogador ao dar respawn
Config.disableRespawnAnimationboolSimDesativa a animação de levantar no respawn
Config.keepItemsOnRespawnstring[]SimItens preservados quando removeItemsOnRespawn está ligado. Ex.: { "money", "WEAPON_PISTOL" }
Config.baseInjuryRewardnumberSimPagamento ao paramédico por ferimento tratado. Padrão: 150
Config.reviveRewardnumberSimPagamento ao paramédico por reanimação. Padrão: 700
Config.paramedicTreatmentPricenumberSimPreço cobrado do jogador pelo tratamento com o NPC. Padrão: 4000
Config.allowAlwaysboolSimtrue permite o tratamento pelo NPC mesmo com médicos online
Config.ambulanceStretchersnumberSimMacas disponíveis por ambulância. Padrão: 2
Config.consumeItemPerUsenumberSimPorcentagem de durabilidade consumida por uso (só com ox_inventory). Padrão: 10
Config.npcReviveCommandstringSimComando de socorro pelo NPC. Padrão: socorro
Config.timeToWaitForCommandnumberSimMinutos que o jogador espera, após morrer, para usar o comando de socorro. Padrão: 2
Config.minimumOnServiceForNPCnumberSimAcima desse número de médicos online, o comando de socorro é bloqueado. Padrão: 3
Config.usePedToDepositVehicleboolSimfalse faz o veículo sumir na hora, sem ped de devolução
Config.extraEffectsboolSimTremor de tela e efeito preto e branco ao morrer
Config.ejectDeadFromVehicleboolSimEjeta o jogador morto do veículo em que estiver
Config.emsVehiclestabelaSimModelos com acesso aos props do EMS (cones etc.). Padrão: ambulance, ambulance2
Config.animationstabelaSimdict e clip de death_car, death_normal e get_up
Config.Discord.SettingstabelaNãoWebhook, Name e Images do deathlog

Funções de ponte

O config.lua termina com três funções que você adapta aos recursos do seu servidor.

FunçãoDescrição
Config.sendDistressCall(msg)Encaminha o chamado de emergência para um telefone (Quasar, GKS…). Vem vazia, com exemplos comentados
Config.giveVehicleKeys(vehicle, plate)Entrega a chave da ambulância. Já ligada a exports.mri_Qcarkeys:GiveKeyItem
Config.removeVehicleKeys(vehicle, plate)Remove a chave. Já ligada a exports.mri_Qcarkeys:RemoveKeyItem

Hospitais

Os hospitais ficam em data/hospitals.lua. Cada chave da tabela é um hospital — pillbox é o único que vem configurado.

BlocoDescrição
paramedicmodel do ped e a lista pos de vec4 onde ele aparece
bossmenupos e min_grade do menu do patrão
zonepos e size da caixa que carrega os peds, a garagem e o vestiário
blipenable, name, type, scale, color e pos do blip
respawnLista de leitos. Cada um tem bedPoint, spawnPoint e, opcionalmente, isDeadRespawn (leito usado quando o jogador morre)
pharmacyLojas. Cada uma tem job (restrita ao EMS), grade, label, pos, blip e a lista items (name, label, icon, price)
garageGaragem do EMS: pedPos, model, spawn, deposit, driverSpawnCoords e a lista vehicles (label, spawn_code, min_grade, modifications). Vem comentada no pillbox
clothesVestiário: enable, pos, model do ped e os conjuntos de roupa por gênero e grade

Com ox_inventory, as farmácias viram lojas de verdade (RegisterShop) no start do recurso, usando a chave da farmácia (ex.: ems_shop_1) como id da loja.


Sistema de ferimentos

Quando o jogador leva dano, o osso atingido e a causa viram um ferimento. Os ossos ficam em data/body_parts.lua (indexados pelo id do osso do GTA) e as armas em data/weapons.lua, que mapeia cada WEAPON_* para uma mensagem de morte e uma causa (shot, stabbed, beaten…).

O item necessário para tratar depende da causa:

CausaItem
Tirosuturekit
Corte ou perfuraçãotweezers
Queimaduraburncream
Contusãoicepack
Demais casosbandage

Cada osso pode ter vários levels de gravidade: o texto exibido muda conforme o dano acumulado (default, 10, 20, 30, 40).

O paramédico recebe Config.baseInjuryReward por ferimento tratado e Config.reviveReward por reanimação.


Paramédico NPC

Serve para o jogador não ficar preso quando não há paramédicos suficientes online.

  • O ped fica nas coordenadas de paramedic.pos do hospital e trata quem chegar, cobrando Config.paramedicTreatmentPrice.
  • Por padrão o tratamento só é oferecido quando não há médicos online. Config.allowAlways = true libera sempre.
  • O comando /socorro (Config.npcReviveCommand) socorre o jogador caído. Ele só funciona quando os médicos online forem no máximo Config.minimumOnServiceForNPC, e o jogador precisa ter morrido há pelo menos Config.timeToWaitForCommand minutos.

Editor de hospitais

O comando /hospitaleditor (restrito a Config.adminGroup) abre um editor em jogo para ajustar as coordenadas e os blocos do hospital, e grava o resultado direto no data/hospitals.lua.

O arquivo é reescrito no disco, então as mudanças sobrevivem a restarts — mas a formatação e os comentários do arquivo original são perdidos na regravação.


Deathlog no Discord

Toda morte vira um embed enviado ao webhook, com o nome da vítima, os ids de Discord da vítima e do assassino (quando houver), a arma usada e o local.

Config.Discord = {
    Settings = {
        Webhook = 'https://discord.com/api/webhooks/...',   -- cole aqui o webhook do seu servidor
        Name = 'MRI QBOX - Deathlog',
        Images = 'https://i.imgur.com/QjLjjYZ.png'
    },
}

O config.lua versionado já traz um webhook preenchido. Troque pelo do seu servidor — quem tiver essa URL consegue postar no canal.


Comandos

ComandoPermissãoDescrição
/revive [id]Config.adminGroupRevive o jogador informado. Sem argumento, revive quem executou
/revivearea [raio]Config.adminGroupRevive todos os jogadores dentro do raio. Não funciona pelo console
/heal [id]Config.adminGroupCura o jogador informado. Sem argumento, cura quem executou
/healarea [raio]Config.adminGroupCura todos os jogadores dentro do raio. Não funciona pelo console
/reviveallConfig.adminGroupRevive todos os jogadores do servidor
/hospitaleditorConfig.adminGroupAbre o editor de hospitais
/911 [mensagem]TodosAbre um chamado de emergência para os paramédicos
/socorroTodosPede resgate ao paramédico NPC. Só funciona com poucos médicos online

Os nomes dos seis primeiros comandos vêm do config.lua e podem ser trocados. Os comandos restritos usam lib.addCommand com restricted, ou seja, a permissão é resolvida pelo ACE do ox_lib (add_ace group.admin ...).


Integrações

ox_inventory

Detectado automaticamente. Quando está presente: os itens de tratamento passam a gastar durabilidade em vez de serem consumidos por inteiro; a bolsa médica vira um stash (medicalBag_<license>), com um hook que impede guardar a própria bolsa dentro dela; e as farmácias de data/hospitals.lua são registradas como lojas do ox_inventory.

ox_target / qb-target

O primeiro que estiver iniciado é usado. Cobre as interações com pacientes, macas, bolsa médica e o NPC. A opção “Usar Adrenalina” é registrada como addGlobalPlayer do ox_target e aparece em qualquer jogador caído, desde que você tenha o item adrenaline — ela não exige o job de paramédico.

illenium-appearance

Define de onde vem o vestiário do hospital, via Config.clothingScript. O campo aceita também fivem-appearance e core (vestiário nativo do framework), ou false para desativar.

mri_Qcarkeys

Config.giveVehicleKeys e Config.removeVehicleKeys já vêm ligadas ao mri_Qcarkeys. Ao tirar a ambulância da garagem a chave é entregue; ao devolvê-la, é removida.

qbx_management

Usado no menu do patrão, acessível na coordenada bossmenu.pos do hospital por quem tem grade maior ou igual a min_grade.

txAdmin

O recurso escuta txAdmin:events:healedPlayer. Curar um jogador (ou todos) pelo painel do txAdmin revive quem estiver morto e cura quem estiver vivo.

pma-voice

Com Config.mumbleDisable = true, o jogador morto perde a voz até ser reanimado.


Entrypoints para outros recursos

Exports de cliente

-- O jogador local está morto?
local dead = exports.ars_ambulancejob:isDead()
 
-- Abre o chamado de emergência (mesmo fluxo do /911)
exports.ars_ambulancejob:createDistressCall()
 
-- Abre a lista de chamados (é o que o emstablet usa)
exports.ars_ambulancejob:openDistressCalls()
 
-- Registra manualmente uma morte no deathlog
exports.ars_ambulancejob:DeathLog()

Os exports bandage e analgesic existem para serem apontados como client.export na definição dos itens do ox_inventory; não são feitos para chamada direta por outros recursos.

Callbacks de servidor

-- Estado de morte de um jogador
local status = lib.callback.await('ars_ambulancejob:getDeathStatus', false, targetServerId)
 
-- Ferimentos, estado e o que causou a morte
local data = lib.callback.await('ars_ambulancejob:getData', false, targetServerId)
 
-- Chamados de emergência abertos
local calls = lib.callback.await('ars_ambulancejob:getDistressCalls', false)
 
-- Quantidade de paramédicos online
local medics = lib.callback.await('ars_ambulancejob:getMedicsOnline', false)

Eventos

-- Revive ou cura um jogador. É o que os comandos e o txAdmin disparam.
TriggerClientEvent('ars_ambulancejob:healPlayer', targetServerId, { revive = true })
TriggerClientEvent('ars_ambulancejob:healPlayer', targetServerId, { heal = true })
 
-- Abre a lista de chamados no cliente
TriggerClientEvent('ars_ambulancejob:openDistressCalls', source)
 
-- Notificação no padrão do recurso
TriggerClientEvent('ars_ambulancejob:showNotification', source, 'mensagem')
 
-- Coloca a bolsa médica no chão
TriggerClientEvent('ars_ambulancejob:placeMedicalBag', source)

O estado do jogador também fica exposto nos statebags: Player(serverId).state.dead e Player(serverId).state.injuries.


Localização

As strings vêm do locale do ox_lib (ox_libs { 'locale' }). Os arquivos ficam em locales/:

  • de.json — alemão
  • en.json — inglês
  • fr.json — francês
  • gr.json — grego
  • it.json — italiano
  • pt-br.json — português do Brasil
  • sv.json — sueco

O locale ativo é definido pela convar no server.cfg:

setr ox:locale "pt-br"

Parte dos textos do fluxo da adrenalina (client.lua) e do editor de hospitais está escrita em português direto no código, fora do sistema de locale.


Estrutura de arquivos

ars_ambulancejob/
├── client.lua                        — zonas dos hospitais, itens bandage/analgesic, adrenalina via ox_target
├── server.lua                        — estado de morte, chamados, itens, stash da bolsa, lojas das farmácias
├── config.lua                        — todas as opções e as funções de ponte (chaves, telefone)
├── data/
│   ├── hospitals.lua                 — hospitais: zona, blip, leitos, farmácias, garagem, vestiário, NPC
│   ├── body_parts.lua                — ossos do GTA, rótulo e gravidade de cada ferimento
│   └── weapons.lua                   — mapa de arma para mensagem de morte e causa do ferimento
├── modules/
│   ├── commands/server.lua           — /revive, /revivearea, /heal, /healarea, /reviveall
│   ├── compatibility/
│   │   ├── frameworks/qb/            — camada Framework para qb-core
│   │   ├── frameworks/esx/           — camada Framework para es_extended
│   │   ├── target/ox_target.lua      — camada Target para ox_target
│   │   ├── target/qb-target.lua      — camada Target para qb-target
│   │   └── txadmin/server.lua        — reage ao txAdmin:events:healedPlayer
│   ├── death/client.lua              — morte, respawn, efeitos de tela, export isDead
│   ├── injuries/client.lua           — ferimentos por osso e tratamento com item
│   ├── stretcher/client.lua          — macas e transporte do paciente na ambulância
│   ├── paramedic/client.lua          — NPC de tratamento e comando /socorro
│   ├── survival/client.lua           — desliga a regeneração automática de vida
│   ├── deathlog/                     — captura da morte (client) e envio do embed pro Discord (server)
│   ├── hospital_editor/              — editor em jogo, grava data/hospitals.lua no disco
│   ├── job/client/
│   │   ├── main.lua                  — chamados de emergência, tratamento e recompensas
│   │   ├── garage.lua                — garagem do EMS e chaves da ambulância
│   │   ├── medical_bag.lua           — bolsa médica no chão e stash
│   │   ├── shops.lua                 — farmácias
│   │   ├── clothing.lua              — vestiário
│   │   └── bossmenu.lua              — menu do patrão
│   └── utils/client/                 — notificações, blips, helpers de item e debug de coordenadas
├── locales/                          — de, en, fr, gr, it, pt-br, sv
├── stream/prop_ld_binbag_01.ydr      — prop customizado
├── !INSTALLATION/
│   ├── items.lua                     — itens prontos para colar no inventário
│   └── images/                       — ícones dos itens
└── fxmanifest.lua