AI Core
Dokumentacja API

Eksporty serwerowe ai-core

Każdy eksport serwerowy ai-core - sygnatura i działanie, pogrupowane według obszaru.

Typowane jako AiCoreServerExports w @aicore-fivem/shared (exports.ts). W TypeScript weź jeden uchwyt na plik; w Lua wywołuj bezpośrednio exports['ai-core'].

TypeScript
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");

Typy używane poniżej: CharacterInfo, AiPlayerData, JobMembership ({ job, grade }), GangMembership ({ gang, grade }), InventoryRef (id serwerowe gracza albo id innego ekwipunku: nazwa schowka, tablica), KeyPurpose (purchase, garage, job, rental, temporary), wszystkie w @aicore-fivem/shared.

Postacie i gracze

EksportCo
GetPlayerData(src: number): AiPlayerData | nullWszystko, co ai-core trzyma dla wczytanego gracza: postać, pieniądze, prace, służba, gangi, metadane.
GetCharacter(src: number): CharacterInfo | nullWczytana postać (id, citizenid, imię i nazwisko, data urodzenia, płeć, narodowość).
GetSourceByCharId(charId: number): number | nullId serwerowe gracza grającego tą postacią.
GetSourceByCitizenId(citizenid: string): number | nullTo samo według citizen id.
GetLoadedSources(): number[]Id serwerowe każdego gracza z wczytaną postacią.
GetFivemId(src: number): string | nullIdentyfikator FiveM gracza.
SwitchCharacter(src: number): booleanOdsyła gracza do ekranu postaci.
SetOfflinePosition(charId: number, position: { x, y, z, heading? }): booleanPrzenosi punkt pojawienia się zapisanej (niewczytanej) postaci; false, gdy jest wczytana.
GetPlayersInScope(source: number): number[]Gracze w zasięgu OneSync danego gracza (około 424 m).
TypeScript
const character = core.GetCharacter(source);
if (character) console.log(character.firstname, character.lastname);
Lua
local character = exports['ai-core']:GetCharacter(source)
if character then print(character.firstname, character.lastname) end

Pieniądze

Konta to te z listy Accounts w panelu (domyślnie cash, bank). reason trafia do księgi.

