AI Core
Dokumentacja APIAI Core: eksporty serwerowe

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

Sygnatura
GetJobs(src: number): JobMembership[] | null
Lua
local jobs = exports['ai-core']:GetJobs(source) -- lista { job, grade } lub nil

Parametry

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

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

Parametry

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

Sygnatura
GetDutyJob(src: number): string | null
Lua
local job = exports['ai-core']:GetDutyJob(source) -- nazwa pracy lub nil

Parametry

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

Sygnatura
SetDuty(src: number, job: string | null): boolean
Lua
local 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

Sygnatura
SetJob(src: number, job: string, grade: number): boolean
Lua
local 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

Sygnatura
RemoveJob(src: number, job: string): boolean
Lua
local 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)

Sygnatura
GetOnDutyCount(job: string): number
Lua
local 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?)

Sygnatura
IsPrimeTime(job?: string): boolean
Lua
local 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

Sygnatura
GetJobDefinitions(): Record<string, JobDefinition>
Lua
local jobs = exports['ai-core']:GetJobDefinitions() -- tabela z nazwą pracy jako kluczem

Parametry

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)

Sygnatura
GetJobDefinition(job: string): JobDefinition | null
Lua
local def = exports['ai-core']:GetJobDefinition('police') -- table lub nil

Parametry

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

Sygnatura
GetGangs(src: number): GangMembership[] | null
Lua
local gangs = exports['ai-core']:GetGangs(source) -- lista { gang, grade } lub nil

Parametry

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

Sygnatura
GetActiveGang(src: number): string | null
Lua
local gang = exports['ai-core']:GetActiveGang(source) -- nazwa gangu lub nil

Parametry

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

Sygnatura
SetGang(src: number, gang: string, grade: number): boolean
Lua
local 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

Sygnatura
RemoveGang(src: number, gang: string): boolean
Lua
local 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

Sygnatura
SetActiveGang(src: number, gang: string | null): boolean
Lua
local ok = exports['ai-core']:SetActiveGang(source, 'vagos') -- nil = brak aktywnego gangu

Parametry

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

Sygnatura
GetGangDefinitions(): Record<string, GangDefinition>
Lua
local gangs = exports['ai-core']:GetGangDefinitions() -- tabela z nazwą gangu jako kluczem

Parametry

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)

Sygnatura
GetGangDefinition(gang: string): GangDefinition | null
Lua
local def = exports['ai-core']:GetGangDefinition('ballas') -- table lub nil

Parametry

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;
}

Na tej stronie