AI Core
Dokumentacja APILib: serwer

Pojazdy

spawnVehicle, vehicleType, randomPlate, najbliższe pojazdy, encje z id sieciowych klienta, vehicleKeys, paliwo i garaże.

TypeScript
import { spawnVehicle, vehicleKeys, fuel, garages, vehicleFromNet } from "@aicore-fivem/lib/server";

Spawnowanie

spawnVehicle

Tworzy pojazd sieciowy na serwerze i konfiguruje go w jednym wywołaniu: tablica, paliwo, wygląd, zamek, routing bucket, klucze do właściwego celu, kierowca i pasażerowie. Używaj go dla każdego pojazdu skryptu (pojazdy pracy, wypożyczenia, pojazdy z garażu, spawny administratora).

Strona: Serwer · Czeka: tak (Promise w TypeScript, w Lua wstrzymuje wątek)

Sygnatura
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>
Lua
local vehicle = aiLib.spawnVehicle(options) -- encja albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

SpawnVehicleOptions

Prop

Type

Zwracana wartość

Promise<number | null>: uchwyt encji pojazdu. null, gdy model nie istnieje (tak powiedział klient asker), encja nie została utworzona w ciągu 5 sekund albo typ jest nieznany.

Przykład

import { onClientCallback, spawnVehicle, hasCharacter, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const DEPOT = { x: 895.4, y: -179.3, z: 74.7 };

onClientCallback(
  "my-taxi:start",
  async (source) => {
    const vehicle = await spawnVehicle({
      model: "taxi",
      coords: { x: 899.1, y: -180.6, z: 73.8, heading: 238 },
      asker: source,
      keysTo: source,
      purpose: "job",
      driver: source,
      fuel: 100,
      setup: { dirt: 0 },
    });
    if (!vehicle) return fail("SPAWN_FAILED");
    return { ok: true, netId: NetworkGetNetworkIdFromEntity(vehicle) };
  },
  { guards: [hasCharacter(), near(DEPOT, 5)], lock: true },
);

Klucze czekają (do 3 sekund), aż serwer odczyta tablicę: przed pierwszą synchronizacją klienta właściciela serwer czyta pustą tablicę. Sadzani gracze są wsadzani ponownie przez maksymalnie 2 sekundy, aż usiądą. W TypeScript typ modelu od jednego klienta służy tylko temu graczowi, dopóki klient drugiego gracza nie poda tej samej odpowiedzi; odpowiednik w Lua zachowuje pierwszą odpowiedź, jaką dostanie.

vehicleType

Typ spawnu modelu, zapytany od klienta gracza. Używaj go, żeby sprawdzić, czy model istnieje, zanim weźmiesz pieniądze.

Strona: Serwer · Czeka: tak (Promise)

Sygnatura
vehicleType(model: string, asker: number): Promise<string | null>

Brak odpowiednika w Lua: aiLib.spawnVehicle z asker to sprawdza i zwraca nil dla nieznanego modelu.

Prop

Type

Zwracana wartość

Promise<string | null>: automobile, bike, boat, heli, plane, submarine, trailer albo train; null, gdy gra nie ma takiego pojazdu albo klient nie dał poprawnej odpowiedzi. Odpowiedź jest zachowywana dla wszystkich, gdy zgodzą się co do niej klienty dwóch różnych graczy, więc jeden zmodyfikowany klient może zepsuć tylko własne spawny.

Przykład

import { onClientCallback, vehicleType } from "@aicore-fivem/lib/server";
import { fail, oneArg, readText } from "@aicore-fivem/lib/shared";

onClientCallback("my-dealer:buy", { args: oneArg((v) => readText(v, 32)), lock: true }, async (source, model) => {
  if (!(await vehicleType(model, source))) return fail("UNKNOWN_MODEL");
  // weź pieniądze, potem spawnVehicle(...)
  return { ok: true };
});

randomPlate

Losowa tablica jak w samej grze (dwie cyfry, trzy litery, trzy cyfry) albo twój prefiks i po nim cyfry.

Strona: Serwer · Czeka: nie

Sygnatura
randomPlate(prefix?: string): string

Brak odpowiednika w Lua (aiLib.spawnVehicle ustawia losową tablicę, gdy żadnej nie podasz).

Prop

Type

Zwraca 8-znakową tablicę (42ABC123 albo TAXI1234 dla randomPlate("TAXI")). Nie jest sprawdzana pod kątem unikalności: sprawdź własną tabelę, zanim ją zapiszesz.

const plate = randomPlate("RENT");

Szukanie pojazdów

nearestVehicleTo

Najbliższy pojazd w odległości metres od gracza, który przechodzi twój filtr. Pierwszeństwo ma pojazd, w którym siedzi gracz.

Strona: Serwer · Czeka: nie

Sygnatura
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): number
Lua
local vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- encja albo 0

