Серверные экспорты ai-core
Каждый серверный экспорт ai-core - сигнатура и назначение, по разделам.
Типизированы как AiCoreServerExports в @aicore-fivem/shared (exports.ts). В TypeScript возьмите один дескриптор на файл; в Lua вызывайте exports['ai-core'] напрямую.
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 м). |
const character = core.GetCharacter(source);
if (character) console.log(character.firstname, character.lastname);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 } для общего счёта.
if (core.RemoveMoney(source, "bank", 500, "fine")) {
core.AddSharedMoney("job", "police", "bank", 500, "fine");
}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. |
if (core.GetDutyJob(source) === "police") {
const officers = core.GetOnDutyCount("police");
}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): void | handler(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 | Зарегистрирован ли обработчик. |
core.RegisterUsableItem("bandage", (source, item) => {
// heal, then let the inventory take the item
});
if (core.CanCarryItem(source, "water", 2)) core.AddItem(source, "water", 2);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 | Есть ли у игрока ключи. |
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. |
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). Тексты уже переведены.
core.SendDispatchAlert({
code: "10-90",
title: "Store robbery",
jobs: ["police"],
source,
priority: "high",
});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); вызовите один раз при старте. |
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[]): void | addCommand библиотеки показывает команды ресурса на вкладке Commands. |
GetLookupValues(source: LookupSource): string[] | Значения списка выбора (item, job, gang, account...) для проверки в панели. |
RegisterExternalPanel(panel: { id?, label, icon?, description?, command?, url? }): void | Показывает на главной странице панели собственный экран настроек другого скрипта (открывается через command или встроенный url). |
exports['ai-core']:RegisterExternalPanel({
label = 'My script', icon = 'gear', description = 'Its own settings', command = 'myscriptconfig',
})