AI Core
API başvurusuAI Core: server export’ları

Meslekler ve çeteler

Bir karakterin mesleklerini, çetelerini, rütbelerini ve mesaisini oku ve değiştir, mesaideki oyuncuları say, prime time, meslek ve çete tanımlarını oku.

Bir karakter birden fazla meslek ve birden fazla çeteye sahip olabilir (panelin Most jobs per character ve Most gangs per character ayarlarına kadar). Aynı anda en fazla bir meslekte mesaide olunur ve yalnızca o meslek maaş öder. En fazla bir çete aktiftir. Meslekler ve çeteler, rütbeleriyle birlikte, admin panelinde tanımlanır (Jobs ve Gangs bölümleri).

Bir rütbe, mesleğin rütbe listesindeki 0’dan sayılan bir konumdur: rütbe 0 paneldeki ilk satır, rütbe 1 ikinci satır vb.

Her değişiklik bir server event’i tetikler (ai-core:jobsChanged, ai-core:dutyChanged, ai-core:gangsChanged, ai-core:activeGangChanged) ve oyuncunun kendi oyununa ulaşır. Birçok oyuncunun mesleklerine ihtiyaç duyan resource’lar, her oyuncu için aşağıdaki export’ları çağırmak yerine bu event’leri lib’in online aynası üzerinden izler. Bkz. Event’ler ve durum.

GetJobs

Bir oyuncunun karakterinin her meslek üyeliği.

Taraf: Server · Bekler: hayır · Lib: online.jobs(source) aynısını lib’in aynasından okur

İmza
GetJobs(src: number): JobMembership[] | null
Lua
local jobs = exports['ai-core']:GetJobs(source) -- { job, grade } listesi ya da nil

Parametreler

Prop

Type

Dönüş değeri

JobMembership[] | null: meslek başına bir { job, grade } (JobMembership). Karakterin mesleği yoksa boş liste (panelin işsiz mesleği asla saklanmaz). Oyuncunun yüklü karakteri yoksa null.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Bir iş merkezi ekranı oyuncunun mesleklerini etiketleriyle listeler.
onClientCallback("myscript:myJobs", (source) => {
  const jobs = core.GetJobs(source);
  if (!jobs) return fail("NO_CHARACTER");
  return {
    ok: true,
    jobs: jobs.map(({ job, grade }) => ({
      job,
      label: core.GetJobDefinition(job)?.label ?? job,
      grade,
    })),
  };
});

GetCurrentJob

Diğer script’lerin oyuncunun "asıl" mesleği olarak ele alması gereken tek meslek: mesaideki meslek, yoksa oyuncunun en son mesaide olduğu meslek, yoksa ilk meslek, yoksa panelin işsiz mesleği. ESX ve QB script’leri bu mesleği köprü üzerinden görür.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
GetCurrentJob(src: number): JobMembership | null
Lua
local job = exports['ai-core']:GetCurrentJob(source) -- { job, grade } ya da nil

Parametreler

Prop

Type

Dönüş değeri

JobMembership | null: { job, grade }. Hiç mesleği olmayan bir karakter için işsiz meslektir (panel ayarı, varsayılan unemployed), rütbe 0 ile. Yalnızca oyuncunun yüklü karakteri yoksa null.

Örnek

