AI Core
API başvurusuLib: client

Ü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

Signature
getPlayerData<K extends keyof AiPlayerData>(key: K): AiPlayerData[K] | undefined
Lua
local 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

Signature
onPlayerData<K extends keyof AiPlayerData>(key: K, handler: (value: AiPlayerData[K]) => void): () => void
Lua
aiLib.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

Signature
seedPlayerData(data: Partial<AiPlayerData>): void

Lua 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

Signature
hasJob(jobs: readonly string[], minGrade?: number): boolean

Lua 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

Signature
inGang(gangs: readonly string[], minGrade?: number): boolean

Lua 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

Signature
onDutyIn(jobs: readonly string[]): boolean

Lua 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

Signature
onMembershipChange(fn: () => void): void

Lua 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

Signature
allows(rule: AccessRule): boolean

Lua 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

resource/client/index.ts
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());

Bu sayfada