AI Core
Справочник API

Серверные экспорты ai-core

Каждый серверный экспорт ai-core - сигнатура и назначение, по разделам.

Типизированы как AiCoreServerExports в @aicore-fivem/shared (exports.ts). В TypeScript возьмите один дескриптор на файл; в Lua вызывайте exports['ai-core'] напрямую.

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

Типы ниже: CharacterInfo, AiPlayerData, JobMembership ({ job, grade }), GangMembership ({ gang, grade }), InventoryRef (серверный id игрока или id другого инвентаря: имя хранилища, номер), KeyPurpose (purchase, garage, job, rental, temporary), все в @aicore-fivem/shared.

Персонажи и игроки

ЭкспортЧто
GetPlayerData(src: number): AiPlayerData | nullВсё, что ai-core хранит для загруженного игрока: персонаж, деньги, работы, смена, банды, метаданные.
GetCharacter(src: number): CharacterInfo | nullЗагруженный персонаж (id, citizenid, имя, дата рождения, пол, национальность).
GetSourceByCharId(charId: number): number | nullСерверный id игрока, который играет этим персонажем.
GetSourceByCitizenId(citizenid: string): number | nullТо же по citizen id.
GetLoadedSources(): number[]Серверные id всех игроков с загруженным персонажем.
GetFivemId(src: number): string | nullИдентификатор FiveM игрока.
SwitchCharacter(src: number): booleanВозвращает игрока на экран персонажей.
SetOfflinePosition(charId: number, position: { x, y, z, heading? }): booleanПереносит точку появления сохранённого (не загруженного) персонажа; false, пока он загружен.
GetPlayersInScope(source: number): number[]Игроки в зоне OneSync игрока (около 424 м).
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

Деньги

Счета берутся из списка Accounts в панели (по умолчанию cash, bank). reason попадает в журнал операций.