Prop

Type

Zwraca encję pojazdu albo 0, gdy nie ma żadnego.

const vehicle = nearestVehicleTo(source, 5);
if (!vehicle) return fail("NO_VEHICLE");

Przechodzi po każdym pojeździe na serwerze: używaj jej dla komend i akcji (z limitem częstotliwości), nigdy w ticku.

nearestVehicleAt

Najbliższy pojazd w odległości metres od punktu. Używaj jej, żeby sprawdzić, czy miejsce spawnu jest wolne.

Strona: Serwer · Czeka: nie

Sygnatura
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): number

Brak odpowiednika w Lua.

Zwraca encję pojazdu albo 0, gdy nie ma żadnego. Przechodzi po każdym pojeździe, jak nearestVehicleTo.

const SPOT = { x: 899.1, y: -180.6, z: 73.8 };
if (nearestVehicleAt(SPOT, 3)) return fail("SPOT_BLOCKED");

Encje z wejścia klienta

Klient wysyła id sieciowe, nigdy uchwyt encji. Te funkcje zamieniają id sieciowe w żywą encję serwerową i ją sprawdzają, więc nigdy nie wywołujesz ręcznie NetworkGetEntityFromNetworkId + DoesEntityExist + GetEntityType.

entityFromNet

Żywa encja stojąca za id sieciowym klienta.

Strona: Serwer · Czeka: nie

Sygnatura
entityFromNet(netId: unknown, type?: 1 | 2 | 3): number

Brak odpowiednika w Lua (Lua ma vehicleFromNet).

Prop

Type

Zwraca encję albo 0, gdy wartość nie jest dodatnią liczbą całkowitą, nie jest sieciowa, zniknęła albo jest innego typu.

const prop = entityFromNet(rawNetId, 3);
if (!prop) return fail("NOT_FOUND");

pedFromNet

entityFromNet(netId, 1): żywy ped albo 0.

Strona: Serwer · Czeka: nie

Sygnatura
pedFromNet(netId: unknown): number

Brak odpowiednika w Lua.

const ped = pedFromNet(rawNetId);

vehicleFromNet

entityFromNet(netId, 2): żywy pojazd albo 0.

Strona: Serwer · Czeka: nie

Sygnatura
vehicleFromNet(netId: unknown): number
Lua
local vehicle = aiLib.vehicleFromNet(netId) -- encja albo 0
const vehicle = vehicleFromNet(rawNetId);
if (!vehicle) return fail("NO_VEHICLE");

vehicleNearPlayer

Pojazd stojący za id sieciowym klienta, ale tylko gdy gracz jest blisko niego (albo na jego miejscu kierowcy).

Strona: Serwer · Czeka: nie

Sygnatura
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): number
Lua
local vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- encja albo 0

Prop

Type

Zwraca pojazd albo 0, gdy id jest złe, pojazd zniknął albo gracz jest za daleko / nie jest kierowcą.

onClientCallback("my-tow:hook", { args: oneArg(readId), lock: true }, (source, netId) => {
  const vehicle = vehicleNearPlayer(source, netId, { metres: 6 });
  if (!vehicle) return fail("TOO_FAR");
  return { ok: true };
});

Klucze

vehicleKeys przechodzi przez warstwę kluczy ai-core: odpowiada skrypt kluczy, którego używa serwer (ai-vehiclekeys albo inny wybrany przez właściciela). Pojazd to uchwyt encji serwerowej albo tablica.

vehicleKeys.give

Daje graczowi klucze pojazdu.

Strona: Serwer · Czeka: nie

Sygnatura
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): void
Lua
aiLib.vehicleKeys.give(source, vehicle, purpose)

Prop

Type

Zwraca void.

