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

Routing buckets

Pegue um routing bucket livre para um mundo separado (um interior instanciado, uma casa de assalto) e devolva-o.

Um routing bucket é uma cópia separada do mundo: jogadores e entidades no bucket 5 não conseguem ver nem tocar os do bucket 0 (o mundo normal). Use um para um mundo que precisa ser totalmente separado, como um apartamento instanciado ou o interior de uma casa de assalto. Para só esconder jogadores dentro de um interior, as natives de conceal são mais baratas.

Cada script pega seus buckets do alocador do ai-core, então dois scripts nunca usam o mesmo. Nunca escolha um número de bucket você mesmo (1000 + houseId).

AcquireBucket

Pega um routing bucket livre para o seu recurso. O novo bucket não tem população ambiente (nem trânsito nem pedestres) e tem lockdown estrito de entidades (só o servidor pode criar entidades nele). Ele é seu até você devolvê-lo ou seu recurso parar.

Lado: Servidor · Espera: não · Lib: buckets.acquire

Assinatura
AcquireBucket(tag: string): number
Lua
local bucket = exports['ai-core']:AcquireBucket('apartment:12')

Parâmetros

Prop

Type

Retorno

number: o id do bucket, 1000 ou mais. Ids devolvidos são entregues de novo primeiro.

Exemplo

import { onClientCallback, PlayerMap, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const INSIDE = { x: 266.1, y: -1007.3, z: -101.0, heading: 0 };
// Quem está em qual bucket de apartamento; esvaziado sozinho quando um jogador cai.
const inside = new PlayerMap<number>();

onClientCallback("myscript:enterApartment", { lock: true }, (source) => {
  if (inside.has(source)) return fail("ALREADY_INSIDE");
  const bucket = core.AcquireBucket(`apartment:${source}`);
  inside.set(source, bucket);
  SetPlayerRoutingBucket(String(source), bucket);
  SetEntityCoords(GetPlayerPed(String(source)), INSIDE.x, INSIDE.y, INSIDE.z, false, false, false, false);
  return { ok: true };
});

Quando o jogador sai (ou cai), mova-o de volta para o bucket 0 e devolva o bucket com ReleaseBucket. Um bucket que você nunca libera continua ocupado até seu recurso parar.

ReleaseBucket

Devolve um bucket ao alocador. Só o recurso que o pegou pode.

Lado: Servidor · Espera: não · Lib: buckets.release

Assinatura
ReleaseBucket(id: number): boolean
Lua
local released = exports['ai-core']:ReleaseBucket(bucket)

Parâmetros

Prop

Type

Retorno

boolean: true quando o bucket foi devolvido. false quando seu recurso não o tem (outro recurso o pegou, ele já foi liberado) ou id não é um número.

Exemplo

import { onClientCallback, PlayerMap, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const DOOR = { x: -269.4, y: -955.3, z: 31.2 };
const inside = new PlayerMap<number>({ onDrop: (_source, bucket) => core.ReleaseBucket(bucket) });

onClientCallback("myscript:leaveApartment", (source) => {
  const bucket = inside.get(source);
  if (bucket === undefined) return fail("NOT_INSIDE");
  inside.delete(source);
  // Primeiro tire o jogador, depois devolva o bucket.
  SetPlayerRoutingBucket(String(source), 0);
  SetEntityCoords(GetPlayerPed(String(source)), DOOR.x, DOOR.y, DOOR.z, false, false, false, false);
  core.ReleaseBucket(bucket);
  return { ok: true };
});

Quando seu recurso para, o ai-core libera de uma vez cada bucket que ele tinha. Jogadores ainda dentro não são movidos: faça isso no seu próprio handler de parada.

Nesta página