ЭкспортЧто
GetMoney(src: number, account: string): number | nullБаланс игрока.
AddMoney(src: number, account: string, amount: number, reason?: string): booleanДобавляет деньги.
RemoveMoney(src: number, account: string, amount: number, reason?: string): booleanСписывает деньги; false, если на счёте не хватает.
SetMoney(src: number, account: string, amount: number, reason?: string): booleanУстанавливает баланс.
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | nullОбщий счёт работы или банды.
AddSharedMoney(ownerType, ownerId, account, amount: number, reason?: string): booleanПополняет общий счёт.
RemoveSharedMoney(ownerType, ownerId, account, amount: number, reason?: string): booleanСписывает с общего счёта.
TransferMoney(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanПереводит деньги между двумя счетами в одной транзакции с обеими записями в журнале; from также платит fee.
GetAccountTypes(): Record<string, AccountTypeDefinition>Список счетов (label, start, allowNegative).

MoneyRef - это { source, account } для загруженного игрока или { owner: "job" \| "gang", id, account } для общего счёта.

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

Работы и банды

У персонажа может быть несколько работ и банд, но не больше одной работы на смене и одной активной банды.

ЭкспортЧто
GetJobs(src: number): JobMembership[] | nullВсе работы игрока.
GetCurrentJob(src: number): JobMembership | nullРабота, которую другие скрипты видят как «ту самую»: на смене, иначе последняя на смене, иначе первая.
GetDutyJob(src: number): string | nullРабота, на смене которой находится игрок.
SetDuty(src: number, job: string | null): booleanСтавит игрока на смену в работе или снимает со смены (null).
SetJob(src: number, job: string, grade: number): booleanДобавляет работу или меняет её ранг.
RemoveJob(src: number, job: string): booleanУбирает работу.
GetOnDutyCount(job: string): numberСколько игроков на смене в работе.
IsPrimeTime(job?: string): booleanПрайм-тайм работы (часы tgiann-policealert, пока он запущен, иначе часы из панели).
GetGangs(src: number): GangMembership[] | nullВсе банды игрока.
GetActiveGang(src: number): string | nullАктивная банда.
SetGang(src: number, gang: string, grade: number): booleanДобавляет банду или меняет её ранг.
RemoveGang(src: number, gang: string): booleanУбирает банду.
SetActiveGang(src: number, gang: string | null): booleanВыбирает активную банду.
GetJobDefinitions(): Record<string, JobDefinition>Все определения работ (копия: для редкого чтения).
GetJobDefinition(job: string): JobDefinition | nullОдна работа: label, type, defaultDuty, listed?, grades (label, salary, boss).
GetGangDefinitions(): Record<string, GangDefinition>Все определения банд.
GetGangDefinition(gang: string): GangDefinition | nullОдна банда: 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

Метаданные и настройки сервера

ЭкспортЧто
GetMeta(src: number, key: string): unknownОдно значение из метаданных персонажа.
SetMeta(src: number, key: string, value: unknown): booleanУстанавливает значение метаданных.
GetBranding(): BrandingНазвание сервера, подзаголовок, слоганы и фон из настроек General в панели.
GetUpdates(): UpdateInfo[]Скрипты, у которых на GitHub есть релиз новее запущенной версии.

Предметы

Слой инвентаря ai-core: отвечает активный инвентарь (false, 0 или пусто, пока ни один не запущен).

ЭкспортЧто
AddItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanДобавляет предметы.
RemoveItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanУбирает предметы.
GetItemCount(inv: InventoryRef, item: string, metadata?: ItemMetadata): numberСколько есть предмета.
HasItem(inv: InventoryRef, item: string, count?: number): booleanЕсть ли в инвентаре хотя бы count.
CanCarryItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata): booleanПоместятся ли предметы.
GetItems(inv: InventoryRef): InventoryStack[]Все стаки (name, label, count, slot, metadata).
ClearInventory(inv: InventoryRef): voidОчищает инвентарь.
RegisterStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[]): voidХранилище; запоминается и регистрируется заново в каждом инвентаре, который становится активным.
OpenInventory(source: number, inv: InventoryRef): booleanОткрывает хранилище или другой инвентарь на экране игрока.
RegisterUsableItem(name: string, handler: UsableItemHandler): voidhandler(source, item) срабатывает при использовании; false оставляет предмет. Сохраняется при перезапуске инвентаря.
GetItemDefinition(name: string): ItemDefinition | nullОдин предмет (name, label, weight, unique, close, description, image?).
GetItemDefinitions(): Record<string, ItemDefinition>Все предметы.
UseItem(source: number, name: string, item?: unknown): unknownЗапускает зарегистрированный обработчик (вызывает мост).
IsUsableItem(name: string): booleanЗарегистрирован ли обработчик.
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

Ключи от транспорта

Транспорт - это дескриптор серверной сущности или номер; purpose по умолчанию temporary.

ЭкспортЧто
GiveVehicleKeys(source: number, vehicle: number | string, purpose?: KeyPurpose): voidВыдаёт ключи через активную систему ключей.
RemoveVehicleKeys(source: number, vehicle: number | string): voidЗабирает ключи.
HasVehicleKeys(source: number, vehicle: number | string): booleanЕсть ли у игрока ключи.
Lua
exports['ai-core']:GiveVehicleKeys(source, 'AB12CDE', 'rental')

Медицина

ЭкспортЧто
GetMedicalSystem(): string | nullСкрипт смерти, которому ai-core передаёт вызовы.
RevivePlayer(source: number): booleanПоднимает упавшего игрока на месте; false, если он не упал или скрипт смерти не запущен.
HealPlayer(source: number): booleanПолное здоровье для игрока, который не упал.
IsPlayerDead(source: number): booleanУпал ли игрок.

Внешность

ЭкспортЧто
GetAppearanceSystem(): string | nullСкрипт одежды, из которого ai-core читает внешность.
GetCharacterAppearance(charId: number, done: (look: CharacterAppearance | null) => void): voidСохранённая внешность персонажа (загруженного или нет); done получает { model, data } или null.
Lua
exports['ai-core']:GetCharacterAppearance(charId, function(look)
  if look then TriggerClientEvent('myscript:dress', source, look) end
end)

Телефон

Отвечает запущенный скрипт телефона (нет его: null или false).

