Araçlar
spawnVehicle, vehicleType, randomPlate, en yakın araçlar, client net id’lerinden entity’ler, vehicleKeys, yakıt ve garajlar.
import { spawnVehicle, vehicleKeys, fuel, garages, vehicleFromNet } from "@aicore-fivem/lib/server";Araç oluşturma
spawnVehicle
Server’da ağa bağlı (networked) bir araç oluşturur ve tek çağrıda kurar: plaka, yakıt, görünüm, kilit, routing bucket, doğru amaç için anahtarlar, bir sürücü ve yolcular. Her script aracı için kullan (meslek araçları, kiralıklar, garaj araçları, admin spawn’ları).
Taraf: Server · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>local vehicle = aiLib.spawnVehicle(options) -- entity ya da nil, bir thread içinde çağırParametreler
Prop
Type
SpawnVehicleOptions
Prop
Type
Dönüş değeri
Promise<number | null>: araç entity handle’ı. Model yoksa (asker client’ı öyle söylediyse), entity 5 saniye içinde oluşturulmadıysa ya da tip bilinmiyorsa null.
Örnek
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 },
);Anahtarlar, server plakayı okuyana kadar (en fazla 3 saniye) bekler: sahip client’ın ilk senkronundan önce server boş bir plaka okur. Oturtulan oyuncular oturana kadar en fazla 2 saniye boyunca yeniden yerleştirilir. TypeScript’te bir client’tan gelen model tipi, ikinci bir oyuncunun client’ı aynı cevabı verene kadar yalnızca o oyuncuya hizmet eder; Lua karşılığı aldığı ilk cevabı tutar.
vehicleType
Bir oyuncunun client’ına sorulan bir modelin spawn tipi. Para almadan önce bir modelin var olduğunu kontrol etmek için kullan.
Taraf: Server · Bekler: evet (Promise)
vehicleType(model: string, asker: number): Promise<string | null>Lua karşılığı yok: asker ile aiLib.spawnVehicle bunu kontrol eder ve bilinmeyen bir model için nil döndürür.
Prop
Type
Dönüş değeri
Promise<string | null>: automobile, bike, boat, heli, plane, submarine, trailer ya da train; oyunda böyle bir araç yoksa ya da client geçerli bir cevap vermediyse null. İki farklı oyuncunun client’ı bir cevapta anlaştığında cevap herkes için saklanır; böylece değiştirilmiş tek bir client yalnızca kendi spawn’larını bozabilir.
Örnek
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");
// parayı al, sonra spawnVehicle(...)
return { ok: true };
});randomPlate
Oyunun kendisininkine benzeyen rastgele bir plaka (iki rakam, üç harf, üç rakam) ya da senin ön ekin ve ardından rakamlar.
Taraf: Server · Bekler: hayır
randomPlate(prefix?: string): stringLua karşılığı yok (plaka vermezsen aiLib.spawnVehicle rastgele bir plaka ayarlar).
Prop
Type
Dönüş değeri: 8 karakterlik bir plaka (42ABC123 ya da randomPlate("TAXI") için TAXI1234). Benzersizliği kontrol edilmez: saklamadan önce kendi tablonu kontrol et.
const plate = randomPlate("RENT");Araç bulmak
nearestVehicleTo
Bir oyuncuya metres mesafe içindeki, filtrenden geçen en yakın araç. Oyuncunun oturduğu araç önceliklidir.
Taraf: Server · Bekler: hayır
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): numberlocal vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- entity ya da 0Prop
Type
Dönüş değeri: araç entity’si ya da hiç yoksa 0.
const vehicle = nearestVehicleTo(source, 5);
if (!vehicle) return fail("NO_VEHICLE");Server’daki her aracı dolaşır: komutlar ve aksiyonlar (hız sınırlı) için kullan, asla bir tick içinde değil.
nearestVehicleAt
Bir noktaya metres mesafe içindeki en yakın araç. Bir spawn noktasının boş olduğunu kontrol etmek için kullan.
Taraf: Server · Bekler: hayır
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): numberLua karşılığı yok.
Dönüş değeri: araç entity’si ya da hiç yoksa 0. nearestVehicleTo gibi her aracı dolaşır.
const SPOT = { x: 899.1, y: -180.6, z: 73.8 };
if (nearestVehicleAt(SPOT, 3)) return fail("SPOT_BLOCKED");Client girdisinden entity’ler
Bir client asla bir entity handle’ı değil, bir network id gönderir. Bunlar bir net id’yi canlı server entity’sine çevirir ve kontrol eder; böylece NetworkGetEntityFromNetworkId + DoesEntityExist + GetEntityType zincirini asla elle çağırmazsın.
entityFromNet
Bir client’ın network id’sinin arkasındaki canlı entity.
Taraf: Server · Bekler: hayır
entityFromNet(netId: unknown, type?: 1 | 2 | 3): numberLua karşılığı yok (Lua’da vehicleFromNet var).
Prop
Type
Dönüş değeri: entity ya da değer pozitif bir tam sayı değilse, ağa bağlı değilse, yok olduysa veya başka bir tipteyse 0.
const prop = entityFromNet(rawNetId, 3);
if (!prop) return fail("NOT_FOUND");pedFromNet
entityFromNet(netId, 1): canlı ped ya da 0.
Taraf: Server · Bekler: hayır
pedFromNet(netId: unknown): numberLua karşılığı yok.
const ped = pedFromNet(rawNetId);vehicleFromNet
entityFromNet(netId, 2): canlı araç ya da 0.
Taraf: Server · Bekler: hayır
vehicleFromNet(netId: unknown): numberlocal vehicle = aiLib.vehicleFromNet(netId) -- entity ya da 0const vehicle = vehicleFromNet(rawNetId);
if (!vehicle) return fail("NO_VEHICLE");vehicleNearPlayer
Bir client’ın network id’sinin arkasındaki araç; ama yalnızca oyuncu ona yakınsa (ya da sürücü koltuğundaysa).
Taraf: Server · Bekler: hayır
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): numberlocal vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- entity ya da 0Prop
Type
Dönüş değeri: araç ya da id hatalıysa, araç yok olduysa veya oyuncu çok uzaktaysa / sürücü değilse 0.
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 };
});Anahtarlar
vehicleKeys ai-core’un anahtar katmanı üzerinden gider: sunucunun çalıştırdığı anahtar script’i (ai-vehiclekeys ya da sahibin seçtiği başka biri) cevap verir. Bir araç, bir server entity handle’ı ya da bir plakadır.
vehicleKeys.give
Bir oyuncuya bir aracın anahtarlarını verir.
Taraf: Server · Bekler: hayır
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): voidaiLib.vehicleKeys.give(source, vehicle, purpose)Prop
Type
Dönüş değeri void.
vehicleKeys.give(source, vehicle, "rental");vehicleKeys.remove
Bir oyuncunun bir araca ait anahtarlarını alır.
Taraf: Server · Bekler: hayır
vehicleKeys.remove(source: number, vehicle: number | string): voidaiLib.vehicleKeys.remove(source, vehicle)Dönüş değeri void.
vehicleKeys.remove(source, "RENT1234");vehicleKeys.has
Bir oyuncunun anahtarlara sahip olup olmadığı.
Taraf: Server · Bekler: hayır
vehicleKeys.has(source: number, vehicle: number | string): booleanlocal has = aiLib.vehicleKeys.has(source, vehicle)Dönüş değeri boolean. Anahtar script’i bunu söyleyemiyorsa ya da hiçbiri çalışmıyorsa da true; bu yüzden onu değerli bir şeyin tek kilidi olarak kullanma.
if (!vehicleKeys.has(source, vehicle)) return fail("NO_KEYS");Yakıt
fuel, hangi yakıt script’i çalışıyorsa ai-core’un yakıt katmanı üzerinden bir aracın yakıtını (0 ile 100 arası) okur ve ayarlar. Server’da Lua karşılığı yok: ai-core’un GetVehicleFuel / SetVehicleFuel export’larını çağır.
fuel.get
Taraf: Server · Bekler: hayır
fuel.get(vehicle: number): number | nullDönüş değeri: bir server araç entity’sinin seviyesi (0 ile 100 arası) ya da yakıtı yoksa null.
const level = fuel.get(vehicle) ?? 0;fuel.set
Taraf: Server · Bekler: hayır
fuel.set(vehicle: number, level: number): booleanProp
Type
Dönüş değeri: ayarlandıysa true, yanlış bir araç için false.
fuel.set(vehicle, 100);fuel.provider
Taraf: Server · Bekler: hayır
fuel.provider(): string | nullDönüş değeri: cevap veren yakıt script’inin resource adı (ai-fuel, ox_fuel, LegacyFuel...) ya da hiçbiri çalışmıyorsa null.
console.log(`fuel through ${fuel.provider() ?? "nothing"}`);Garajlar
garages, hangi garaj script’i çalışıyorsa ai-core’un garaj katmanı üzerinden gider; her script yalnızca dışarıya açtığı şeylere cevap verir. Lua karşılığı yok.
garages.impound
Bir aracı otoparka (impound) gönderir ya da by için garaj script’inin impound formunu açar.
Taraf: Server · Bekler: hayır
garages.impound(vehicle: number, by?: number): booleanProp
Type
Dönüş değeri: garaj script’i aracı aldıysa true. Hiçbir şey almadıysa false: aracı kendin sil.
if (!garages.impound(vehicle, source)) DeleteEntity(vehicle);garages.store
Bir aracı bir garaja koyar.
Taraf: Server · Bekler: hayır
garages.store(vehicle: number, garage?: string | null, by?: number): booleanProp
Type
Dönüş değeri: konduysa true, hiçbir şey almadıysa false.
if (!garages.store(vehicle, "legion", source)) return fail("STORE_FAILED");garages.open
Garaj script’inin garaj menüsünü bir oyuncu için açar.
Taraf: Server · Bekler: hayır
garages.open(source: number, garage?: string | null): booleanDönüş değeri: açıldıysa true, script’in böyle bir menüsü yoksa false.
garages.open(source, "pillbox");garages.stored
Bir oyuncunun garajlardaki ya da otoparktaki araçları.
Taraf: Server · Bekler: evet (Promise)
garages.stored(source: number): Promise<GaragedVehicle[] | null>Dönüş değeri: GaragedVehicle[] (plate, model, garage, impounded) ya da script bunu söyleyemiyorsa veya ai-core durmuşsa null.
const list = await garages.stored(source);
const impounded = list?.filter((v) => v.impounded).length ?? 0;garages.provider
Taraf: Server · Bekler: hayır
garages.provider(): string | nullDönüş değeri: cevap veren garaj script’i ya da hiçbiri çalışmıyorsa null.
if (!garages.provider()) console.warn("no garage script runs");