AI Core
Referência da APIAI Core: exports de servidor

Verificações de conexão

Adicione verificações que todo jogador que conecta precisa passar (whitelists, bans) e declare que seu script substitui outro.

Todo jogador que conecta passa por um portão no ai-core. As verificações do próprio ai-core vêm primeiro: o jogador precisa de uma conta FiveM, e nenhum script desnecessário pode rodar ao lado do script que o substitui (quando Refuse players while both run do painel está ligado). Depois vêm as verificações que outros recursos adicionam com AddConnectionCheck, na ordem em que foram adicionadas. A primeira recusa vence.

AddConnectionCheck

Adiciona uma verificação que todo jogador que conecta precisa passar. Use para uma whitelist, uma lista de bans ou um modo de manutenção.

Lado: Servidor · Espera: não (a verificação em si precisa responder na hora) · Lib: nenhuma

Assinatura
AddConnectionCheck(
  id: string,
  check: (source: number, identifiers: Record<string, string>) => string | null | undefined,
): void
Lua
exports['ai-core']:AddConnectionCheck('myscript:whitelist', function(source, identifiers) end)

Parâmetros

Prop

Type

identifiers guarda cada tipo de identificador com o valor sem o prefixo: identifiers.license é abc123..., não license:abc123.... Os tipos que o jogador não tem ficam ausentes.

Retorno

Nada. Sem um id em texto ou uma função a chamada não faz nada. A verificação é removida quando seu recurso para.

Exemplo

import { resourceExport } from "@aicore-fivem/lib/server";
import { Locale } from "common";

const core = resourceExport("ai-core");
const allowed = new Set<string>(); // preenchido a partir do seu banco de dados ao iniciar

core.AddConnectionCheck("myscript:whitelist", (_source, identifiers) => {
  const fivem = identifiers.fivem;
  return fivem && allowed.has(fivem) ? null : Locale("CONNECT_NOT_WHITELISTED");
});

A verificação roda enquanto o jogador conecta e precisa responder na hora: nada de consulta ao banco de dados, nada de await, nada de Wait. Guarde na memória o que você verifica (carregue ao iniciar, atualize quando mudar). Uma verificação que lança um erro é registrada no log e pulada, então ela nunca tranca todo mundo para fora.

RegisterReplacement

Declara que um script torna outros desnecessários (seu script faz o mesmo trabalho que os deles). Enquanto os dois estão instalados, o ai-core avisa no console e diz qual pasta apagar; enquanto os dois estão iniciados e Refuse players while both run do painel está ligado, ninguém consegue entrar.

Lado: Servidor · Espera: não · Lib: nenhuma

Assinatura
RegisterReplacement(remove: string | string[], keep?: string): void
Lua
exports['ai-core']:RegisterReplacement({ 'qb-banking', 'okokBanking' })

Parâmetros

Prop

Type

Retorno

Nada. A regra é removida quando o recurso que chama para. O ai-core procura conflitos de novo um segundo depois que qualquer recurso inicia ou para.

Exemplo

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

// Nosso script de banco faz o que estes fazem; rodar os dois duplicaria as telas de banco.
core.RegisterReplacement(["qb-banking", "okokBanking"]);

Um recurso que você não pode alterar (um script com escrow) pode declarar o mesmo com uma linha no fxmanifest.lua dele: ai_replaces 'qb-banking'.

GetConflicts

Cada conflito encontrado agora: um script instalado ao lado de um script que o substitui.

Lado: Servidor · Espera: não · Lib: nenhuma

Assinatura
GetConflicts(): { keep: string; remove: string; running: boolean; from: string }[]
Lua
local conflicts = exports['ai-core']:GetConflicts() -- lista de tables

Parâmetros

Nenhum.

Retorno

Uma lista, uma entrada por conflito:

Prop

Type

Uma lista vazia quando não há conflito.

Exemplo

import { addCommand, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

addCommand("conflicts", { help: "Lists scripts to remove", restricted: true }, () => {
  for (const c of core.GetConflicts())
    console.log(`${c.keep} replaces ${c.remove}${c.running ? " (both started!)" : ""} [${c.from}]`);
});

Nesta página