Routing buckety
Weź wolny routing bucket dla osobnego świata (instancjonowane wnętrze, dom do obrabowania) i oddaj go.
Routing bucket to osobna kopia świata: gracze i encje w buckecie 5 nie widzą i nie mogą dotknąć tych w buckecie 0 (normalny świat). Używaj go dla świata, który musi być całkowicie osobny, jak instancjonowane mieszkanie albo wnętrze domu do obrabowania. Aby tylko ukryć graczy we wnętrzu, natywne funkcje conceal są tańsze.
Każdy skrypt bierze swoje buckety z alokatora ai-core, więc żadne dwa skrypty nigdy nie używają tego samego. Nigdy nie wybieraj numeru bucketa sam (1000 + houseId).
AcquireBucket
Bierze wolny routing bucket dla twojego zasobu. Nowy bucket nie ma populacji otoczenia (bez ruchu i przechodniów) i ma ścisłą blokadę encji (tylko serwer może w nim tworzyć encje). Jest twój, dopóki go nie oddasz albo twój zasób się nie zatrzyma.
Strona: Serwer · Czeka: nie · Lib: buckets.acquire
AcquireBucket(tag: string): numberlocal bucket = exports['ai-core']:AcquireBucket('apartment:12')Parametry
Prop
Type
Zwraca
number: id bucketa, 1000 lub wyżej. Oddane id są wydawane ponownie w pierwszej kolejności.
Przykład
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 };
// Kto jest w którym buckecie mieszkania; opróżnia się samo, gdy gracz się rozłącza.
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 };
});Gdy gracz wychodzi (lub się rozłącza), przenieś go z powrotem do bucketa 0 i oddaj bucket przez ReleaseBucket. Bucket, którego nigdy nie zwolnisz, zostaje zajęty, dopóki twój zasób się nie zatrzyma.
ReleaseBucket
Oddaje bucket alokatorowi. Może to zrobić tylko zasób, który go wziął.
Strona: Serwer · Czeka: nie · Lib: buckets.release
ReleaseBucket(id: number): booleanlocal released = exports['ai-core']:ReleaseBucket(bucket)Parametry
Prop
Type
Zwraca
boolean: true, gdy bucket został oddany. false, gdy twój zasób go nie trzyma (wziął go inny zasób, był już zwolniony) albo id nie jest liczbą.
Przykład
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);
// Najpierw przenieś gracza, potem oddaj 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 };
});Gdy twój zasób się zatrzymuje, ai-core od razu zwalnia każdy bucket, który trzymał. Gracze, którzy są jeszcze w środku, nie są przenoszeni: zrób to we własnym handlerze zatrzymania.