Prace i gangi
Odczytuj i zmieniaj prace, gangi, stopnie i służbę postaci, licz graczy na służbie, godziny szczytu, odczytuj definicje prac i gangów.
Postać może mieć kilka prac i kilka gangów (do wartości Most jobs per character i Most gangs per character w panelu). Naraz na służbie jest najwyżej jedna praca i tylko ta praca płaci pensję. Aktywny jest najwyżej jeden gang. Prace i gangi z ich stopniami są zdefiniowane w panelu administratora (sekcje Jobs i Gangs).
Stopień to pozycja na liście stopni pracy, liczona od 0: stopień 0 to pierwszy wiersz w panelu, stopień 1 drugi i tak dalej.
Każda zmiana wysyła serwerowe zdarzenie (ai-core:jobsChanged, ai-core:dutyChanged, ai-core:gangsChanged, ai-core:activeGangChanged) i dociera do własnej gry gracza. Zasoby, które potrzebują prac wielu graczy, śledzą te zdarzenia przez lustro online liba zamiast wywoływać poniższe eksporty dla każdego gracza. Zobacz Zdarzenia i stan.
GetJobs
Każde członkostwo w pracy postaci gracza.
Strona: Serwer · Czeka: nie · Lib: online.jobs(source) czyta to samo z lustra liba
GetJobs(src: number): JobMembership[] | nulllocal jobs = exports['ai-core']:GetJobs(source) -- lista { job, grade } lub nilParametry
Prop
Type
Zwraca
JobMembership[] | null: jedno { job, grade } na pracę (JobMembership). Pusta lista, gdy postać nie ma pracy (praca bezrobotnego z panelu nigdy nie jest zapisywana). null, gdy gracz nie ma wczytanej postaci.
Przykład
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Ekran urzędu pracy wyświetla prace gracza z ich etykietami.
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
Jedna praca, którą inne skrypty powinny traktować jako "tę" pracę gracza: praca na służbie, w przeciwnym razie ostatnia praca, w której gracz był na służbie, w przeciwnym razie pierwsza praca, w przeciwnym razie praca bezrobotnego z panelu. Skrypty ESX i QB widzą tę pracę przez most.
Strona: Serwer · Czeka: nie · Lib: brak
GetCurrentJob(src: number): JobMembership | nulllocal job = exports['ai-core']:GetCurrentJob(source) -- { job, grade } lub nilParametry
Prop
Type
Zwraca
JobMembership | null: { job, grade }. Dla postaci bez żadnej pracy to praca bezrobotnego (ustawienie panelu, domyślnie unemployed) ze stopniem 0. null tylko wtedy, gdy gracz nie ma wczytanej postaci.
Przykład
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
Praca, w której gracz jest teraz na służbie. Używaj tego przy każdym sprawdzeniu "tylko policja na służbie może to zrobić".
Strona: Serwer · Czeka: nie · Lib: online.dutyJob(source) czyta to samo z lustra liba
GetDutyJob(src: number): string | nulllocal job = exports['ai-core']:GetDutyJob(source) -- nazwa pracy lub nilParametry
Prop
Type
Zwraca
string | null: nazwa pracy. null, gdy gracz jest poza służbą albo nie ma wczytanej postaci.
Przykład
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
Wprowadza gracza na służbę w jednej z jego prac (i zdejmuje ze służby w każdej innej) albo zdejmuje go ze służby.
Strona: Serwer · Czeka: nie · Lib: brak
SetDuty(src: number, job: string | null): booleanlocal ok = exports['ai-core']:SetDuty(source, 'police') -- nil = poza służbąParametry
Prop
Type
Zwraca
boolean: true, gdy gracz jest teraz na służbie w job (lub poza służbą dla null), także gdy nic nie musiało się zmienić. false, gdy gracz nie ma job albo nie ma wczytanej postaci.
Przykład
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 };
// Przełącznik służby w szatni komisariatu.
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");
});Służba nie jest zapisywana: gracz, który dołącza, jest poza służbą, chyba że w panelu włączone jest ustawienie Keep duty after rejoining.
SetJob
Daje graczowi pracę albo zmienia stopień pracy, którą już ma.
Strona: Serwer · Czeka: nie · Lib: brak
SetJob(src: number, job: string, grade: number): booleanlocal ok = exports['ai-core']:SetJob(source, 'mechanic', 0)Parametry
Prop
Type
Zwraca
boolean: true, gdy postać ma teraz job ze stopniem grade. false, gdy praca nie istnieje, stopień nie istnieje (nie jest liczbą całkowitą, jest poniżej 0 albo za ostatnim stopniem), postać ma już tyle prac, ile pozwala Most jobs per character, albo gracz nie ma wczytanej postaci.
Gdy w panelu wyłączone jest ustawienie Several jobs per character, nowa praca zastępuje drugą pracę postaci.
Przykład
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readText } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Urząd pracy: każdy może wziąć pracę z listy panelu, ze stopniem 0.
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
Zabiera graczowi pracę. Gracz na służbie w tej pracy najpierw schodzi ze służby.
Strona: Serwer · Czeka: nie · Lib: brak
RemoveJob(src: number, job: string): booleanlocal ok = exports['ai-core']:RemoveJob(source, 'mechanic')Parametry
Prop
Type
Zwraca
boolean: true, gdy praca została usunięta. false, gdy postać jej nie ma albo gracz nie ma wczytanej postaci.
Przykład
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
Ilu graczy jest teraz na służbie w danej pracy. Używaj tego dla reguł typu "potrzeba 2 policjantów online".
Strona: Serwer · Czeka: nie · Lib: brak (online.countOnDuty(jobs) liczy kilka prac z lustra liba)
GetOnDutyCount(job: string): numberlocal officers = exports['ai-core']:GetOnDutyCount('police')Parametry
Prop
Type
Zwraca
number: gracze na służbie w job. 0, gdy nikogo nie ma albo praca jest nieznana. Ta sama liczba jest w GlobalState ai:duty:<job> dla skryptów klienckich.
Przykład
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");
// ... rozpocznij napad
return { ok: true };
});IsPrimeTime
Czy teraz są godziny szczytu dla pracy. Godziny szczytu pochodzą ze źródła wybranego w panelu: skryptu, który trzyma własne godziny (tgiann-policealert), dopóki działa, w przeciwnym razie z własnych godzin ai-core (własne okno pracy lub domyślne). Używaj tego dla reguł zmieniających się z godzinami ruchu, jak napad, który płaci więcej.
Strona: Serwer · Czeka: nie · Lib: isPrimeTime(job?)
IsPrimeTime(job?: string): booleanlocal prime = exports['ai-core']:IsPrimeTime('police')Parametry
Prop
Type
Zwraca
boolean: true w godzinach szczytu. Godziny to czas lokalny serwera; okno, którego początek jest późniejszy niż koniec, trwa po północy, a ten sam początek i koniec oznacza cały dzień. Gdy panel wybiera skrypt jako źródło, a ten skrypt jest zatrzymany, każda godzina liczy się jako godziny szczytu. Działa niezależnie od tego, czy cięcie wypłaty poza godzinami szczytu jest włączone.
Przykład
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** A store robbery pays 50% more outside police prime time. */
export function robberyReward(base: number): number {
return core.IsPrimeTime("police") ? base : Math.round(base * 1.5);
}GetJobDefinitions
Każda definicja pracy z panelu, jako jedna kopia. Używaj tego do rzadkich odczytów, takich jak jednorazowe budowanie listy; dla jednej pracy używaj GetJobDefinition.
Strona: Serwer · Czeka: nie · Lib: brak
GetJobDefinitions(): Record<string, JobDefinition>local jobs = exports['ai-core']:GetJobDefinitions() -- tabela z nazwą pracy jako kluczemParametry
Brak.
Zwraca
Record<string, JobDefinition>: każda praca z nazwą jako kluczem. Każda ma label, type, defaultDuty, listed (pokazywana w urzędach pracy) i grades (każdy z label, salary i boss). Zobacz JobDefinition i GradeDefinition.
Przykład
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
// Urząd pracy wyświetla każdą pracę oznaczoną w panelu jako "listed".
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 })),
}));W Lua def.grades[1] to stopień 0: listy Lua zaczynają się od 1, stopnie od 0.
GetJobDefinition
Definicja jednej pracy: etykieta, typ, domyślna służba, czy urzędy pracy ją wyświetlają, i jej stopnie.
Strona: Serwer · Czeka: nie · Lib: definitions.job(name) (czyta każdą pracę raz i zapomina ją, gdy panel ją zmieni)
GetJobDefinition(job: string): JobDefinition | nulllocal def = exports['ai-core']:GetJobDefinition('police') -- table lub nilParametry
Prop
Type
Zwraca
JobDefinition | null: praca (JobDefinition). null dla nieznanej pracy albo wartości, która nie jest tekstem.
Przykład
import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Tylko stopień szefa może otworzyć menu szefa.
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
Każde członkostwo w gangu postaci gracza.
Strona: Serwer · Czeka: nie · Lib: online.gangs(source) czyta to samo z lustra liba
GetGangs(src: number): GangMembership[] | nulllocal gangs = exports['ai-core']:GetGangs(source) -- lista { gang, grade } lub nilParametry
Prop
Type
Zwraca
GangMembership[] | null: jedno { gang, grade } na gang (GangMembership). Pusta lista bez gangów. null, gdy gracz nie ma wczytanej postaci.
Przykład
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** Whether a player belongs to any gang (active or not). */
export function inAnyGang(source: number): boolean {
return (core.GetGangs(source)?.length ?? 0) > 0;
}GetActiveGang
Gang, który gracz ma teraz aktywny. Terytorium gangu, schowki gangu i czaty gangu powinny używać aktywnego gangu.
Strona: Serwer · Czeka: nie · Lib: brak
GetActiveGang(src: number): string | nulllocal gang = exports['ai-core']:GetActiveGang(source) -- nazwa gangu lub nilParametry
Prop
Type
Zwraca
string | null: nazwa gangu. null, gdy żaden gang nie jest aktywny albo gracz nie ma wczytanej postaci.
Przykład
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
Dodaje gracza do gangu albo zmienia jego stopień w gangu, do którego należy. Postać bez aktywnego gangu dostaje nowy gang jako aktywny.
Strona: Serwer · Czeka: nie · Lib: brak
SetGang(src: number, gang: string, grade: number): booleanlocal ok = exports['ai-core']:SetGang(source, 'ballas', 0)Parametry
Prop
Type
Zwraca
boolean: true, gdy postać należy teraz do gang ze stopniem grade. false, gdy gang lub stopień nie istnieje, postać należy już do tylu gangów, ile pozwala Most gangs per character, albo gracz nie ma wczytanej postaci. Gdy w panelu wyłączone jest ustawienie Several gangs per character, nowy gang zastępuje stary.
Przykład
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
Usuwa gracza z gangu. Gdy był to aktywny gang, aktywny staje się następny pozostały gang (albo żaden).
Strona: Serwer · Czeka: nie · Lib: brak
RemoveGang(src: number, gang: string): booleanlocal ok = exports['ai-core']:RemoveGang(source, 'ballas')Parametry
Prop
Type
Zwraca
boolean: true, gdy członkostwo zostało usunięte. false, gdy postać nie jest w tym gangu albo gracz nie ma wczytanej postaci.
Przykład
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
Wybiera, który z gangów gracza jest aktywny, albo żaden.
Strona: Serwer · Czeka: nie · Lib: brak
SetActiveGang(src: number, gang: string | null): booleanlocal ok = exports['ai-core']:SetActiveGang(source, 'vagos') -- nil = brak aktywnego ganguParametry
Prop
Type
Zwraca
boolean: true, gdy gang jest teraz aktywny (także gdy już był). false, gdy postać nie jest w tym gangu albo gracz nie ma wczytanej postaci. Aktywny gang jest zapisywany.
Przykład
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
Każda definicja gangu z panelu, jako jedna kopia.
Strona: Serwer · Czeka: nie · Lib: brak
GetGangDefinitions(): Record<string, GangDefinition>local gangs = exports['ai-core']:GetGangDefinitions() -- tabela z nazwą gangu jako kluczemParametry
Brak.
Zwraca
Record<string, GangDefinition>: każdy gang z nazwą jako kluczem, każdy z label i grades. Zobacz GangDefinition.
Przykład
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
Definicja jednego gangu: jego etykieta i stopnie.
Strona: Serwer · Czeka: nie · Lib: definitions.gang(name)
GetGangDefinition(gang: string): GangDefinition | nulllocal def = exports['ai-core']:GetGangDefinition('ballas') -- table lub nilParametry
Prop
Type
Zwraca
GangDefinition | null: gang (GangDefinition). null dla nieznanego gangu albo wartości, która nie jest tekstem.
Przykład
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** "Ballas" for "ballas", the name itself for an unknown gang. */
export function gangLabel(gang: string): string {
return core.GetGangDefinition(gang)?.label ?? gang;
}