Команды
addCommand: команды чата с разобранными аргументами, правами ACE, подсказками в чате и строкой в админ-панели ai-core.
import { addCommand } from "@aicore-fivem/lib/server";addCommand
Регистрирует команду чата (и консольную команду). Аргументы разбираются и проверяются до запуска вашего обработчика, права проверяются через ACE, подсказки в чате получают только игроки, которым разрешено пользоваться командой, а админ-панель ai-core показывает её на вкладке Commands (Команды). Используйте для каждой серверной команды вместо голого RegisterCommand.
Сторона: Сервер · Ждёт: нет
addCommand<P extends readonly CommandParam[]>(
name: string | string[],
options: CommandOptions<P>,
handler: (source: number, args: CommandArgs<P>, raw: string) => unknown,
): voidaiLib.addCommand(name, options, handler) -- handler(source, args, raw)Параметры
Prop
Type
CommandOptions
Prop
Type
CommandParam
Prop
Type
Что видит игрок при неверном вводе
До запуска обработчика lib отвечает уведомлением ai-core (или строкой в консоли для source 0) с текстами ai-core:
| Случай | Текст (на английском) |
|---|---|
| Нет прав | You are not allowed to use this command. (Вам не разрешено использовать эту команду.) |
| Отсутствует обязательный аргумент | <name> is missing. (<name> отсутствует.) |
number / playerId не является числом | <name> must be a number. (<name> должен быть числом.) |
playerId не является игроком онлайн | No player is online with id <value>. (Нет игрока онлайн с id <value>.) |
| После любой ошибки аргумента | Usage: /name <required> [optional] (Использование) |
Возвращает
void. В TypeScript выбрасывает ошибку, если name является пустым списком.
Пример
import { addCommand, medical, notify, createLocale } from "@aicore-fivem/lib/server";
const Locale = createLocale();
addCommand(
["heal", "h"],
{
help: Locale("CMD_HEAL"),
params: [{ name: "id", type: "playerId", help: Locale("CMD_P_ID"), optional: true }],
restricted: true,
},
(source, args) => {
const target = args.id ?? source; // args.id имеет тип number | undefined
if (target === 0) return; // консоль должна указать игрока
if (medical.heal(target) && source > 0) notify(source, Locale("HEALED"), "success");
},
);
addCommand(
"announce",
{
help: "Sends a message to everyone",
params: [{ name: "text", type: "longString" }],
restricted: ["group.admin", "ai.admin"],
},
(_source, { text }) => {
for (const player of getPlayers()) notify(Number(player), text, "info", 8000);
},
);Никогда не проверяйте права вручную внутри обработчика: это делает restricted, и подсказки чата следуют ему. Для списка principal ai-core выдаёт command.<name> каждому из них, для чего нужны add_ace resource.ai-core command.add_ace allow и add_ace resource.ai-core command.remove_ace allow в permission.cfg. Ранги работ и банд являются principal (ai.job.police), поэтому подсказки обновляются, когда меняется работа или банда игрока.
В TypeScript тип args выводится из params: args.id имеет тип number или number | undefined, если параметр необязательный. Список параметров, общий для нескольких команд, нужно объявить as const, иначе имена и типы расширятся и args их потеряет.
Ввод от клиента
Безопасные ответы клиентам: onClientCallback, onClientEvent, guard-условия, triggerClientCallback, полосы прогресса и мини-игры с проверкой на сервере, PendingActions.
Игроки и персонажи
online, onCharacter, notify, игроки рядом, позиции и хранилища для каждого игрока: PlayerMap, Cooldowns, KeyedCooldowns, SourceLock, RateLimit, KeyWatchers.