Pojazdy
spawnVehicle, vehicleType, randomPlate, najbliższe pojazdy, encje z id sieciowych klienta, vehicleKeys, paliwo i garaże.
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)
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>local vehicle = aiLib.spawnVehicle(options) -- encja albo nil, wywołuj wewnątrz wątkuParametry
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)
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
randomPlate(prefix?: string): stringBrak 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
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): numberlocal vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- encja albo 0Prop
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
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): numberBrak 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
entityFromNet(netId: unknown, type?: 1 | 2 | 3): numberBrak 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
pedFromNet(netId: unknown): numberBrak odpowiednika w Lua.
const ped = pedFromNet(rawNetId);vehicleFromNet
entityFromNet(netId, 2): żywy pojazd albo 0.
Strona: Serwer · Czeka: nie
vehicleFromNet(netId: unknown): numberlocal vehicle = aiLib.vehicleFromNet(netId) -- encja albo 0const 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
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): numberlocal vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- encja albo 0Prop
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
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): voidaiLib.vehicleKeys.give(source, vehicle, purpose)Prop
Type
Zwraca void.
vehicleKeys.give(source, vehicle, "rental");vehicleKeys.remove
Zabiera graczowi klucze pojazdu.
Strona: Serwer · Czeka: nie
vehicleKeys.remove(source: number, vehicle: number | string): voidaiLib.vehicleKeys.remove(source, vehicle)Zwraca void.
vehicleKeys.remove(source, "RENT1234");vehicleKeys.has
Czy gracz ma klucze.
Strona: Serwer · Czeka: nie
vehicleKeys.has(source: number, vehicle: number | string): booleanlocal 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
fuel.get(vehicle: number): number | nullZwraca 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
fuel.set(vehicle: number, level: number): booleanProp
Type
Zwraca true, gdy ustawiono, false dla złego pojazdu.
fuel.set(vehicle, 100);fuel.provider
Strona: Serwer · Czeka: nie
fuel.provider(): string | nullZwraca 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
garages.impound(vehicle: number, by?: number): booleanProp
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
garages.store(vehicle: number, garage?: string | null, by?: number): booleanProp
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
garages.open(source: number, garage?: string | null): booleanZwraca 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)
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
garages.provider(): string | nullZwraca skrypt garaży, który odpowiada, albo null, gdy żaden nie działa.
if (!garages.provider()) console.warn("no garage script runs");