AI Core
Referencia de la APIAI Core: exports de servidor

Comprobaciones de conexión

Añade comprobaciones que cada jugador que se conecta debe superar (whitelists, baneos) y declara que tu script sustituye a otro.

Cada jugador que se conecta pasa por una única puerta en ai-core. Primero van las comprobaciones propias de ai-core: el jugador necesita una cuenta de FiveM, y ningún script innecesario puede ejecutarse junto al script que lo sustituye (cuando está activado Refuse players while both run (rechazar jugadores mientras ambos se ejecutan) en el panel). Después vienen las comprobaciones que otros recursos añaden con AddConnectionCheck, en el orden en que se añadieron. Gana el primer rechazo.

AddConnectionCheck

Añade una comprobación que cada jugador que se conecta debe superar. Úsala para una whitelist, una lista de baneos o un modo de mantenimiento.

Lado: Servidor · Espera: no (la propia comprobación debe responder al momento) · Lib: ninguna

Firma
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 contiene cada tipo de identificador con su valor sin el prefijo: identifiers.license es abc123..., no license:abc123.... Los tipos que el jugador no tiene no aparecen.

Devuelve

Nada. Sin un id de texto o una función la llamada no hace nada. La comprobación se quita cuando tu recurso se detiene.

Ejemplo

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

const core = resourceExport("ai-core");
const allowed = new Set<string>(); // se rellena desde tu base de datos al iniciar

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

La comprobación se ejecuta mientras el jugador se conecta y debe responder al momento: nada de consultas a la base de datos, ni await, ni Wait. Ten en memoria lo que compruebas (cárgalo al iniciar, actualízalo cuando cambie). Una comprobación que lanza un error queda en el log y se salta, así que nunca deja fuera a todo el mundo.

RegisterReplacement

Declara que un script hace innecesarios a otros (tu script hace el mismo trabajo que ellos). Mientras ambos estén instalados, ai-core avisa en la consola y nombra la carpeta que hay que borrar; mientras ambos estén iniciados y Refuse players while both run esté activado en el panel, nadie puede entrar.

Lado: Servidor · Espera: no · Lib: ninguna

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

Parámetros

Prop

Type

Devuelve

Nada. La regla se quita cuando el recurso que llama se detiene. ai-core vuelve a buscar choques un segundo después de que cualquier recurso se inicie o se detenga.

Ejemplo

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

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

// Nuestro script de banca hace lo que hacen estos; ejecutar ambos duplicaría las pantallas del banco.
core.RegisterReplacement(["qb-banking", "okokBanking"]);

Un recurso que no puedes cambiar (un script con escrow) puede declarar lo mismo con una línea en su fxmanifest.lua: ai_replaces 'qb-banking'.

GetConflicts

Cada choque encontrado ahora: un script instalado junto a un script que lo sustituye.

Lado: Servidor · Espera: no · Lib: ninguna

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

Parámetros

Ninguno.

Devuelve

Una lista, una entrada por choque:

Prop

Type

Una lista vacía cuando no hay ningún choque.

Ejemplo

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}]`);
});

En esta página