Üyelik ve oyuncu verisi
hasJob, inGang, onDutyIn, allows, onMembershipChange, getPlayerData, onPlayerData ve seedPlayerData - ai-core’un gönderdiği haliyle yerel oyuncunun karakteri, parası, meslekleri, görev durumu ve çeteleri.
ai-core yerel oyuncunun kendi verisini onun client’ına gönderir: karakter yüklendiğinde bir snapshot, sonra yalnızca değişen değerler. Bu yardımcılar o kopyayı okur; bu yüzden bir kontrol bir bellek okumasına mal olur ve asla server’a sormaz.
Onları oyuncunun gördükleri için kullan (bir noktanın canShow’u, bir radyal öğesi, bir menü satırı). Oyuncunun aynı veriyle ne yapabileceğine server karar verir (Oyuncular ve karakterler sayfasındaki online): bir client kontrolü asla kanıt değildir.
Oyuncu verisi
ai-core’un tuttuğu değerler, anahtara göre (AiPlayerData):
Prop
Type
Üye tipleri CharacterInfo, JobMembership ve GangMembership’dir.
getPlayerData
Tek bir anahtarın son değeri. Resource’undaki ilk kullanımda ai-core’un zaten gönderdiği her şeyi de okur (ai-core’un GetPlayerData export’undan); böylece oyuncu yüklendikten sonra yeniden başlatılan bir resource değerlere hemen sahip olur.
Taraf: Client · Bekler: hayır
getPlayerData<K extends keyof AiPlayerData>(key: K): AiPlayerData[K] | undefinedlocal value = aiLib.playerData.get(key)Parametreler
Prop
Type
Dönüş değeri
AiPlayerData[K] | undefined: değer ya da henüz hiçbir şey gelmediyse (yüklü karakter yok, ai-core başlamadı) undefined (Lua’da nil).
Örnek
import { getPlayerData, notify } from "@aicore-fivem/lib/client";
RegisterCommand(
"whoami",
() => {
const character = getPlayerData("character");
const job = getPlayerData("job");
const cash = getPlayerData("money")?.cash ?? 0;
if (!character) return notify("No character loaded", "error");
notify(`${job?.job ?? "unemployed"} (${job?.grade ?? 0}), $${cash}`, "info");
},
false,
);onPlayerData
ai-core bu oyuncu için bir anahtar gönderdiğinde her seferinde bir handler çalıştırır.
Taraf: Client · Bekler: hayır
onPlayerData<K extends keyof AiPlayerData>(key: K, handler: (value: AiPlayerData[K]) => void): () => voidaiLib.playerData.onChange(key, function(value) end)Parametreler
Prop
Type
Dönüş değeri
TypeScript: () => void, handler’ı kaldıran bir fonksiyon. Lua hiçbir şey döndürmez.
Örnek
import { onPlayerData } from "@aicore-fivem/lib/client";
const stop = onPlayerData("money", (money) => {
SendNUIMessage({ action: "money", data: { cash: money.cash ?? 0, bank: money.bank ?? 0 } });
});
// HUD tamamen kapandığında stop()Resource’un başlamadan önce gönderilen değerler handler’a yeniden oynatılmaz. Açılışta güncel değeri getPlayerData ile bir kez oku, sonra değişiklikleri onPlayerData ile takip et.
seedPlayerData
Değerleri elle doldurur. Zaten değeri olan anahtarlar korunur. Buna ihtiyacın yok: lib ilk kullanımda kendini ai-core’dan doldurur.
Taraf: Client · Bekler: hayır
seedPlayerData(data: Partial<AiPlayerData>): voidLua karşılığı yok.
Parametreler
Prop
Type
Dönüş değeri
void.
Örnek
import { seedPlayerData } from "@aicore-fivem/lib/client";
// ai-core olmayan bir test düzeneği.
seedPlayerData({ jobs: [{ job: "police", grade: 3 }], duty: "police" });Üyelik kontrolleri
hasJob
Görevde olsun ya da olmasın oyuncunun mesleklerden birini minimum bir rütbede tutup tutmadığı.
Taraf: Client · Bekler: hayır
hasJob(jobs: readonly string[], minGrade?: number): booleanLua karşılığı yok: aiLib.playerData.get('jobs')’u dolaş (bkz. points.add Lua örneği).
Parametreler
Prop
Type
Dönüş değeri
boolean: liste boşsa ya da oyuncu jobs’tan birini minGrade veya üstünde tutuyorsa true.
Örnek
import { hasJob, onMembershipChange, Points } from "@aicore-fivem/lib/client";
const points = new Points();
points.add("armory", {
coords: { x: 482.6, y: -995.2, z: 30.7 },
label: "Armory",
canShow: () => hasJob(["police", "sheriff"], 1),
onPressed: () => emitNet("mypolice:armory"),
});
onMembershipChange(() => points.refresh());inGang
Oyuncunun çetelerden birinde minimum bir rütbede olup olmadığı.
Taraf: Client · Bekler: hayır
inGang(gangs: readonly string[], minGrade?: number): booleanLua karşılığı yok: aiLib.playerData.get('gangs')’i dolaş.
Parametreler
Prop
Type
Dönüş değeri
boolean: liste boşsa ya da oyuncu gangs’ten birinde minGrade veya üstündeyse true.
Örnek
import { inGang, radial } from "@aicore-fivem/lib/client";
radial.add({
id: "mygang:stash",
label: "Gang stash",
icon: "box",
canShow: () => inGang(["ballas", "vagos"], 2),
onPressed: () => emitNet("mygang:stash"),
});onDutyIn
Oyuncunun mesleklerden birinde görevde olup olmadığı.
Taraf: Client · Bekler: hayır
onDutyIn(jobs: readonly string[]): booleanLua karşılığı yok: aiLib.playerData.get('duty') görevdeki meslektir.
Parametreler
Prop
Type
Dönüş değeri
boolean: oyuncunun görevdeki mesleği jobs içindeyse true.
Örnek
import { onDutyIn, Points } from "@aicore-fivem/lib/client";
const points = new Points();
points.addVehicle("mymech:repair", {
label: "Repair",
icon: "wrench",
canShow: () => onDutyIn(["mechanic"]),
onPressed: (vehicle) => emitNet("mymech:repair", NetworkGetNetworkIdFromEntity(vehicle)),
});onMembershipChange
Oyuncunun meslekleri, görev durumu ya da çeteleri değiştiğinde bir fonksiyon çalıştırır. canShow’u bunları okuyan noktaları ve blip’leri yenilemek için kullan.
Taraf: Client · Bekler: hayır
onMembershipChange(fn: () => void): voidLua karşılığı yok: jobs, duty ve gangs için aiLib.playerData.onChange.
Parametreler
Prop
Type
Dönüş değeri
void.
Örnek
import { onMembershipChange, Points, radial } from "@aicore-fivem/lib/client";
const points = new Points();
onMembershipChange(() => {
points.refresh();
radial.refresh();
});allows
Yerel oyuncunun bir erişim kuralı olan bir yeri kullanıp kullanamayacağı. Server’ın online.allows(source, rule)’u aynı kuralla karar verir; böylece oyuncunun gördüğü, server’ın kullanmasına izin verdiğiyle tam olarak aynıdır. Kuralı bir panel kaydından readAccess(record) (@aicore-fivem/lib/shared) ile oku.
Taraf: Client · Bekler: hayır
allows(rule: AccessRule): booleanLua karşılığı yok.
Parametreler
Prop
Type
AccessRule
Prop
Type
Tipi AccessRule’dır.
Dönüş değeri
boolean: iki liste de boşsa (herkes); oyuncu gangs’ten birinde minimum rütbesindeyse; ya da oyuncu jobs’tan birini minimum rütbesinde tutuyorsa (ve onDuty ise o meslekte görevdeyse) true. Aksi halde false.
Örnek
import { AdminWorld, allows, callAction, onMembershipChange, Points } from "@aicore-fivem/lib/client";
import { readAccess, readVec3, RecordObjects, type AccessRule } from "@aicore-fivem/lib/shared";
const world = new AdminWorld(["stashes"]);
const points = new Points();
interface Stash { coords: { x: number; y: number; z: number }; access: AccessRule }
const readStash = (_key: string, raw: Record<string, unknown>): Stash | null => {
const coords = readVec3(raw.coords);
return coords ? { coords, access: readAccess(raw) } : null;
};
new RecordObjects(world, "stashes", readStash, (id, stash) => {
points.add(id, {
coords: stash.coords,
label: "Stash",
canShow: () => allows(stash.access),
onPressed: () => callAction("mystash:open", [id], { fallback: "STASH_FAILED" }),
});
return () => points.remove(id);
});
onMembershipChange(() => points.refresh());Kamera ve zamanlama
ScriptCamera, TickLoop, AreaFollower ve ServerClock - script kameraları, yalnızca gerektiğinde çalışan kare başı görevler, oyuncunun alanını server’a bildirmek ve server’ın saatini client’ta kullanmak.
Lib: server
@aicore-fivem/lib/server ve aiLib’in server tarafı: ne oldukları, TypeScript ve Lua’da nasıl yüklendikleri ve tüm konu sayfaları.