ai-death для разработчиков
Реанимация, лечение и состояние без сознания через медицинский слой AI Core, серверные экспорты ai-death, state bag dead и событие реанимации QB.
Чтобы реанимировать, вылечить или проверить лежащего без сознания игрока из своего скрипта, используйте medical из lib (TypeScript) или экспорты ai-core RevivePlayer / HealPlayer / IsPlayerDead (Lua). Они идут через медицинский слой AI Core и работают с любым запущенным скриптом смерти (ai-death, qbx_medical, qb-ambulancejob, esx_ambulancejob, wasabi_ambulance...). Экспорты ai-death ниже являются тем, что вызывает этот слой, пока запущен ai-death.
Функции lib (рекомендуется)
medical.revive
Поднимает лежащего без сознания игрока там, где он лежит.
Сторона: сервер · Ожидание: нет
medical.revive(source: number): booleanlocal ok = exports['ai-core']:RevivePlayer(source)В Lua нет aiLib.medical: вызывайте экспорт ai-core, как выше.
Параметры
Prop
Type
Возвращает
true, если игрок лежал без сознания и теперь поднялся. false, если он не был без сознания или ни один скрипт смерти не запущен.
Пример
import { addCommand, medical, notify } from "@aicore-fivem/lib/server";
// /revive <id> для администраторов ai-core.
addCommand(
"revive",
{ help: "Revive a player", restricted: true, params: [{ name: "id", type: "playerId" }] as const },
(source, { id }) => {
if (!medical.revive(id) && source > 0) notify(source, "That player is not down", "error");
},
);medical.heal
Полное здоровье для игрока, который не лежит без сознания.
Сторона: сервер · Ожидание: нет
medical.heal(source: number): booleanlocal ok = exports['ai-core']:HealPlayer(source)Возвращает
true, если скрипт смерти принял вызов. false, если ни один скрипт смерти не запущен.
С ai-death лечение лежащего без сознания игрока поднимает педа, но сохраняет состояние без сознания. Проверьте medical.isDead(source) и сначала вызовите medical.revive.
medical.isDead
Лежит ли игрок без сознания.
Сторона: сервер · Ожидание: нет
medical.isDead(source: number): booleanlocal down = exports['ai-core']:IsPlayerDead(source)Возвращает
true, пока игрок без сознания. false, если он на ногах или ни один скрипт смерти не запущен.
medical.provider
Скрипт смерти, который использует медицинский слой.
Сторона: сервер · Ожидание: нет
medical.provider(): string | nulllocal name = exports['ai-core']:GetMedicalSystem() -- 'ai-death', 'qbx_medical'... или nilВозвращает
Имя ресурса или null / nil, если ни один поддерживаемый скрипт смерти не запущен.
medical.isDead (client)
Состояние без сознания локального игрока на клиенте, какой бы скрипт смерти ни был запущен. Скрипты смерти держат лежащего педа живым, чтобы анимировать его, поэтому одного IsEntityDead недостаточно.
Сторона: клиент · Ожидание: нет
medical.isDead(): boolean
medical.onChange(fn: (dead: boolean) => void): voidlocal down = exports['ai-core']:IsDead()Пример
import { medical, notify } from "@aicore-fivem/lib/client";
RegisterCommand("emote", () => {
if (medical.isDead()) return notify("Not while down", "error");
// ... проиграть эмоцию
}, false);
medical.onChange((dead) => {
if (dead) SendNUIMessage({ action: "close" }); // закрыть ваш экран, когда игрок теряет сознание
});Серверные экспорты
Медицинский слой вызывает их, пока запущен ai-death. Типизированы как AiDeathServerExports в @aicore-fivem/shared, поэтому resourceExport("ai-death") их знает. Revive и IsDead также отвечают как exports.qbx_medical:Revive / IsDead. Каждый экспорт также отвечает под своим двойником в нижнем регистре (revive).
Revive
Revive(source: number): booleanlocal ok = exports['ai-death']:Revive(source)Поднимает лежащего без сознания игрока там, где он лежит. true, если он был без сознания, иначе false.
IsDead
IsDead(source: number): booleanlocal down = exports['ai-death']:IsDead(source)true, пока игрок без сознания.
Heal
Heal(source: number): voidexports['ai-death']:Heal(source)Полное здоровье для игрока, который не лежит без сознания. Ничего не возвращает. Лежащего без сознания игрока поднимает, но состояние без сознания остаётся: сначала вызовите Revive.
State bag dead
true в state bag игрока, пока ai-death держит его без сознания; пишет его сервер. Ключ PLAYER_BAGS.dead в @aicore-fivem/shared.
local down = Player(source).state.dead == true -- сервер
local down = LocalPlayer.state.dead == true -- клиент, локальный игрокimport { PlayerState, stateBoolean } from "@aicore-fivem/lib/server";
import { PLAYER_BAGS } from "@aicore-fivem/shared";
const dead = new PlayerState(PLAYER_BAGS.dead, stateBoolean);
const down = dead.get(source) === true;Читайте его, только если знаете, что запущен ai-death; medical.isDead работает с любым скриптом смерти.
Метаданные персонажа isdead
true, пока игрок без сознания, хранится в персонаже (ключ QBCore), поэтому игрок, который переподключился без сознания, возвращается без сознания. Не пишите в него: ai-death выставляет его, когда игрок теряет сознание, и очищает, когда тот поднимается.
Клиентское событие hospital:client:Revive
Событие реанимации QBCore. Когда сервер отправляет его игроку, ai-death реанимирует его там, где он стоит (его используют скрипты QB и админ-меню).
Сторона: сервер -> клиент · Аргументы: нет
emitNet("hospital:client:Revive", target);Это событие не очищает состояние без сознания на сервере так, как это делает medical.revive. В новом коде используйте medical.revive(source).
Приватные события и колбэки
Собственный контракт скрипта (resource/common/death.ts). Они могут меняться между версиями: не вызывайте и не слушайте их из других ресурсов.
| Имя | Направление | Что передаёт |
|---|---|---|
ai-death:client:down | server -> player | (seconds, medics, callSeconds): игрок без сознания; возрождение открывается через seconds, medics свободны сейчас, врача можно вызвать снова через callSeconds. |
ai-death:client:revive | server -> player | (point | null): снова на ногах в больнице или там, где лежал. |
ai-death:respawn | client callback | (): возродиться в ближайшей больнице после таймера (оплачивает сбор). |
ai-death:treat | client callback | (hospitalId): платное лечение в точке регистрации. |
ai-death:distress | client callback | (): вызвать врача; отвечает { ok, seconds }. |