vehicleKeys.give(source, vehicle, "rental");

vehicleKeys.remove

Zabiera graczowi klucze pojazdu.

Strona: Serwer · Czeka: nie

Sygnatura
vehicleKeys.remove(source: number, vehicle: number | string): void
Lua
aiLib.vehicleKeys.remove(source, vehicle)

Zwraca void.

vehicleKeys.remove(source, "RENT1234");

vehicleKeys.has

Czy gracz ma klucze.

Strona: Serwer · Czeka: nie

Sygnatura
vehicleKeys.has(source: number, vehicle: number | string): boolean
Lua
local has = aiLib.vehicleKeys.has(source, vehicle)

Zwraca boolean. true także wtedy, gdy skrypt kluczy nie potrafi tego stwierdzić albo żaden nie działa, więc nie używaj tego jako jedynego zabezpieczenia czegoś cennego.

if (!vehicleKeys.has(source, vehicle)) return fail("NO_KEYS");

Paliwo

fuel czyta i ustawia paliwo pojazdu (od 0 do 100) przez warstwę paliwa ai-core, niezależnie od tego, jaki skrypt paliwa działa. Brak odpowiednika w Lua na serwerze: wywołaj eksporty ai-core GetVehicleFuel / SetVehicleFuel.

fuel.get

Strona: Serwer · Czeka: nie

Sygnatura
fuel.get(vehicle: number): number | null

Zwraca poziom encji pojazdu serwerowego (od 0 do 100) albo null, gdy go nie ma.

const level = fuel.get(vehicle) ?? 0;

fuel.set

Strona: Serwer · Czeka: nie

Sygnatura
fuel.set(vehicle: number, level: number): boolean

Prop

Type

Zwraca true, gdy ustawiono, false dla złego pojazdu.

fuel.set(vehicle, 100);

fuel.provider

Strona: Serwer · Czeka: nie

Sygnatura
fuel.provider(): string | null

Zwraca nazwę zasobu skryptu paliwa, który odpowiada (ai-fuel, ox_fuel, LegacyFuel...), albo null, gdy żaden nie działa.

console.log(`fuel through ${fuel.provider() ?? "nothing"}`);

Garaże

garages przechodzi przez warstwę garaży ai-core, niezależnie od tego, jaki skrypt garaży działa; każdy skrypt odpowiada tylko na to, co udostępnia. Brak odpowiednika w Lua.

garages.impound

Wysyła pojazd na parking policyjny albo otwiera formularz parkingu policyjnego skryptu garaży dla by.

Strona: Serwer · Czeka: nie

Sygnatura
garages.impound(vehicle: number, by?: number): boolean

Prop

Type

Zwraca true, gdy skrypt garaży go przyjął. false, gdy nic go nie przyjęło: usuń pojazd sam.

if (!garages.impound(vehicle, source)) DeleteEntity(vehicle);

garages.store

Zapisuje pojazd w garażu.

Strona: Serwer · Czeka: nie

Sygnatura
garages.store(vehicle: number, garage?: string | null, by?: number): boolean

Prop

Type

Zwraca true, gdy zapisano, false, gdy nic go nie przyjęło.

if (!garages.store(vehicle, "legion", source)) return fail("STORE_FAILED");

garages.open

Otwiera menu garażu skryptu garaży dla gracza.

Strona: Serwer · Czeka: nie

Sygnatura
garages.open(source: number, garage?: string | null): boolean

Zwraca true, gdy otwarto, false, gdy skrypt nie ma takiego menu.

garages.open(source, "pillbox");

garages.stored

Pojazdy gracza w garażach albo na parkingu policyjnym.

Strona: Serwer · Czeka: tak (Promise)

Sygnatura
garages.stored(source: number): Promise<GaragedVehicle[] | null>

Zwraca GaragedVehicle[] (plate, model, garage, impounded) albo null, gdy skrypt nie potrafi tego stwierdzić albo ai-core jest zatrzymany.

const list = await garages.stored(source);
const impounded = list?.filter((v) => v.impounded).length ?? 0;

garages.provider

Strona: Serwer · Czeka: nie

Sygnatura
garages.provider(): string | null

Zwraca skrypt garaży, który odpowiada, albo null, gdy żaden nie działa.

if (!garages.provider()) console.warn("no garage script runs");

Na tej stronie