Помощники только для Lua
aiLib.playerData, aiLib.online, aiLib.isAdmin и таблица aiLib.menu: функции aiLib, у которых форма в Lua отличается от библиотеки на TypeScript.
Большинство функций aiLib являются Lua-аналогами функций TypeScript и описаны рядом с ними, на вкладке Lua (см. Все функции aiLib). У функций на этой странице в Lua другое имя, форма или поведение, поэтому они описаны здесь.
Клиент: данные игрока
aiLib.playerData.get
Последнее значение, которое ai-core прислал для одного ключа данных локального игрока. Если с момента запуска вашего ресурса ничего не пришло, функция один раз спрашивает ai-core (GetPlayerData) и запоминает ответ.
Сторона: Клиент · Ждёт: нет
local value = aiLib.playerData.get(key)TypeScript: те же данные через getPlayerData(key) (см. Членство и данные игрока).
Параметры
Prop
Type
Возвращает
Значение: таблица для character, money ({ cash = 500, bank = 5000 }), jobs, job, gangs и metadata; строка или nil для duty и activeGang. nil, пока персонаж не загружен или ai-core не запущен.
Пример
RegisterCommand('cash', function()
local money = aiLib.playerData.get('money') or {}
aiLib.notify(('Cash: $%s'):format(aiLib.numbers.groupDigits(money.cash or 0)), 'info')
end, false)aiLib.playerData.onChange
Выполняет функцию каждый раз, когда ai-core присылает новое значение одного ключа для локального игрока (смена работы, деньги, заступление на дежурство). Для money и metadata ai-core присылает только изменённые записи; aiLib объединяет их, поэтому ваш обработчик всегда получает всю таблицу.
Сторона: Клиент · Ждёт: нет
aiLib.playerData.onChange(key, function(value) end)TypeScript: onPlayerData(key, handler) (см. Членство и данные игрока).
Параметры
Prop
Type
Возвращает
Ничего. Удалить обработчик нельзя; он исчезает вместе с вашим ресурсом.
Пример
aiLib.playerData.onChange('duty', function(job)
if job == 'police' then
aiLib.notify('You are now on duty', 'success')
end
end)Сервер: игроки онлайн
aiLib.online читает загруженных игроков через экспорты ai-core, один вызов экспорта на одно чтение. Он предназначен для поиска в момент действия (команда, колбэк), а не для каждого тика. online в TypeScript держит локальное зеркало с большим числом функций чтения и другой формой результатов (см. Игроки).
aiLib.online.character
Загруженный персонаж игрока.
Сторона: Сервер · Ждёт: нет
local character = aiLib.online.character(src)Параметры
Prop
Type
Возвращает
Таблица CharacterInfo (id, citizenid, firstname, lastname, birthdate, sex, nationality...) или nil, если у игрока не загружен персонаж.
Пример
aiLib.addCommand('whoami', { help = 'Shows your character id' }, function(source)
local character = aiLib.online.character(source)
if not character then return end
aiLib.notify(source, ('Character #%d (%s)'):format(character.id, character.citizenid), 'info')
end)aiLib.online.name
"Имя Фамилия" персонажа, иначе имя игрока в FiveM.
Сторона: Сервер · Ждёт: нет
local name = aiLib.online.name(src, fallback)TypeScript: online.name(source, { fallback }) принимает таблицу опций вместо булева значения.
Параметры
Prop
Type
Возвращает
string: имя персонажа, иначе имя FiveM (или "" при fallback = false либо если игрок ушёл).
Пример
print(('%s opened the shop'):format(aiLib.online.name(source)))aiLib.online.jobs
Все работы игрока, на дежурстве или нет.
Сторона: Сервер · Ждёт: нет
local jobs = aiLib.online.jobs(src)TypeScript: online.jobs(source) возвращает только имена работ; Lua возвращает таблицы членства.
Параметры
Prop
Type
Возвращает
Список таблиц JobMembership ({ job = 'police', grade = 2 }). Пустой список, если работ нет или нет персонажа.
Пример
for _, membership in ipairs(aiLib.online.jobs(source)) do
print(membership.job, membership.grade)
endaiLib.online.gangs
Все банды игрока.
Сторона: Сервер · Ждёт: нет
local gangs = aiLib.online.gangs(src)TypeScript: online.gangs(source) возвращает только имена банд.
Параметры
Prop
Type
Возвращает
Список таблиц GangMembership ({ gang = 'ballas', grade = 0 }) или пустой список.
Пример
local inAGang = #aiLib.online.gangs(source) > 0aiLib.online.jobGrade
Ранг игрока в одной работе.
Сторона: Сервер · Ждёт: нет
local grade = aiLib.online.jobGrade(src, job)Параметры
Prop
Type
Возвращает
integer (0 = самый низкий ранг) или nil, если игрок не состоит в этой работе.
Пример
local grade = aiLib.online.jobGrade(source, 'police')
if not grade or grade < 2 then return aiLib.fail('NOT_ALLOWED') endaiLib.online.gangGrade
Ранг игрока в одной банде.
Сторона: Сервер · Ждёт: нет
local grade = aiLib.online.gangGrade(src, gang)Параметры
Prop
Type
Возвращает
integer или nil, если игрок не состоит в этой банде.
Пример
local isBoss = (aiLib.online.gangGrade(source, 'ballas') or -1) >= 3aiLib.online.dutyJob
Работа, на дежурстве которой находится игрок.
Сторона: Сервер · Ждёт: нет
local job = aiLib.online.dutyJob(src)Параметры
Prop
Type
Возвращает
Название работы или nil, если игрок не на дежурстве.
Пример
if aiLib.online.dutyJob(source) ~= 'police' then return aiLib.fail('NOT_ON_DUTY') endaiLib.online.sources
Серверные id всех игроков с загруженным персонажем.
Сторона: Сервер · Ждёт: нет
local players = aiLib.online.sources()Возвращает
Список серверных id (пустой, если никто не загружен или ai-core не запущен).
Пример
for _, src in ipairs(aiLib.online.sources()) do
if aiLib.online.dutyJob(src) == 'police' then
aiLib.notify(src, 'Robbery in progress', 'warning')
end
endКаждый вызов является вызовом экспорта ai-core. В цикле по всем игрокам читайте нужное один раз на игрока и никогда не делайте этого каждый кадр. Чтобы узнать «сколько на дежурстве», читайте глобальное состояние ai:duty:<job> (GlobalState['ai:duty:police']).
Сервер: права
aiLib.isAdmin
Является ли игрок администратором ai-core (ACE ai.admin) или есть ли у него указанный вами ACE.
Сторона: Сервер · Ждёт: нет
local allowed = aiLib.isAdmin(src, ace)TypeScript: isAdmin(ace?) там является guard-условием для onClientCallback / onClientEvent (см. Ввод от клиента). В Lua защищайте колбэк его опцией ace или вызывайте aiLib.isAdmin сами.
Параметры
Prop
Type
Возвращает
true, если у игрока есть этот ACE, иначе false.
Пример
RegisterCommand('fixall', function(source)
if not aiLib.isAdmin(source) then return end
-- здесь работа только для администраторов
end, false)Клиент: таблица menu
aiLib.menu
Диалоги собраны в одной таблице. Имена верхнего уровня это те же функции, оставленные для коротких вызовов:
В aiLib.menu | То же, что | Ждёт | Ответ |
|---|---|---|---|
menu.show(request, listeners?) | (только здесь) | да | id выбранного пункта, '__back' для кнопки «назад» в подменю или nil, если меню закрыто. |
menu.input(request) | aiLib.input(request) | да | Таблица значений по name поля или nil, если окно закрыто. |
menu.itemPicker(request) | aiLib.itemPicker(request) | да | Список { name, count } или nil. Только для инструментов администратора. |
menu.skillCheck(difficulty, keys?) | aiLib.skillCheck(difficulty, keys?) | да | true, если пройдены все этапы. |
menu.lockpick(options?) | aiLib.lockpick(options?) | да | 'opened', 'broken' или 'cancelled'. |
Формы запросов: MenuRequest, InputRequest, ItemPickerRequest и SkillDifficulty. Все опции и обработчики описаны вместе с аналогами на TypeScript на странице Общий интерфейс.
RegisterCommand('fine', function()
local values = aiLib.input({
title = 'Write a fine',
confirm = 'Send',
fields = {
{ name = 'amount', label = 'Amount', type = 'number', min = 1, max = 10000 },
{ name = 'reason', label = 'Reason', type = 'text', maxLength = 80 },
},
})
if values then aiLib.callAction('mypolice:fine', { values.amount, values.reason }, { fallback = 'FINE_FAILED' }) end
end, false)