AI Core
Référence de l’APIAI Core : exports serveur

Routing buckets

Prendre un routing bucket libre pour un monde séparé (un intérieur instancié, une maison à braquer) et le rendre.

Un routing bucket est une copie séparée du monde : les joueurs et entités du bucket 5 ne peuvent ni voir ni toucher ceux du bucket 0 (le monde normal). Utilisez-en un pour un monde qui doit être entièrement séparé, comme un appartement instancié ou l’intérieur d’une maison à braquer. Pour seulement cacher des joueurs dans un intérieur, les natives de dissimulation (conceal) coûtent moins cher.

Chaque script prend ses buckets auprès de l’allocateur d’ai-core, si bien que deux scripts n’utilisent jamais le même. Ne choisissez jamais vous-même un numéro de bucket (1000 + houseId).

AcquireBucket

Prend un routing bucket libre pour votre ressource. Le nouveau bucket n’a aucune population ambiante (ni circulation ni piétons) et un verrouillage strict des entités (seul le serveur peut y créer des entités). Il est à vous jusqu’à ce que vous le rendiez ou que votre ressource s’arrête.

Côté : Serveur · Attend : non · Lib : buckets.acquire

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

Paramètres

Prop

Type

Retour

number : l’id du bucket, 1000 ou plus. Les ids rendus sont redistribués en premier.

Exemple

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 est dans quel bucket d’appartement ; vidé tout seul quand un joueur se déconnecte.
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 };
});

Quand le joueur sort (ou se déconnecte), ramenez-le au bucket 0 et rendez le bucket avec ReleaseBucket. Un bucket que vous ne rendez jamais reste pris jusqu’à l’arrêt de votre ressource.

ReleaseBucket

Rend un bucket à l’allocateur. Seule la ressource qui l’a pris le peut.

Côté : Serveur · Attend : non · Lib : buckets.release

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

Paramètres

Prop

Type

Retour

boolean : true quand le bucket a été rendu. false quand votre ressource ne le détient pas (une autre ressource l’a pris, il a déjà été rendu) ou que id n’est pas un nombre.

Exemple

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);
  // Sortir d’abord le joueur, puis rendre le 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 };
});

Quand votre ressource s’arrête, ai-core libère d’un coup chaque bucket qu’elle détenait. Les joueurs encore à l’intérieur ne sont pas déplacés : faites-le dans votre propre handler d’arrêt.

Sur cette page