Vínculos e dados do jogador
hasJob, inGang, onDutyIn, allows, onMembershipChange, getPlayerData, onPlayerData e seedPlayerData - o personagem, o dinheiro, os empregos, o serviço e as gangues do jogador local como o ai-core os envia.
O ai-core envia os dados do próprio jogador local para o cliente dele: um snapshot quando o personagem carrega, depois só os valores que mudam. Estes helpers leem essa cópia, então uma verificação custa uma leitura em memória e nunca pergunta ao servidor.
Use-os para o que o jogador vê (o canShow de um ponto, um item do radial, uma linha de menu). O servidor decide o que o jogador pode fazer com os mesmos dados (online em Jogadores e personagens): uma verificação no cliente nunca é prova.
Dados do jogador
Os valores que o ai-core guarda, por chave (AiPlayerData):
Prop
Type
Os tipos dos membros são CharacterInfo, JobMembership e GangMembership.
getPlayerData
O último valor de uma chave. No primeiro uso no seu recurso também lê tudo o que o ai-core já enviou (pelo export GetPlayerData do ai-core), então um recurso reiniciado depois que o jogador carregou tem os valores na hora.
Lado: Cliente · Espera: não
getPlayerData<K extends keyof AiPlayerData>(key: K): AiPlayerData[K] | undefinedlocal value = aiLib.playerData.get(key)Parâmetros
Prop
Type
Retorno
AiPlayerData[K] | undefined: o valor, ou undefined (nil em Lua) quando nada chegou ainda (nenhum personagem carregado, ai-core não iniciado).
Exemplo
import { getPlayerData, notify } from "@aicore-fivem/lib/client";
RegisterCommand(
"whoami",
() => {
const character = getPlayerData("character");
const job = getPlayerData("job");
const cash = getPlayerData("money")?.cash ?? 0;
if (!character) return notify("No character loaded", "error");
notify(`${job?.job ?? "unemployed"} (${job?.grade ?? 0}), $${cash}`, "info");
},
false,
);onPlayerData
Roda um handler toda vez que o ai-core envia uma chave para este jogador.
Lado: Cliente · Espera: não
onPlayerData<K extends keyof AiPlayerData>(key: K, handler: (value: AiPlayerData[K]) => void): () => voidaiLib.playerData.onChange(key, function(value) end)Parâmetros
Prop
Type
Retorno
TypeScript: () => void, uma função que remove o handler. Lua não retorna nada.
Exemplo
import { onPlayerData } from "@aicore-fivem/lib/client";
const stop = onPlayerData("money", (money) => {
SendNUIMessage({ action: "money", data: { cash: money.cash ?? 0, bank: money.bank ?? 0 } });
});
// stop() quando o HUD fecha de vezValores enviados antes de o seu recurso iniciar não são repetidos para o handler. Leia o valor atual uma vez com getPlayerData na inicialização, depois acompanhe as mudanças com onPlayerData.
seedPlayerData
Preenche valores à mão. Chaves que já têm valor são mantidas. Você não precisa disto: a lib se preenche sozinha a partir do ai-core no primeiro uso.
Lado: Cliente · Espera: não
seedPlayerData(data: Partial<AiPlayerData>): voidSem equivalente em Lua.
Parâmetros
Prop
Type
Retorno
void.
Exemplo
import { seedPlayerData } from "@aicore-fivem/lib/client";
// Um ambiente de teste sem o ai-core.
seedPlayerData({ jobs: [{ job: "police", grade: 3 }], duty: "police" });Verificações de vínculo
hasJob
Se o jogador tem um dos empregos em um cargo mínimo, em serviço ou não.
Lado: Cliente · Espera: não
hasJob(jobs: readonly string[], minGrade?: number): booleanSem equivalente em Lua: percorra aiLib.playerData.get('jobs') (veja o exemplo Lua de points.add).
Parâmetros
Prop
Type
Retorno
boolean: true quando a lista está vazia, ou o jogador tem um dos jobs no minGrade ou acima.
Exemplo
import { hasJob, onMembershipChange, Points } from "@aicore-fivem/lib/client";
const points = new Points();
points.add("armory", {
coords: { x: 482.6, y: -995.2, z: 30.7 },
label: "Armory",
canShow: () => hasJob(["police", "sheriff"], 1),
onPressed: () => emitNet("mypolice:armory"),
});
onMembershipChange(() => points.refresh());inGang
Se o jogador está em uma das gangues em um cargo mínimo.
Lado: Cliente · Espera: não
inGang(gangs: readonly string[], minGrade?: number): booleanSem equivalente em Lua: percorra aiLib.playerData.get('gangs').
Parâmetros
Prop
Type
Retorno
boolean: true quando a lista está vazia, ou o jogador está em uma das gangs no minGrade ou acima.
Exemplo
import { inGang, radial } from "@aicore-fivem/lib/client";
radial.add({
id: "mygang:stash",
label: "Gang stash",
icon: "box",
canShow: () => inGang(["ballas", "vagos"], 2),
onPressed: () => emitNet("mygang:stash"),
});onDutyIn
Se o jogador está em serviço em um dos empregos.
Lado: Cliente · Espera: não
onDutyIn(jobs: readonly string[]): booleanSem equivalente em Lua: aiLib.playerData.get('duty') é o emprego em serviço.
Parâmetros
Prop
Type
Retorno
boolean: true quando o emprego em serviço do jogador está em jobs.
Exemplo
import { onDutyIn, Points } from "@aicore-fivem/lib/client";
const points = new Points();
points.addVehicle("mymech:repair", {
label: "Repair",
icon: "wrench",
canShow: () => onDutyIn(["mechanic"]),
onPressed: (vehicle) => emitNet("mymech:repair", NetworkGetNetworkIdFromEntity(vehicle)),
});onMembershipChange
Roda uma função quando os empregos, o serviço ou as gangues do jogador mudam. Use para atualizar pontos e blips cujo canShow os lê.
Lado: Cliente · Espera: não
onMembershipChange(fn: () => void): voidSem equivalente em Lua: aiLib.playerData.onChange para jobs, duty e gangs.
Parâmetros
Prop
Type
Retorno
void.
Exemplo
import { onMembershipChange, Points, radial } from "@aicore-fivem/lib/client";
const points = new Points();
onMembershipChange(() => {
points.refresh();
radial.refresh();
});allows
Se o jogador local pode usar um lugar com uma regra de acesso. O online.allows(source, rule) do servidor decide com a mesma regra, então o que o jogador vê é exatamente o que o servidor o deixa usar. Leia a regra de um registro do painel com readAccess(record) (@aicore-fivem/lib/shared).
Lado: Cliente · Espera: não
allows(rule: AccessRule): booleanSem equivalente em Lua.
Parâmetros
Prop
Type
AccessRule
Prop
Type
O tipo é AccessRule.
Retorno
boolean: true quando as duas listas estão vazias (todos); quando o jogador está em uma das gangs no cargo mínimo dela; ou quando o jogador tem um dos jobs no cargo mínimo dele (e está em serviço nele quando onDuty). Caso contrário false.
Exemplo
import { AdminWorld, allows, callAction, onMembershipChange, Points } from "@aicore-fivem/lib/client";
import { readAccess, readVec3, RecordObjects, type AccessRule } from "@aicore-fivem/lib/shared";
const world = new AdminWorld(["stashes"]);
const points = new Points();
interface Stash { coords: { x: number; y: number; z: number }; access: AccessRule }
const readStash = (_key: string, raw: Record<string, unknown>): Stash | null => {
const coords = readVec3(raw.coords);
return coords ? { coords, access: readAccess(raw) } : null;
};
new RecordObjects(world, "stashes", readStash, (id, stash) => {
points.add(id, {
coords: stash.coords,
label: "Stash",
canShow: () => allows(stash.access),
onPressed: () => callAction("mystash:open", [id], { fallback: "STASH_FAILED" }),
});
return () => points.remove(id);
});
onMembershipChange(() => points.refresh());Câmera e tempo
ScriptCamera, TickLoop, AreaFollower e ServerClock - câmeras de script, jobs por frame que só rodam quando necessários, informar a área do jogador ao servidor, e o relógio do servidor no cliente.
Lib: servidor
@aicore-fivem/lib/server e o lado servidor do aiLib: o que são, como carregá-los em TypeScript e Lua, e todas as páginas de tópicos.