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ür | TypeScript (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’i | new PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...) | Player(serverId).state[key], client’ta LocalPlayer.state[key] |
| Bir entity’nin bag’i | new 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.
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.
| Anahtar | Sabit | Sahip | Değer |
|---|---|---|---|
dead | PLAYER_BAGS.dead | ai-death | Oyuncu 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. |
cuffed | PLAYER_BAGS.cuffed | ai-police | Oyuncu kelepçeliyken true. |
proximity | PLAYER_BAGS.proximity | ai-voice | Ses 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.
| Anahtar | Sabit | Sahip | Değer |
|---|---|---|---|
ai:owned | VEHICLE_BAGS.owned | ai-vehicles | Spawn edilmiş sahipli bir araçta true. |
ai:vid | VEHICLE_BAGS.id | ai-vehicles | Aracın ai-vehicles içindeki id’si (sayı). |
ai:props | VEHICLE_BAGS.props | ai-vehicles | Aracın görünümü ve modifiyesi (VehicleProps). ai-core bunu entity’nin sahibi olan client’ta uygular. |
ai:setup | VEHICLE_BAGS.setup | ai-vehicles | Bir spawn kurulumu (VehicleSetup, örneğin bir dükkanda seçilen renk). ai-core bunu sahip client’ta bir kez uygular. |
fuel | VEHICLE_BAGS.fuel | yakı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ı
| Anahtar | Sabit | Değ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:interaction | CORE.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:pvp | CORE.pvpStateKey | Oyuncular birbirine zarar verebiliyorsa true (panel ayarı pvp, komut /togglepvp). |
ai:inventory | INVENTORY_STATE_KEY | ai-core’un envanter katmanının arkasındaki envanterin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır. |
ai:vehicleKeys | VEHICLE_KEYS_STATE_KEY | Aktif araç anahtarı script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır. |
ai:appearance | APPEARANCE_STATE_KEY | Aktif kıyafet script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır. |
ai:medical | CORE.medicalStateKey | Aktif ölüm script’inin resource adı. |
ai:mdt | CORE.mdtStateKey | Aktif MDT’nin resource adı. |
ai:notify | CORE.notifyStateKey | ai-lib’in kartlarının gittiği bildirim arayüzünün resource adı. Ayarlanmamışsa: ai-lib kendi kartlarını çizer. |
ai:fuel | FUEL_STATE_KEY | Aktif yakıt script’inin resource adı. Hiçbiri çalışmıyorken ayarlanmamıştır. |
ai:garages | GARAGES_STATE_KEY | Aktif 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.
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.
| Anahtar | Nerede | Sahip | Değer |
|---|---|---|---|
door:<id> | GlobalState | ai-doorlock | Kapı kilitliyken true. |
ai:clock | GlobalState | ai-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:weather | GlobalState | ai-weathersync | { type, blackout }: şu anki hava. |
ai:rweather:<id> | GlobalState | ai-weathersync | Bir hava bölgesinin şu anki havası. |
prop:<id> | GlobalState | ai-properties | Mülkün bir sahibi varsa true. |
rob:<id> | GlobalState | ai-robberies | Bir soygun hedefi boşaltılmış ve bekleme süresini beklerken true. |
siren:lx | Vehicle | ai-sirens | Ana siren tonu: 0 kapalı, 1-3 bir ton. |
siren:manu | Vehicle | ai-sirens | Havalı korna / manuel siren: 0 kapalı, 1 korna, 2 manuel, 3 ikisi. |
siren:lightbar | Vehicle | ai-sirens | Araca takılı tepe lambası modeli; yoksa bulunmaz. |
ai-lib arayüz event’leri
Bir oyuncu bir menüyü, girdi diyaloğunu, eşya seçiciyi, mini oyunu ya da istemi cevapladığında veya bir ilerleme çubuğunu iptal ettiğinde ai-lib’in tetiklediği client event’leri - ai-lib’in export’larını kendileri çağıran script’ler için.
Framework köprüsü event’leri
O framework’ler için yazılmış script’ler çalışmaya devam etsin diye ai-core’un tetiklediği ESX, QB / Qbox ve vRP event’leri, tam argümanlarıyla, ve ai-core’un cevapladığı framework event’leri.