Предметы
inventory: выдача, изъятие и подсчёт предметов, хранилища, магазины и используемые предметы через тот инвентарь, который запущен на сервере.
import { inventory } from "@aicore-fivem/lib/server";inventory отправляет каждый вызов, связанный с предметами, через слой инвентаря ai-core: отвечает инвентарь, запущенный на сервере (ai-inventory или другой, выбранный владельцем в панели ai-core). Ваш скрипт никогда не вызывает собственные экспорты инвентаря, поэтому продолжает работать, когда владелец меняет инвентарь.
Аргумент инвентаря (inv, тип InventoryRef) это серверный id игрока (число) или id другого инвентаря (строка: имя хранилища, номер транспорта).
Количества это целые числа от 1 и выше; дробь округляется вниз, 0 или отрицательное количество приводит к неудаче вызова.
Пока не запущен ни один инвентарь, вызовы тихо завершаются неудачей: false, 0, пустой список или null. Lua-аналоги в aiLib.inventory имеют те же имена и тот же порядок аргументов.
inventory.addItem
Выдаёт предметы в инвентарь.
Сторона: Сервер · Ждёт: нет
inventory.addItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanlocal ok = aiLib.inventory.addItem(inv, item, count, metadata, slot)Параметры
Prop
Type
Возвращает
boolean: true, если выдано. false, если не помещается, предмета не существует, аргумент неверный или не запущен инвентарь.
Пример
import { inventory } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
if (!inventory.addItem(source, "phone", 1, { number: "555-0101" })) return fail("INVENTORY_FULL");Когда вы что-то берёте взамен (деньги, другой предмет), сначала проверьте canCarryItem: забирайте только после того, как addItem ответил true, иначе верните обратно.
inventory.removeItem
Забирает предметы из инвентаря.
Сторона: Сервер · Ждёт: нет
inventory.removeItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanlocal ok = aiLib.inventory.removeItem(inv, item, count, metadata, slot)Параметры
Prop
Type
Возвращает
boolean: true, если забрано. false, если не хватает, аргумент неверный или не запущен инвентарь.
Пример
if (!inventory.removeItem(source, "lockpick")) return fail("NO_LOCKPICK");inventory.getItemCount
Сколько единиц предмета содержит инвентарь.
Сторона: Сервер · Ждёт: нет
inventory.getItemCount(inv: InventoryRef, item: string, metadata?: ItemMetadata): numberlocal count = aiLib.inventory.getItemCount(inv, item, metadata)Prop
Type
Возвращает
number: сумма по всем стакам, 0, если предметов нет или не запущен инвентарь.
Пример
const bags = inventory.getItemCount(source, "weed_bag");
notify(source, `You have ${bags} bags`);inventory.hasItem
Содержит ли инвентарь не меньше count единиц предмета.
Сторона: Сервер · Ждёт: нет
inventory.hasItem(inv: InventoryRef, item: string, count?: number): booleanlocal has = aiLib.inventory.hasItem(inv, item, count)Prop
Type
Возвращает
boolean.
Пример
if (!inventory.hasItem(source, "scrap_metal", 10)) return fail("NEED_10_SCRAP");hasItem это проверка, а не удержание: между hasItem и removeItem (если между ними есть await) предмет может исчезнуть. Действуйте по ответу removeItem.
inventory.canCarryItem
Поместятся ли предметы (вес и свободное место).
Сторона: Сервер · Ждёт: нет
inventory.canCarryItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata): booleanlocal fits = aiLib.inventory.canCarryItem(inv, item, count, metadata)Prop
Type
Возвращает
boolean: true, если помещаются.
Пример
if (!inventory.canCarryItem(source, "fish", 5)) return fail("TOO_HEAVY");
inventory.addItem(source, "fish", 5);inventory.getItems
Все стаки инвентаря.
Сторона: Сервер · Ждёт: нет
inventory.getItems(inv: InventoryRef): InventoryStack[]local stacks = aiLib.inventory.getItems(inv)Возвращает
InventoryStack[]: по одному { name, label, count, slot, metadata } на стак. Пусто, если инвентарь пуст, неизвестен или не запущен ни один инвентарь.
Пример
const weapons = inventory.getItems(source).filter((stack) => stack.name.startsWith("weapon_"));inventory.clearInventory
Очищает инвентарь.
Сторона: Сервер · Ждёт: нет
inventory.clearInventory(inv: InventoryRef): voidaiLib.inventory.clearInventory(inv)Возвращает
void.
Пример
inventory.clearInventory("evidence_locker_12");inventory.registerStash
Регистрирует хранилище (ящик, шкафчик). ai-core запоминает его и заново регистрирует в любом инвентаре, который запустится позже, поэтому вызовите один раз при запуске скрипта.
Сторона: Сервер · Ждёт: нет
inventory.registerStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[]): voidaiLib.inventory.registerStash(name, label, slots, maxWeight, jobs)Параметры
Prop
Type
Возвращает
void.
Пример
inventory.registerStash("police_armory", "Armory", 50, 200_000, ["police"]);inventory.openInventory
Открывает хранилище или инвентарь другого игрока на экране игрока.
Сторона: Сервер · Ждёт: нет
inventory.openInventory(source: number, inv: InventoryRef): booleanlocal ok = aiLib.inventory.openInventory(source, inv)Prop
Type
Возвращает
boolean: true, если инвентарь его открыл.
Пример
import { onClientCallback, near, online, inventory } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const ARMORY = { x: 452.3, y: -980.0, z: 30.7 };
onClientCallback(
"my-police:armory",
(source) => {
if (!online.onDutyIn(source, ["police"])) return fail("NOT_ON_DUTY");
return { ok: inventory.openInventory(source, "police_armory") };
},
{ guards: [near(ARMORY, 3)] },
);Здесь не проверяются ни расстояние, ни доступ: проверьте расстояние, работу и владение перед вызовом.
inventory.registerUsableItem
Запускает ваш обработчик, когда игрок использует предмет. ai-core хранит обработчик для инвентарей, которые запустятся позже, и при перезапусках инвентаря, поэтому регистрируйте один раз при запуске скрипта.
Сторона: Сервер · Ждёт: нет
inventory.registerUsableItem(name: string, handler: UsableItemHandler): voidaiLib.inventory.registerUsableItem(name, handler) -- handler(source, item)Параметры
Prop
Type
Использованный стак это UsedItem.
Инвентари, которые сами забирают использованный предмет (ai-inventory), забирают его, как только обработчик вернёт что угодно, кроме false. Если ваш обработчик ждёт (полоса прогресса) и сам удаляет предмет, сразу возвращайте false, иначе предмет заберут дважды.
Возвращает
void.
Пример
import { inventory, progressFor, medical, createLocale } from "@aicore-fivem/lib/server";
const Locale = createLocale();
async function bandage(source: number) {
const done = await progressFor(source, { label: Locale("BANDAGING"), duration: 4000, canCancel: true });
if (done && inventory.removeItem(source, "bandage")) medical.heal(source);
}
inventory.registerUsableItem("bandage", (source) => {
void bandage(source);
return false; // пока оставляем предмет: bandage() заберёт его после полосы
});inventory.getItemDefinition
Название, вес и флаги предмета.
Сторона: Сервер · Ждёт: нет
inventory.getItemDefinition(name: string): ItemDefinition | nulllocal def = aiLib.inventory.getItemDefinition(name)Возвращает
ItemDefinition (name, label, weight, unique, close, description, image?) или null, если инвентарь не знает этот предмет.
Пример
const label = inventory.getItemDefinition("water")?.label ?? "water";
notify(source, `You bought ${label}`, "success");inventory.registerShop
Регистрирует магазин, который сервер открывает игроку (у него нет собственного места). ai-core заново регистрирует его в любом инвентаре, который запустится позже; вызовите один раз при старте.
Сторона: Сервер · Ждёт: нет
inventory.registerShop(name: string, label: string, items: ShopProduct[]): voidaiLib.inventory.registerShop(name, label, items)Prop
Type
Возвращает
void.
Пример
inventory.registerShop("police_shop", "Police supplies", [
{ name: "handcuffs", price: 0 },
{ name: "radio", price: 50 },
]);inventory.openShop
Открывает зарегистрированный магазин на экране игрока.
Сторона: Сервер · Ждёт: нет
inventory.openShop(source: number, name: string): booleanlocal ok = aiLib.inventory.openShop(source, name)Возвращает
boolean: true, если открылся.
Пример
onClientCallback("my-police:shop", (source) => {
if (!online.onDutyIn(source, ["police"])) return fail("NOT_ON_DUTY");
return { ok: inventory.openShop(source, "police_shop") };
});Здесь не проверяются ни расстояние, ни доступ: проверьте их перед вызовом.
Игроки и персонажи
online, onCharacter, notify, игроки рядом, позиции и хранилища для каждого игрока: PlayerMap, Cooldowns, KeyedCooldowns, SourceLock, RateLimit, KeyWatchers.
Транспорт
spawnVehicle, vehicleType, randomPlate, ближайший транспорт, сущности по сетевым id от клиента, vehicleKeys, топливо и гаражи.