AI Core
Referência da APILib para Lua

Helpers só de Lua

aiLib.playerData, aiLib.online, aiLib.isAdmin e a tabela aiLib.menu: as funções do aiLib cuja forma em Lua difere da lib TypeScript.

A maioria das funções do aiLib é o equivalente em Lua de uma função TypeScript e está documentada ao lado dela, com uma aba Lua (veja Todas as funções do aiLib). As desta página têm nome, formato ou comportamento diferente em Lua, então estão documentadas aqui.

Cliente: dados do jogador

aiLib.playerData.get

O último valor que o ai-core enviou para uma chave dos dados do jogador local. Quando nada chegou desde que o seu recurso iniciou, ele pergunta ao ai-core uma vez (GetPlayerData) e guarda a resposta.

Lado: Cliente · Espera: não

Lua
local value = aiLib.playerData.get(key)

TypeScript: os mesmos dados por getPlayerData(key) (veja Vínculos e dados do jogador).

Parâmetros

Prop

Type

Retorno

O valor: uma tabela para character, money ({ cash = 500, bank = 5000 }), jobs, job, gangs e metadata; uma string ou nil para duty e activeGang. nil enquanto nenhum personagem está carregado ou o ai-core não está rodando.

Exemplo

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

Roda uma função toda vez que o ai-core envia um novo valor de uma chave para o jogador local (uma troca de emprego, dinheiro, entrar em serviço). Para money e metadata, o ai-core envia só as entradas alteradas; o aiLib as mescla, então o seu handler sempre recebe a tabela inteira.

Lado: Cliente · Espera: não

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

TypeScript: onPlayerData(key, handler) (veja Vínculos e dados do jogador).

Parâmetros

Prop

Type

Retorno

Nada. Não há como remover o handler; ele some junto com o seu recurso.

Exemplo

client.lua
aiLib.playerData.onChange('duty', function(job)
    if job == 'police' then
        aiLib.notify('You are now on duty', 'success')
    end
end)

Servidor: jogadores online

aiLib.online lê os jogadores carregados pelos exports do ai-core, uma chamada de export por leitura. Ele serve para consultas quando uma ação acontece (um comando, um callback), não para todo tick. O online do TypeScript mantém um espelho local com mais leitores e formatos de retorno diferentes (veja Jogadores).

aiLib.online.character

O personagem carregado de um jogador.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

Uma tabela CharacterInfo (id, citizenid, firstname, lastname, birthdate, sex, nationality...), ou nil quando o jogador não tem personagem carregado.

Exemplo

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

O "Nome Sobrenome" do personagem, senão o nome de FiveM do jogador.

Lado: Servidor · Espera: não

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

TypeScript: online.name(source, { fallback }) recebe uma tabela de opções em vez de um booleano.

Parâmetros

Prop

Type

Retorno

string: o nome do personagem, senão o nome do FiveM (ou "" com fallback = false, ou quando o jogador saiu).

Exemplo

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

aiLib.online.jobs

Todos os empregos de um jogador, em serviço ou não.

Lado: Servidor · Espera: não

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

TypeScript: online.jobs(source) retorna só os nomes dos empregos; Lua retorna as tabelas de vínculo.

Parâmetros

Prop

Type

Retorno

Uma lista de tabelas JobMembership ({ job = 'police', grade = 2 }). Uma lista vazia quando o jogador não tem nenhum ou não tem personagem.

Exemplo

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

aiLib.online.gangs

Todas as gangues de um jogador.

Lado: Servidor · Espera: não

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

TypeScript: online.gangs(source) retorna só os nomes das gangues.

Parâmetros

Prop

Type

Retorno

Uma lista de tabelas GangMembership ({ gang = 'ballas', grade = 0 }), ou uma lista vazia.

Exemplo

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

aiLib.online.jobGrade

O cargo de um jogador em um emprego.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

integer (0 = o cargo mais baixo), ou nil quando o jogador não está nesse emprego.

Exemplo

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

O cargo de um jogador em uma gangue.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

integer, ou nil quando o jogador não está nessa gangue.

Exemplo

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

aiLib.online.dutyJob

O emprego em que um jogador está em serviço.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

O nome do emprego, ou nil quando fora de serviço.

Exemplo

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

aiLib.online.sources

Os ids de servidor de todos os jogadores com um personagem carregado.

Lado: Servidor · Espera: não

Lua
local players = aiLib.online.sources()

Retorno

Uma lista de ids de servidor (vazia quando ninguém está carregado ou o ai-core não está rodando).

Exemplo

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

Cada chamada é uma chamada de export ao ai-core. Em um loop sobre todos os jogadores, leia o que precisa uma vez por jogador, e nunca rode isso a cada frame. Para "quantos estão em serviço", leia o global state ai:duty:<job> (GlobalState['ai:duty:police']).

Servidor: permissões

aiLib.isAdmin

Se um jogador é admin do ai-core (ACE ai.admin), ou tem a ACE que você indicar.

Lado: Servidor · Espera: não

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

TypeScript: isAdmin(ace?) é um guard para onClientCallback / onClientEvent (veja Entrada do cliente). Em Lua, proteja um callback com a opção ace dele, ou chame aiLib.isAdmin você mesmo.

Parâmetros

Prop

Type

Retorno

true quando o jogador tem a ACE, senão false.

Exemplo

server.lua
RegisterCommand('fixall', function(source)
    if not aiLib.isAdmin(source) then return end
    -- trabalho só de admin aqui
end, false)

Cliente: a tabela menu

aiLib.menu

Os diálogos ficam em uma tabela. Os nomes de nível superior são as mesmas funções, mantidas para chamadas curtas:

Em aiLib.menuO mesmo queEsperaResponde
menu.show(request, listeners?)(só aqui)simO id do item escolhido, '__back' para o voltar de um submenu, ou nil quando fechado.
menu.input(request)aiLib.input(request)simUma tabela dos valores por name de campo, ou nil quando fechado.
menu.itemPicker(request)aiLib.itemPicker(request)simUma lista de { name, count }, ou nil. Só ferramentas de admin.
menu.skillCheck(difficulty, keys?)aiLib.skillCheck(difficulty, keys?)simtrue quando todas as etapas foram acertadas.
menu.lockpick(options?)aiLib.lockpick(options?)sim'opened', 'broken' ou 'cancelled'.

Os formatos de pedido são MenuRequest, InputRequest, ItemPickerRequest e SkillDifficulty. Toda opção e todo listener estão documentados junto com os equivalentes em TypeScript em UI compartilhada.

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)

Nesta página