import { addCommand, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

addCommand("job", { help: "Shows a player job", params: [{ name: "id", type: "playerId" }], restricted: true }, (_source, args) => {
  const job = core.GetCurrentJob(args.id);
  if (job) console.log(`${job.job} grade ${job.grade}`);
});

GetDutyJob

Oyuncunun şu an mesaide olduğu meslek. Her "bunu yalnızca mesaideki polis yapabilir" kontrolü için kullan.

Taraf: Server · Bekler: hayır · Lib: online.dutyJob(source) aynısını lib’in aynasından okur

İmza
GetDutyJob(src: number): string | null
Lua
local job = exports['ai-core']:GetDutyJob(source) -- meslek adı ya da nil

Parametreler

Prop

Type

Dönüş değeri

string | null: meslek adı. Oyuncu mesai dışındaysa ya da yüklü karakteri yoksa null.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback("myscript:openArmory", (source) => {
  if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
  return { ok: true };
});

SetDuty

Bir oyuncuyu mesleklerinden birinde mesaiye alır (ve diğer her meslekte mesai dışına çıkarır) ya da mesai dışına çıkarır.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
SetDuty(src: number, job: string | null): boolean
Lua
local ok = exports['ai-core']:SetDuty(source, 'police') -- nil = mesai dışı

Parametreler

Prop

Type

Dönüş değeri

boolean: oyuncu artık job için mesaideyse (ya da null için mesai dışındaysa) true, hiçbir şeyin değişmesi gerekmediğinde de. Oyuncu job’a sahip değilse ya da yüklü karakteri yoksa false.

Örnek

import { onClientCallback, resourceExport, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const LOCKER_ROOM = { x: 452.3, y: -993.2, z: 30.7 };

// Karakoldaki soyunma odasında bir mesai anahtarı.
onClientCallback("myscript:toggleDuty", { guards: [near(LOCKER_ROOM, 3)] }, (source) => {
  const onDuty = core.GetDutyJob(source) === "police";
  return core.SetDuty(source, onDuty ? null : "police") ? { ok: true, onDuty: !onDuty } : fail("NOT_POLICE");
});

Mesai kaydedilmez: giriş yapan bir oyuncu mesai dışıdır, panelin Keep duty after rejoining ayarı açık değilse.

SetJob

Bir oyuncuya bir meslek verir ya da zaten sahip olduğu bir mesleğin rütbesini değiştirir.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
SetJob(src: number, job: string, grade: number): boolean
Lua
local ok = exports['ai-core']:SetJob(source, 'mechanic', 0)

Parametreler

Prop

Type

Dönüş değeri

boolean: karakter artık job mesleğinde grade rütbesindeyse true. Meslek yoksa, rütbe yoksa (tam sayı değil, 0’ın altında ya da son rütbeyi geçiyor), karakter zaten Most jobs per character’ın izin verdiği kadar mesleğe sahipse ya da oyuncunun yüklü karakteri yoksa false.

Panelin Several jobs per character ayarı kapalıyken yeni bir meslek karakterin diğer mesleğinin yerini alır.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readText } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Bir iş merkezi: herkes panelin listelediği bir mesleği rütbe 0’da alabilir.
onClientCallback(
  "myscript:takeJob",
  { args: ([job]) => { const name = readText(job, 32); return name ? [name] : null; } },
  (source, job) => {
    if (!core.GetJobDefinition(job)?.listed) return fail("JOB_NOT_LISTED");
    return core.SetJob(source, job, 0) ? { ok: true } : fail("JOB_LIMIT");
  },
);

RemoveJob

Bir oyuncudan bir mesleği alır. O meslekte mesaide olan bir oyuncu önce mesai dışına çıkar.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
RemoveJob(src: number, job: string): boolean
Lua
local ok = exports['ai-core']:RemoveJob(source, 'mechanic')

Parametreler

Prop

Type

Dönüş değeri

boolean: meslek kaldırıldığında true. Karakter ona sahip değilse ya da oyuncunun yüklü karakteri yoksa false.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readText } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback(
  "myscript:quitJob",
  { args: ([job]) => { const name = readText(job, 32); return name ? [name] : null; } },
  (source, job) => (core.RemoveJob(source, job) ? { ok: true } : fail("NOT_MEMBER")),
);

GetOnDutyCount

Şu an bir meslekte kaç oyuncunun mesaide olduğu. "2 polis çevrimiçi olmalı" kuralları için kullan.

Taraf: Server · Bekler: hayır · Lib: yok (online.countOnDuty(jobs) lib’in aynasından birkaç mesleği sayar)

İmza
GetOnDutyCount(job: string): number
Lua
local officers = exports['ai-core']:GetOnDutyCount('police')

Parametreler

Prop

Type

Dönüş değeri

number: job için mesaideki oyuncular. Kimse yoksa ya da bilinmeyen bir meslek için 0. Aynı sayı client script’leri için GlobalState ai:duty:<job> içindedir.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const POLICE_NEEDED = 2;

onClientCallback("myscript:startRobbery", { lock: true }, (source) => {
  if (core.GetOnDutyCount("police") < POLICE_NEEDED) return fail("NOT_ENOUGH_POLICE");
  // ... soygunu başlat
  return { ok: true };
});

IsPrimeTime

Bir meslek için şu an prime time olup olmadığı. Prime time saatleri panelin seçtiği kaynaktan gelir: çalışırken kendi saatlerini tutan bir script (tgiann-policealert), yoksa ai-core’un kendi saatleri (mesleğin kendi aralığı ya da varsayılan). Yoğun saatlerle değişen kurallar için kullan, daha fazla ödeyen bir soygun gibi.

