AI Core
Справочник APILib: сервер

Предметы

inventory: выдача, изъятие и подсчёт предметов, хранилища, магазины и используемые предметы через тот инвентарь, который запущен на сервере.

TypeScript
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): boolean
Lua
local 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): boolean
Lua
local 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): number
Lua
local 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): boolean
Lua
local 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): boolean
Lua
local 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[]
Lua
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): void
Lua
aiLib.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[]): void
Lua
aiLib.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): boolean
Lua
local 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): void
Lua
aiLib.inventory.registerUsableItem(name, handler) -- handler(source, item)

Параметры

Использованный стак это 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 | null
Lua
local 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[]): void
Lua
aiLib.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): boolean
Lua
local 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") };
});

Здесь не проверяются ни расстояние, ни доступ: проверьте их перед вызовом.

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