AI Core
Referencia de la APIAI Core: exports de servidor

Routing buckets

Toma un routing bucket libre para un mundo separado (un interior instanciado, una casa a robar) y devuélvelo.

Un routing bucket es una copia separada del mundo: los jugadores y las entidades del bucket 5 no pueden ver ni tocar a los del bucket 0 (el mundo normal). Usa uno para un mundo que debe estar totalmente separado, como un apartamento instanciado o el interior de una casa a robar. Para solo ocultar a los jugadores dentro de un interior, los natives de ocultación son más baratos.

Cada script toma sus buckets del asignador de ai-core, así que dos scripts nunca usan el mismo. Nunca elijas tú un número de bucket (1000 + houseId).

AcquireBucket

Toma un routing bucket libre para tu recurso. El nuevo bucket no tiene población ambiental (ni tráfico ni peatones) y tiene el bloqueo estricto de entidades (solo el servidor puede crear entidades en él). Es tuyo hasta que lo devuelvas o tu recurso se detenga.

Lado: Servidor · Espera: no · Lib: buckets.acquire

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

Parámetros

Prop

Type

Devuelve

number: el id del bucket, 1000 o más. Los ids devueltos se reparten de nuevo primero.

Ejemplo

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 };
// Quién está en qué bucket de apartamento; se vacía solo cuando un jugador se desconecta.
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 };
});

Cuando el jugador sale (o se desconecta), devuélvelo al bucket 0 y devuelve el bucket con ReleaseBucket. Un bucket que nunca liberas sigue ocupado hasta que tu recurso se detenga.

ReleaseBucket

Devuelve un bucket al asignador. Solo puede hacerlo el recurso que lo tomó.

Lado: Servidor · Espera: no · Lib: buckets.release

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

Parámetros

Prop

Type

Devuelve

boolean: true cuando se devolvió el bucket. false cuando tu recurso no lo tiene (lo tomó otro recurso, ya se liberó) o id no es un número.

Ejemplo

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);
  // Saca primero al jugador y después devuelve el 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 };
});

Cuando tu recurso se detiene, ai-core libera de golpe cada bucket que tenía. Los jugadores que sigan dentro no se mueven: hazlo en tu propio handler de parada.

En esta página