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
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
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
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
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
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
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
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
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
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
for _, membership in ipairs(aiLib.online.jobs(source)) do
print(membership.job, membership.grade)
endaiLib.online.gangs
Todas as gangues de um jogador.
Lado: Servidor · Espera: não
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
local inAGang = #aiLib.online.gangs(source) > 0aiLib.online.jobGrade
O cargo de um jogador em um emprego.
Lado: Servidor · Espera: não
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
local grade = aiLib.online.jobGrade(source, 'police')
if not grade or grade < 2 then return aiLib.fail('NOT_ALLOWED') endaiLib.online.gangGrade
O cargo de um jogador em uma gangue.
Lado: Servidor · Espera: não
local grade = aiLib.online.gangGrade(src, gang)Parâmetros
Prop
Type
Retorno
integer, ou nil quando o jogador não está nessa gangue.
Exemplo
local isBoss = (aiLib.online.gangGrade(source, 'ballas') or -1) >= 3aiLib.online.dutyJob
O emprego em que um jogador está em serviço.
Lado: Servidor · Espera: não
local job = aiLib.online.dutyJob(src)Parâmetros
Prop
Type
Retorno
O nome do emprego, ou nil quando fora de serviço.
Exemplo
if aiLib.online.dutyJob(source) ~= 'police' then return aiLib.fail('NOT_ON_DUTY') endaiLib.online.sources
Os ids de servidor de todos os jogadores com um personagem carregado.
Lado: Servidor · Espera: não
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
for _, src in ipairs(aiLib.online.sources()) do
if aiLib.online.dutyJob(src) == 'police' then
aiLib.notify(src, 'Robbery in progress', 'warning')
end
endCada 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
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
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.menu | O mesmo que | Espera | Responde |
|---|---|---|---|
menu.show(request, listeners?) | (só aqui) | sim | O id do item escolhido, '__back' para o voltar de um submenu, ou nil quando fechado. |
menu.input(request) | aiLib.input(request) | sim | Uma tabela dos valores por name de campo, ou nil quando fechado. |
menu.itemPicker(request) | aiLib.itemPicker(request) | sim | Uma lista de { name, count }, ou nil. Só ferramentas de admin. |
menu.skillCheck(difficulty, keys?) | aiLib.skillCheck(difficulty, keys?) | sim | true 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.
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)Lib para Lua
aiLib: como um recurso Lua carrega o ai-lib, quando usar uma thread, como vetores e tabelas Lua passam para o TypeScript, e onde cada função está documentada.
Todas as funções do aiLib
A lista completa dos membros do aiLib: lado, se a chamada espera, e a página que a documenta com a aba Lua.