Routing-Buckets
Einen freien Routing-Bucket für eine separate Welt nehmen (ein instanziertes Interior, ein Einbruchshaus) und zurückgeben.
Ein Routing-Bucket ist eine separate Kopie der Welt: Spieler und Entities in Bucket 5 können die in Bucket 0 (der normalen Welt) weder sehen noch berühren. Nutze einen für eine Welt, die vollständig getrennt sein muss, etwa eine instanzierte Wohnung oder das Innere eines Einbruchshauses. Um Spieler nur innerhalb eines Interiors zu verbergen, sind die Conceal-Natives günstiger.
Jedes Skript nimmt seine Buckets aus dem Allocator von ai-core, sodass nie zwei Skripte denselben nutzen. Wähle nie selbst eine Bucket-Nummer (1000 + houseId).
AcquireBucket
Nimmt einen freien Routing-Bucket für deine Ressource. Der neue Bucket hat keine Umgebungsbevölkerung (keinen Verkehr, keine Fußgänger) und einen strikten Entity-Lockdown (nur der Server kann darin Entities erstellen). Er gehört dir, bis du ihn zurückgibst oder deine Ressource stoppt.
Seite: Server · Wartet: nein · Lib: buckets.acquire
AcquireBucket(tag: string): numberlocal bucket = exports['ai-core']:AcquireBucket('apartment:12')Parameter
Prop
Type
Rückgabe
number: die Bucket-ID, 1000 oder höher. Zurückgegebene IDs werden zuerst wieder vergeben.
Beispiel
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 };
// Wer in welchem Wohnungs-Bucket ist; leert sich von selbst, wenn ein Spieler die Verbindung verliert.
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 };
});Wenn der Spieler hinausgeht (oder die Verbindung verliert), bringe ihn zurück in Bucket 0 und gib den Bucket mit ReleaseBucket zurück. Ein Bucket, den du nie freigibst, bleibt belegt, bis deine Ressource stoppt.
ReleaseBucket
Gibt einen Bucket an den Allocator zurück. Nur die Ressource, die ihn genommen hat, kann das.
Seite: Server · Wartet: nein · Lib: buckets.release
ReleaseBucket(id: number): booleanlocal released = exports['ai-core']:ReleaseBucket(bucket)Parameter
Prop
Type
Rückgabe
boolean: true, wenn der Bucket zurückgegeben wurde. false, wenn deine Ressource ihn nicht hält (eine andere Ressource hat ihn genommen, er wurde bereits freigegeben) oder id keine Zahl ist.
Beispiel
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);
// Zuerst den Spieler hinausbringen, dann den Bucket zurückgeben.
SetPlayerRoutingBucket(String(source), 0);
SetEntityCoords(GetPlayerPed(String(source)), DOOR.x, DOOR.y, DOOR.z, false, false, false, false);
core.ReleaseBucket(bucket);
return { ok: true };
});Wenn deine Ressource stoppt, gibt ai-core sofort jeden Bucket frei, den sie gehalten hat. Spieler, die noch drinnen sind, werden nicht bewegt: Erledige das in deinem eigenen Stop-Handler.