Taraf: Server · Bekler: hayır · Lib: isPrimeTime(job?)

İmza
IsPrimeTime(job?: string): boolean
Lua
local prime = exports['ai-core']:IsPrimeTime('police')

Parametreler

Prop

Type

Dönüş değeri

boolean: prime time sırasında true. Saatler sunucunun yerel saatidir; başlangıcı bitişinden geç olan bir aralık gece yarısını geçer, aynı başlangıç ve bitiş de tüm gün demektir. Panel kaynak olarak bir script seçtiğinde ve o script durmuşsa her saat prime time sayılır. Maaşın prime time kesintisi açık olsun olmasın çalışır.

Örnek

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

/** Bir dükkan soygunu polis prime time’ı dışında %50 daha fazla öder. */
export function robberyReward(base: number): number {
  return core.IsPrimeTime("police") ? base : Math.round(base * 1.5);
}

GetJobDefinitions

Paneldeki her meslek tanımı, tek bir kopya olarak. Bir listeyi bir kez kurmak gibi seyrek okumalar için kullan; tek bir meslek için GetJobDefinition kullan.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
GetJobDefinitions(): Record<string, JobDefinition>
Lua
local jobs = exports['ai-core']:GetJobDefinitions() -- meslek adına göre anahtarlanmış tablo

Parametreler

Yok.

Dönüş değeri

Record<string, JobDefinition>: ada göre anahtarlanmış her meslek. Her birinin label, type, defaultDuty, listed (iş merkezlerinde gösterilir) ve grades’i (her biri label, salary ve boss ile) vardır. Bkz. JobDefinition ve GradeDefinition.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

// İş merkezi panelde "listed" olarak işaretli her mesleği listeler.
onClientCallback("myscript:jobCenter", () => ({
  ok: true,
  jobs: Object.entries(core.GetJobDefinitions())
    .filter(([, def]) => def.listed)
    .map(([name, def]) => ({ name, label: def.label, salary: def.grades[0]?.salary ?? 0 })),
}));

Lua’da def.grades[1] rütbe 0’dır: Lua listeleri 1’den, rütbeler 0’dan başlar.

GetJobDefinition

Tek bir mesleğin tanımı: etiket, tip, varsayılan mesai, iş merkezlerinin onu listeleyip listelemediği ve rütbeleri.

Taraf: Server · Bekler: hayır · Lib: definitions.job(name) (her mesleği bir kez okur ve panel onu değiştirdiğinde unutur)

İmza
GetJobDefinition(job: string): JobDefinition | null
Lua
local def = exports['ai-core']:GetJobDefinition('police') -- tablo ya da nil

Parametreler

Prop

Type

Dönüş değeri

JobDefinition | null: meslek (JobDefinition). Bilinmeyen bir meslek ya da metin olmayan bir değer için null.

Örnek

import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Patron menüsünü yalnızca patron rütbesi açabilir.
onClientCallback("myscript:bossMenu", (source) => {
  const job = online.dutyJob(source);
  const grade = job ? online.jobGrade(source, job) : null;
  if (!job || grade === null) return fail("NOT_ON_DUTY");
  if (!core.GetJobDefinition(job)?.grades[grade]?.boss) return fail("NOT_BOSS");
  return { ok: true };
});

GetGangs

Bir oyuncunun karakterinin her çete üyeliği.

Taraf: Server · Bekler: hayır · Lib: online.gangs(source) aynısını lib’in aynasından okur

İmza
GetGangs(src: number): GangMembership[] | null
Lua
local gangs = exports['ai-core']:GetGangs(source) -- { gang, grade } listesi ya da nil

Parametreler

Prop

Type

Dönüş değeri

GangMembership[] | null: çete başına bir { gang, grade } (GangMembership). Çete yoksa boş liste. Oyuncunun yüklü karakteri yoksa null.

Örnek

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

/** Bir oyuncunun herhangi bir çeteye (aktif olsun olmasın) ait olup olmadığı. */
export function inAnyGang(source: number): boolean {
  return (core.GetGangs(source)?.length ?? 0) > 0;
}

GetActiveGang

Oyuncunun şu an aktif olan çetesi. Çete bölgesi, çete stash’leri ve çete sohbetleri aktif çeteyi kullanmalıdır.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
GetActiveGang(src: number): string | null
Lua
local gang = exports['ai-core']:GetActiveGang(source) -- çete adı ya da nil

Parametreler

Prop

Type

Dönüş değeri