EksportCo
GetMoney(src: number, account: string): number | nullSaldo gracza.
AddMoney(src: number, account: string, amount: number, reason?: string): booleanDodaje pieniądze.
RemoveMoney(src: number, account: string, amount: number, reason?: string): booleanZabiera pieniądze; false, gdy konto nie może zapłacić.
SetMoney(src: number, account: string, amount: number, reason?: string): booleanUstawia saldo.
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | nullWspólne konto pracy lub gangu.
AddSharedMoney(ownerType, ownerId, account, amount: number, reason?: string): booleanDodaje do wspólnego konta.
RemoveSharedMoney(ownerType, ownerId, account, amount: number, reason?: string): booleanZabiera ze wspólnego konta.
TransferMoney(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanPrzenosi pieniądze między dwoma kontami w jednej transakcji z oboma wpisami w księdze; from płaci też fee.
GetAccountTypes(): Record<string, AccountTypeDefinition>Lista kont (label, start, allowNegative).

MoneyRef to { source, account } dla wczytanego gracza albo { owner: "job" \| "gang", id, account } dla wspólnego konta.

TypeScript
if (core.RemoveMoney(source, "bank", 500, "fine")) {
  core.AddSharedMoney("job", "police", "bank", 500, "fine");
}
Lua
if exports['ai-core']:RemoveMoney(source, 'bank', 500, 'fine') then
  exports['ai-core']:AddSharedMoney('job', 'police', 'bank', 500, 'fine')
end

Prace i gangi

Postać może mieć kilka prac i gangów, z co najwyżej jedną pracą na służbie i jednym aktywnym gangiem.

EksportCo
GetJobs(src: number): JobMembership[] | nullKażde członkostwo w pracy.
GetCurrentJob(src: number): JobMembership | nullPraca, którą inne skrypty widzą jako „tę” pracę: na służbie, inaczej ostatnia na służbie, inaczej pierwsza.
GetDutyJob(src: number): string | nullPraca, w której gracz jest na służbie.
SetDuty(src: number, job: string | null): booleanWprowadza gracza na służbę w pracy albo zdejmuje ze służby (null).
SetJob(src: number, job: string, grade: number): booleanDodaje pracę albo zmienia jej stopień.
RemoveJob(src: number, job: string): booleanUsuwa członkostwo w pracy.
GetOnDutyCount(job: string): numberIlu graczy jest na służbie w pracy.
IsPrimeTime(job?: string): booleanPrime time dla pracy (godziny tgiann-policealert, gdy działa, inaczej godziny z panelu).
GetGangs(src: number): GangMembership[] | nullKażde członkostwo w gangu.
GetActiveGang(src: number): string | nullAktywny gang.
SetGang(src: number, gang: string, grade: number): booleanDodaje gang albo zmienia jego stopień.
RemoveGang(src: number, gang: string): booleanUsuwa członkostwo w gangu.
SetActiveGang(src: number, gang: string | null): booleanWybiera aktywny gang.
GetJobDefinitions(): Record<string, JobDefinition>Każda definicja pracy (kopia: do rzadkich odczytów).
GetJobDefinition(job: string): JobDefinition | nullJedna praca: label, type, defaultDuty, listed?, grades (label, salary, boss).
GetGangDefinitions(): Record<string, GangDefinition>Każda definicja gangu.
GetGangDefinition(gang: string): GangDefinition | nullJeden gang: label, grades.
TypeScript
if (core.GetDutyJob(source) === "police") {
  const officers = core.GetOnDutyCount("police");
}
Lua
if exports['ai-core']:GetDutyJob(source) == 'police' then
  local officers = exports['ai-core']:GetOnDutyCount('police')
end

Metadane i ustawienia serwera

EksportCo
GetMeta(src: number, key: string): unknownJedna wartość z metadanych postaci.
SetMeta(src: number, key: string, value: unknown): booleanUstawia wartość metadanych.
GetBranding(): BrandingNazwa serwera, podtytuł, hasła i tło z ustawień General w panelu.
GetUpdates(): UpdateInfo[]Skrypty z nowszym wydaniem na GitHub niż uruchomiona wersja.

Przedmioty

Warstwa ekwipunku ai-core: odpowiada aktywny ekwipunek (false, 0 albo pusto, gdy żaden nie działa).

EksportCo
AddItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanDodaje przedmioty.
RemoveItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanUsuwa przedmioty.
GetItemCount(inv: InventoryRef, item: string, metadata?: ItemMetadata): numberIle jest danego przedmiotu.
HasItem(inv: InventoryRef, item: string, count?: number): booleanCzy ekwipunek ma co najmniej count.
CanCarryItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata): booleanCzy przedmioty się zmieszczą.
GetItems(inv: InventoryRef): InventoryStack[]Każdy stos (name, label, count, slot, metadata).
ClearInventory(inv: InventoryRef): voidOpróżnia ekwipunek.
RegisterStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[]): voidSchowek; zapamiętany i rejestrowany ponownie w każdym ekwipunku, który staje się aktywny.
OpenInventory(source: number, inv: InventoryRef): booleanOtwiera schowek albo inny ekwipunek na ekranie gracza.
RegisterUsableItem(name: string, handler: UsableItemHandler): voidhandler(source, item) działa przy użyciu; zwrócenie false zostawia przedmiot. Zachowany po restarcie ekwipunku.
GetItemDefinition(name: string): ItemDefinition | nullJeden przedmiot (name, label, weight, unique, close, description, image?).
GetItemDefinitions(): Record<string, ItemDefinition>Każdy przedmiot.
UseItem(source: number, name: string, item?: unknown): unknownUruchamia zarejestrowany handler (wywołuje go most).
IsUsableItem(name: string): booleanCzy handler jest zarejestrowany.
TypeScript
core.RegisterUsableItem("bandage", (source, item) => {
  // heal, then let the inventory take the item
});
if (core.CanCarryItem(source, "water", 2)) core.AddItem(source, "water", 2);
Lua
exports['ai-core']:RegisterUsableItem('bandage', function(source, item)
  -- heal, then let the inventory take the item
end)
if exports['ai-core']:CanCarryItem(source, 'water', 2) then
  exports['ai-core']:AddItem(source, 'water', 2)
end

Klucze pojazdów

Pojazd to uchwyt encji serwerowej albo tablica; purpose domyślnie to temporary.

EksportCo
GiveVehicleKeys(source: number, vehicle: number | string, purpose?: KeyPurpose): voidDaje klucze przez aktywny system kluczy.
RemoveVehicleKeys(source: number, vehicle: number | string): voidOdbiera klucze.
HasVehicleKeys(source: number, vehicle: number | string): booleanCzy gracz ma klucze.
Lua
exports['ai-core']:GiveVehicleKeys(source, 'AB12CDE', 'rental')

Leczenie

EksportCo
GetMedicalSystem(): string | nullSkrypt śmierci, do którego ai-core przekazuje wywołania.
RevivePlayer(source: number): booleanPodnosi powalonego gracza tam, gdzie leży; false, gdy nie jest powalony albo nie działa żaden skrypt śmierci.
HealPlayer(source: number): booleanPełne zdrowie dla gracza, który nie jest powalony.
IsPlayerDead(source: number): booleanCzy gracz jest powalony.

Wygląd

EksportCo
GetAppearanceSystem(): string | nullSkrypt ubrań, z którego ai-core czyta wygląd.
GetCharacterAppearance(charId: number, done: (look: CharacterAppearance | null) => void): voidZapisany wygląd postaci (wczytanej lub nie); done dostaje { model, data } albo null.
Lua
exports['ai-core']:GetCharacterAppearance(charId, function(look)
  if look then TriggerClientEvent('myscript:dress', source, look) end
end)

