AI Core
Dokumentacja APIAI Core: eksporty serwerowe

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

Sygnatura
AcquireBucket(tag: string): number
Lua
local 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

Sygnatura
ReleaseBucket(id: number): boolean
Lua
local 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.

Na tej stronie