ЭкспортЧто
GetPhoneNumber(source: number): string | nullНомер игрока.
GetSourceByPhone(number: string): number | nullИгрок с этим номером.
HasPhone(source: number): booleanЕсть ли у игрока телефон.
SendPhoneMail(to: number | string, mail: PhoneMail): booleanПисьмо (sender, subject, message) игроку или на номер.
SendPhoneMessage(from: string, to: number | string, text: string): booleanТекстовое сообщение.
PhoneNotify(source: number, notification: PhoneNotification): booleanУведомление на телефоне (title, message, app?).

Диспетчер

ЭкспортЧто
SendDispatchAlert(alert: DispatchAlert): booleanПоказывает оповещение сотрудникам jobs на смене через активную систему оповещений; false, если ни одна не запущена.

DispatchAlert: title и необязательные code, message, coords, jobs, source (подозреваемый), blip (sprite, color?, scale?), duration (секунды), icon, priority (normal или high). Тексты уже переведены.

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',
})

Тюрьма

ЭкспортЧто
JailPlayer(source: number, minutes: number, by?: number): booleanСажает игрока в тюрьму через запущенный скрипт тюрьмы.
ReleasePlayer(source: number): booleanОсвобождает игрока.
GetJailTime(source: number): numberСколько минут осталось.

Время и погода

Контракт qb-weathersync запущенного скрипта погоды (null или false, пока ни один не запущен).

ЭкспортЧто
GetWeather(): string | nullТекущий тип погоды.
SetWeather(type: string): booleanУстанавливает погоду (EXTRASUNNY, RAIN...).
GetTime(): { hour, minute } | nullИгровое время.
SetTime(hour: number, minute?: number): booleanУстанавливает игровое время.
SetBlackout(on: boolean): booleanВключает или выключает блэкаут.
FreezeTime(on: boolean): booleanОстанавливает или запускает часы.

Бакеты маршрутизации

ЭкспортЧто
AcquireBucket(tag: string): numberСвободный бакет маршрутизации для вызывающего ресурса (без населения, строгая блокировка); освобождается при его остановке.
ReleaseBucket(id: number): booleanВозвращает бакет (только ресурс, который его взял); сначала переместите из него игроков.

Логи

ЭкспортЧто
Log(channel: string, message: string, options?: LogOptions): voidОтправляет лог вызывающего ресурса всем включённым провайдерам (Discord, Fivemanage, FiveM Stats, консоль). options: level, source, target, metadata.
LogChannels(channels: Record<string, LogChannel>): voidОписывает каналы вызывающего ресурса (dataset, active); вызовите один раз при старте.
Lua
exports['ai-core']:Log('sales', 'Sold a car', { source = source, metadata = { price = 25000 } })

Подключение

ЭкспортЧто
AddConnectionCheck(id: string, check: (source, identifiers) => string | null | undefined): voidПроверка для каждого подключающегося игрока: верните текст отказа или null, чтобы впустить.
RegisterReplacement(remove: string | string[], keep?: string): voidОбъявляет, что keep (по умолчанию вызывающий) делает remove ненужным: предупреждение в консоли, вход запрещён, пока запущены оба.
GetConflicts(): { keep, remove, running, from }[]Скрипты, установленные рядом с тем, который их заменяет.

Админ-панель и команды

ЭкспортЧто
RegisterAdminPanel(resource: string): voidРесурс с панелью сообщает о себе (это делает AdminPanel библиотеки).
AdminPanelChanged(delta: AdminDelta): voidРесурс панели изменил запись; ai-core пересылает изменение админам с открытой панелью.
RegisterCommands(resource: string, commands: CommandInfo[]): voidaddCommand библиотеки показывает команды ресурса на вкладке Commands.
GetLookupValues(source: LookupSource): string[]Значения списка выбора (item, job, gang, account...) для проверки в панели.
RegisterExternalPanel(panel: { id?, label, icon?, description?, command?, url? }): voidПоказывает на главной странице панели собственный экран настроек другого скрипта (открывается через command или встроенный url).
Lua
exports['ai-core']:RegisterExternalPanel({
  label = 'My script', icon = 'gear', description = 'Its own settings', command = 'myscriptconfig',
})

На этой странице