Telefon

Odpowiada skrypt telefonu, który działa (brak: null albo false).

EksportCo
GetPhoneNumber(source: number): string | nullNumer gracza.
GetSourceByPhone(number: string): number | nullGracz z tym numerem.
HasPhone(source: number): booleanCzy gracz ma telefon.
SendPhoneMail(to: number | string, mail: PhoneMail): booleanMail (sender, subject, message) do gracza lub na numer.
SendPhoneMessage(from: string, to: number | string, text: string): booleanWiadomość tekstowa.
PhoneNotify(source: number, notification: PhoneNotification): booleanPowiadomienie telefonu (title, message, app?).

Dispatch

EksportCo
SendDispatchAlert(alert: DispatchAlert): booleanPokazuje alert członkom jobs na służbie przez aktywny system alertów; false, gdy żaden nie działa.

DispatchAlert: title oraz opcjonalnie code, message, coords, jobs, source (podejrzany), blip (sprite, color?, scale?), duration (sekundy), icon, priority (normal albo high). Teksty są już przetłumaczone.

TypeScript
core.SendDispatchAlert({
  code: "10-90",
  title: "Store robbery",
  jobs: ["police"],
  source,
  priority: "high",
});
Lua
exports['ai-core']:SendDispatchAlert({
  code = '10-90', title = 'Store robbery', jobs = { 'police' }, source = source, priority = 'high',
})

Więzienie

EksportCo
JailPlayer(source: number, minutes: number, by?: number): booleanWsadza gracza do więzienia przez działający skrypt więzienia.
ReleasePlayer(source: number): booleanWypuszcza gracza.
GetJailTime(source: number): numberPozostałe minuty.

Czas i pogoda

Kontrakt qb-weathersync działającego skryptu pogody (null albo false, gdy żaden nie działa).

EksportCo
GetWeather(): string | nullObecny typ pogody.
SetWeather(type: string): booleanUstawia pogodę (EXTRASUNNY, RAIN...).
GetTime(): { hour, minute } | nullCzas w grze.
SetTime(hour: number, minute?: number): booleanUstawia czas w grze.
SetBlackout(on: boolean): booleanWłącza lub wyłącza blackout.
FreezeTime(on: boolean): booleanZamraża lub odmraża zegar.

Buckety routingu

EksportCo
AcquireBucket(tag: string): numberWolny bucket routingu dla wywołującego zasobu (bez populacji, ścisła blokada); zwalniany, gdy zasób się zatrzyma.
ReleaseBucket(id: number): booleanOddaje bucket (tylko zasób, który go wziął); najpierw przenieś z niego graczy.

Logi

EksportCo
Log(channel: string, message: string, options?: LogOptions): voidWysyła log wywołującego zasobu do każdego włączonego dostawcy (Discord, Fivemanage, FiveM Stats, konsola). options: level, source, target, metadata.
LogChannels(channels: Record<string, LogChannel>): voidOpisuje kanały wywołującego zasobu (dataset, active); wywołaj raz przy starcie.
Lua
exports['ai-core']:Log('sales', 'Sold a car', { source = source, metadata = { price = 25000 } })

Połączenie

EksportCo
AddConnectionCheck(id: string, check: (source, identifiers) => string | null | undefined): voidSprawdzenie, przez które przechodzi każdy łączący się gracz: zwróć tekst odmowy albo null, żeby go wpuścić.
RegisterReplacement(remove: string | string[], keep?: string): voidDeklaruje, że keep (domyślnie wywołujący) czyni remove zbędnym: ostrzeżenie w konsoli, wejścia odrzucane, gdy działają oba.
GetConflicts(): { keep, remove, running, from }[]Skrypty zainstalowane obok tego, który je zastępuje.

Panel administratora i komendy

EksportCo
RegisterAdminPanel(resource: string): voidZasób z panelem zgłasza się (robi to AdminPanel liba).
AdminPanelChanged(delta: AdminDelta): voidZasób panelu zmienił rekord; ai-core przekazuje to administratorom z otwartym panelem.
RegisterCommands(resource: string, commands: CommandInfo[]): voidaddCommand liba wypisuje komendy zasobu w zakładce Commands.
GetLookupValues(source: LookupSource): string[]Wartości listy wyboru (item, job, gang, account...) do walidacji w panelu.
RegisterExternalPanel(panel: { id?, label, icon?, description?, command?, url? }): voidPokazuje na pulpicie własny ekran ustawień innego skryptu (otwierany przez command albo osadzony url).
Lua
exports['ai-core']:RegisterExternalPanel({
  label = 'My script', icon = 'gear', description = 'Its own settings', command = 'myscriptconfig',
})

Na tej stronie