AI Core
Справочник APILib для Lua

Помощники только для 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) и запоминает ответ.

Сторона: Клиент · Ждёт: нет

Lua
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 не запущен.

Пример

client.lua
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 объединяет их, поэтому ваш обработчик всегда получает всю таблицу.

Сторона: Клиент · Ждёт: нет

Lua
aiLib.playerData.onChange(key, function(value) end)

TypeScript: onPlayerData(key, handler) (см. Членство и данные игрока).

Параметры

Prop

Type

Возвращает

Ничего. Удалить обработчик нельзя; он исчезает вместе с вашим ресурсом.

Пример

client.lua
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

Загруженный персонаж игрока.

Сторона: Сервер · Ждёт: нет

Lua
local character = aiLib.online.character(src)

Параметры

Prop

Type

Возвращает

Таблица CharacterInfo (id, citizenid, firstname, lastname, birthdate, sex, nationality...) или nil, если у игрока не загружен персонаж.

Пример

server.lua
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.

Сторона: Сервер · Ждёт: нет

Lua
local name = aiLib.online.name(src, fallback)

TypeScript: online.name(source, { fallback }) принимает таблицу опций вместо булева значения.

Параметры

Prop

Type

Возвращает

string: имя персонажа, иначе имя FiveM (или "" при fallback = false либо если игрок ушёл).

Пример

server.lua
print(('%s opened the shop'):format(aiLib.online.name(source)))

aiLib.online.jobs

Все работы игрока, на дежурстве или нет.

Сторона: Сервер · Ждёт: нет

Lua
local jobs = aiLib.online.jobs(src)

TypeScript: online.jobs(source) возвращает только имена работ; Lua возвращает таблицы членства.

Параметры

Prop

Type

Возвращает

Список таблиц JobMembership ({ job = 'police', grade = 2 }). Пустой список, если работ нет или нет персонажа.

Пример

server.lua
for _, membership in ipairs(aiLib.online.jobs(source)) do
    print(membership.job, membership.grade)
end

aiLib.online.gangs

Все банды игрока.

Сторона: Сервер · Ждёт: нет

Lua
local gangs = aiLib.online.gangs(src)

TypeScript: online.gangs(source) возвращает только имена банд.

Параметры

Prop

Type

Возвращает

Список таблиц GangMembership ({ gang = 'ballas', grade = 0 }) или пустой список.

Пример

server.lua
local inAGang = #aiLib.online.gangs(source) > 0

aiLib.online.jobGrade

Ранг игрока в одной работе.

Сторона: Сервер · Ждёт: нет

Lua
local grade = aiLib.online.jobGrade(src, job)

Параметры

Prop

Type

Возвращает

integer (0 = самый низкий ранг) или nil, если игрок не состоит в этой работе.

Пример

server.lua
local grade = aiLib.online.jobGrade(source, 'police')
if not grade or grade < 2 then return aiLib.fail('NOT_ALLOWED') end

aiLib.online.gangGrade

Ранг игрока в одной банде.

Сторона: Сервер · Ждёт: нет

Lua
local grade = aiLib.online.gangGrade(src, gang)

Параметры

Prop

Type

Возвращает

integer или nil, если игрок не состоит в этой банде.

Пример

server.lua
local isBoss = (aiLib.online.gangGrade(source, 'ballas') or -1) >= 3

aiLib.online.dutyJob

Работа, на дежурстве которой находится игрок.

Сторона: Сервер · Ждёт: нет

Lua
local job = aiLib.online.dutyJob(src)

Параметры

Prop

Type

Возвращает

Название работы или nil, если игрок не на дежурстве.

Пример

server.lua
if aiLib.online.dutyJob(source) ~= 'police' then return aiLib.fail('NOT_ON_DUTY') end

aiLib.online.sources

Серверные id всех игроков с загруженным персонажем.

Сторона: Сервер · Ждёт: нет

Lua
local players = aiLib.online.sources()

Возвращает

Список серверных id (пустой, если никто не загружен или ai-core не запущен).

Пример

server.lua
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.

Сторона: Сервер · Ждёт: нет

Lua
local allowed = aiLib.isAdmin(src, ace)

TypeScript: isAdmin(ace?) там является guard-условием для onClientCallback / onClientEvent (см. Ввод от клиента). В Lua защищайте колбэк его опцией ace или вызывайте aiLib.isAdmin сами.

Параметры

Prop

Type

Возвращает

true, если у игрока есть этот ACE, иначе false.

Пример

server.lua
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 на странице Общий интерфейс.

client.lua
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)

На этой странице