string | null: çete adı. Aktif çete yoksa ya da oyuncunun yüklü karakteri yoksa null.

Örnek

import { onClientCallback, inventory, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback("myscript:gangStash", (source) => {
  const gang = core.GetActiveGang(source);
  if (!gang) return fail("NO_GANG");
  return inventory.openInventory(source, `gang_${gang}`) ? { ok: true } : fail("STASH_FAILED");
});

SetGang

Bir oyuncuyu bir çeteye ekler ya da ait olduğu bir çetedeki rütbesini değiştirir. Aktif çetesi olmayan bir karakter yeni çeteyi aktif olarak alır.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
SetGang(src: number, gang: string, grade: number): boolean
Lua
local ok = exports['ai-core']:SetGang(source, 'ballas', 0)

Parametreler

Prop

Type

Dönüş değeri

boolean: karakter artık gang çetesinde grade rütbesindeyse true. Çete ya da rütbe yoksa, karakter zaten Most gangs per character’ın izin verdiği kadar çeteye aitse ya da oyuncunun yüklü karakteri yoksa false. Panelin Several gangs per character ayarı kapalıyken yeni çete eskisinin yerini alır.

Örnek

import { addCommand, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

addCommand("setgang", {
  help: "Adds a player to a gang",
  params: [{ name: "id", type: "playerId" }, { name: "gang", type: "string" }, { name: "grade", type: "number" }],
  restricted: true,
}, (_source, args) => {
  console.log(core.SetGang(args.id, args.gang, args.grade) ? "done" : "refused");
});

RemoveGang

Bir oyuncuyu bir çeteden çıkarır. Aktif çete buysa, kalan bir sonraki çete aktif olur (ya da hiçbiri).

Taraf: Server · Bekler: hayır · Lib: yok

İmza
RemoveGang(src: number, gang: string): boolean
Lua
local ok = exports['ai-core']:RemoveGang(source, 'ballas')

Parametreler

Prop

Type

Dönüş değeri

boolean: üyelik kaldırıldığında true. Karakter o çetede değilse ya da oyuncunun yüklü karakteri yoksa false.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback("myscript:leaveGang", (source) => {
  const gang = core.GetActiveGang(source);
  return gang && core.RemoveGang(source, gang) ? { ok: true } : fail("NO_GANG");
});

SetActiveGang

Oyuncunun çetelerinden hangisinin aktif olduğunu seçer ya da hiçbirini.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
SetActiveGang(src: number, gang: string | null): boolean
Lua
local ok = exports['ai-core']:SetActiveGang(source, 'vagos') -- nil = aktif çete yok

Parametreler

Prop

Type

Dönüş değeri

boolean: gang artık aktifse (zaten aktifse de) true. Karakter o çetede değilse ya da oyuncunun yüklü karakteri yoksa false. Aktif çete kaydedilir.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readText } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback(
  "myscript:pickGang",
  { args: ([gang]) => { const name = readText(gang, 32); return name ? [name] : null; } },
  (source, gang) => (core.SetActiveGang(source, gang) ? { ok: true } : fail("NOT_MEMBER")),
);

GetGangDefinitions

Paneldeki her çete tanımı, tek bir kopya olarak.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
GetGangDefinitions(): Record<string, GangDefinition>
Lua
local gangs = exports['ai-core']:GetGangDefinitions() -- çete adına göre anahtarlanmış tablo

Parametreler

Yok.

Dönüş değeri

Record<string, GangDefinition>: ada göre anahtarlanmış her çete, her biri label ve grades ile. Bkz. GangDefinition.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

onClientCallback("myscript:gangList", () => ({
  ok: true,
  gangs: Object.entries(core.GetGangDefinitions()).map(([name, def]) => ({ name, label: def.label })),
}));

GetGangDefinition

Tek bir çetenin tanımı: etiketi ve rütbeleri.

Taraf: Server · Bekler: hayır · Lib: definitions.gang(name)

İmza
GetGangDefinition(gang: string): GangDefinition | null
Lua
local def = exports['ai-core']:GetGangDefinition('ballas') -- tablo ya da nil

Parametreler

Prop

Type

Dönüş değeri

GangDefinition | null: çete (GangDefinition). Bilinmeyen bir çete ya da metin olmayan bir değer için null.

Örnek

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

/** "ballas" için "Ballas", bilinmeyen bir çete için adın kendisi. */
export function gangLabel(gang: string): string {
  return core.GetGangDefinition(gang)?.label ?? gang;
}

Bu sayfada