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
GetJobs(src: number): JobMembership[] | nulllocal jobs = exports['ai-core']:GetJobs(source) -- { job, grade } listesi ya da nilParametreler
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
GetCurrentJob(src: number): JobMembership | nulllocal job = exports['ai-core']:GetCurrentJob(source) -- { job, grade } ya da nilParametreler
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
GetDutyJob(src: number): string | nulllocal job = exports['ai-core']:GetDutyJob(source) -- meslek adı ya da nilParametreler
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
SetDuty(src: number, job: string | null): booleanlocal 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
SetJob(src: number, job: string, grade: number): booleanlocal 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
RemoveJob(src: number, job: string): booleanlocal 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)
GetOnDutyCount(job: string): numberlocal 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?)
IsPrimeTime(job?: string): booleanlocal 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
GetJobDefinitions(): Record<string, JobDefinition>local jobs = exports['ai-core']:GetJobDefinitions() -- meslek adına göre anahtarlanmış tabloParametreler
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)
GetJobDefinition(job: string): JobDefinition | nulllocal def = exports['ai-core']:GetJobDefinition('police') -- tablo ya da nilParametreler
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
GetGangs(src: number): GangMembership[] | nulllocal gangs = exports['ai-core']:GetGangs(source) -- { gang, grade } listesi ya da nilParametreler
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
GetActiveGang(src: number): string | nulllocal gang = exports['ai-core']:GetActiveGang(source) -- çete adı ya da nilParametreler
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
SetGang(src: number, gang: string, grade: number): booleanlocal 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
RemoveGang(src: number, gang: string): booleanlocal 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
SetActiveGang(src: number, gang: string | null): booleanlocal ok = exports['ai-core']:SetActiveGang(source, 'vagos') -- nil = aktif çete yokParametreler
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
GetGangDefinitions(): Record<string, GangDefinition>local gangs = exports['ai-core']:GetGangDefinitions() -- çete adına göre anahtarlanmış tabloParametreler
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)
GetGangDefinition(gang: string): GangDefinition | nulllocal def = exports['ai-core']:GetGangDefinition('ballas') -- tablo ya da nilParametreler
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;
}