AI Core
API başvurusuEvent’ler ve durum

State bag’ler

ai-core’un ve ai-* script’lerinin yayımladığı ortak durum değerleri - oyuncu bag’leri, araç bag’leri ve GlobalState anahtarları - her birinin ne tuttuğu, kimin yazdığı ve nasıl okunup izleneceği.

Bir state bag, FiveM’in herkes için senkron tuttuğu bir değerdir: GlobalState’te (tüm sunucu için tek değer), bir oyuncuda ya da bir entity’de (bir araç). Her taraftaki her resource onu okuyabilir ve kendi event’in olmadan değişiklikleri izler. ai-core ve ai-* script’leri bunları herkesin ihtiyaç duyduğu durum için kullanır, asla özel veri için değil.

Salt okunur. Aşağıdaki her anahtarın tek bir sahip resource’u vardır; onu yazan tek resource odur, her zaman server’dan. Bu anahtarları asla kendin yazma, ne server’dan ne client’tan: sahibi senin üzerine yazar ve diğer script’ler yanlış durum görür. Durumu değiştirmek için sahibinin export’unu çağır (örneğin ai-death’in canlandırması, ai-core’un mesai export’u).

Nasıl okunur

Lib’in her tür için bir sınıfı vardır. Her biri yerel bir kopya tutar, bu yüzden get’in maliyeti yoktur ve onChange dinleyicini bir değişiklikten sonra çalıştırır.

TürTypeScript (lib)Lua
Tek bir GlobalState anahtarınew GlobalKey(key, parse): .get(), .onChange((_, value, old) => ...)GlobalState[key], AddStateBagChangeHandler(key, 'global', fn)
Tek önekli birçok GlobalState anahtarınew GlobalGroup(prefix, parse): .get(id), .ids(), .onChange((id, value, old) => ...)GlobalState[prefix .. id]
Bir oyuncunun bag’inew PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...)Player(serverId).state[key], client’ta LocalPlayer.state[key]
Bir entity’nin bag’inew EntityState(key, parse): .get(entity), .getByNetId(netId), .onChange((netId, value, old) => ...)Entity(entity).state[key]

parse ham değeri kontrol eder: lib’den stateNumber, stateBoolean, stateString ya da kötü bir değer için undefined döndüren kendi fonksiyonun. Hepsi @aicore-fivem/lib/client ya da @aicore-fivem/lib/server’dan gelir.

resource/client/index.ts
import { cache, GlobalKey, PlayerState, stateBoolean, stateNumber } from "@aicore-fivem/lib/client";
import { dutyCountKey, PLAYER_BAGS } from "@aicore-fivem/shared";

const policeOnDuty = new GlobalKey(dutyCountKey("police"), stateNumber);
const cuffed = new PlayerState(PLAYER_BAGS.cuffed, stateBoolean);

console.log(`police on duty: ${policeOnDuty.get() ?? 0}`);
policeOnDuty.onChange((_, count) => console.log(`police on duty now: ${count ?? 0}`));

cuffed.onChange((serverId, value) => {
  if (serverId === cache.serverId) console.log(value ? "you are cuffed" : "you are free");
});

Oyuncu bag’leri (PLAYER_BAGS)

Birkaç resource’un bir oyuncuda okuduğu anahtarlar. Sabit: @aicore-fivem/shared içinde PLAYER_BAGS.

AnahtarSabitSahipDeğer
deadPLAYER_BAGS.deadai-deathOyuncu yerdeyken true. Aksi halde yok ya da false. Başka bir ölüm script’iyle bunun yerine sağlık katmanını (IsDead export’u, lib medical) kullan: diğer ölüm script’leri kendi anahtarlarını kullanır.
cuffedPLAYER_BAGS.cuffedai-policeOyuncu kelepçeliyken true.
proximityPLAYER_BAGS.proximityai-voiceSes menzili, pma-voice’un şekli: { index, distance, mode }.

Araç bag’leri (VEHICLE_BAGS)

Araç entity’lerindeki anahtarlar. Sabit: @aicore-fivem/shared içinde VEHICLE_BAGS.

AnahtarSabitSahipDeğer
ai:ownedVEHICLE_BAGS.ownedai-vehiclesSpawn edilmiş sahipli bir araçta true.
ai:vidVEHICLE_BAGS.idai-vehiclesAracın ai-vehicles içindeki id’si (sayı).
ai:propsVEHICLE_BAGS.propsai-vehiclesAracın görünümü ve modifiyesi (VehicleProps). ai-core bunu entity’nin sahibi olan client’ta uygular.
ai:setupVEHICLE_BAGS.setupai-vehiclesBir spawn kurulumu (VehicleSetup, örneğin bir dükkanda seçilen renk). ai-core bunu sahip client’ta bir kez uygular.
fuelVEHICLE_BAGS.fuelyakıt script’i (ai-fuel; ai-core bunu client tarafı yakıt script’leri için tutar)Yakıt seviyesi, 0-100.

Yakıtı okumak için lib’in fuel katmanını kullan: her yakıt script’iyle çalışır, fuel bag’ini kendileri yazmayanlarla da.

ai-core’un GlobalState anahtarları

AnahtarSabitDeğer
ai:duty:<job>dutyCountKey(job) (önek DUTY_COUNT_PREFIX)O meslekte kaç oyuncunun mesaide olduğu (sayı). Yalnızca sayılar, asla kim olduğu değil.
ai:interactionCORE.interactionStateKey"prompt" ya da "target": lib’in Points’inin oyuncuların nasıl etkileşim kurmasına izin verdiği (ai-core panel ayarı).
ai:pvpCORE.pvpStateKeyOyuncular birbirine zarar verebiliyorsa true (panel ayarı pvp, komut /togglepvp).
ai:inventoryINVENTORY_STATE_KEYai-core’un envanter katmanının arkasındaki envanterin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır.
ai:vehicleKeysVEHICLE_KEYS_STATE_KEYAktif araç anahtarı script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır.
ai:appearanceAPPEARANCE_STATE_KEYAktif kıyafet script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır.
ai:medicalCORE.medicalStateKeyAktif ölüm script’inin resource adı.
ai:mdtCORE.mdtStateKeyAktif MDT’nin resource adı.
ai:notifyCORE.notifyStateKeyai-lib’in kartlarının gittiği bildirim arayüzünün resource adı. Ayarlanmamışsa: ai-lib kendi kartlarını çizer.
ai:fuelFUEL_STATE_KEYAktif yakıt script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır.
ai:garagesGARAGES_STATE_KEYAktif garaj script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır.

Resource adı anahtarları ai-core’un client yarılarına hangi script’le konuşacaklarını söyler. Hangi script’in çalıştığını bilmen gerektiğinde oku (bir log satırı, oyuncuya bir ipucu için), o script’i doğrudan çağırmak için değil: onun yerine ai-core’un katmanını çağır.

resource/server/index.ts
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
import { CORE } from "@aicore-fivem/shared";

const pvp = new GlobalKey(CORE.pvpStateKey, stateBoolean);

pvp.onChange((_, on) => console.log(on ? "PvP is on" : "PvP is off"));

Diğer ai-* script’lerinin anahtarları

Bazı ai-* script’lerinin, onlarla çalışan script’ler için yayımladığı ortak durum. Ayrıntılar her script’in developer sayfasındadır.

AnahtarNeredeSahipDeğer
door:<id>GlobalStateai-doorlockKapı kilitliyken true.
ai:clockGlobalStateai-weathersync{ base, at, scale, frozen }: server zamanı at’teki (ms) günün oyun dakikaları, gerçek dakika başına scale oyun dakikası ilerler. Client’lar saati buradan kendileri çalıştırır.
ai:weatherGlobalStateai-weathersync{ type, blackout }: şu anki hava.
ai:rweather:<id>GlobalStateai-weathersyncBir hava bölgesinin şu anki havası.
prop:<id>GlobalStateai-propertiesMülkün bir sahibi varsa true.
rob:<id>GlobalStateai-robberiesBir soygun hedefi boşaltılmış ve bekleme süresini beklerken true.
siren:lxVehicleai-sirensAna siren tonu: 0 kapalı, 1-3 bir ton.
siren:manuVehicleai-sirensHavalı korna / manuel siren: 0 kapalı, 1 korna, 2 manuel, 3 ikisi.
siren:lightbarVehicleai-sirensAraca takılı tepe lambası modeli; yoksa bulunmaz.

Bu sayfada