Хранилища ox_inventory: RegisterStash, openInventory и хранилища работы

Как создавать хранилища в ox_inventory: зарегистрировать один на сервере, открыть его с клиента или ox_target, сделать его личным для каждого игрока или заблокировать работой.

Вам нужно место для хранения вещей: ящик доказательств полиции, личный гардероб, сейф в доме. С ox_inventory это хранилище: именованный инвентарь с собственными слотами и лимитом веса, сохранённый в базе данных. Эта статья охватывает регистрацию хранилища на сервере, открытие его с клиента, его личность, ограничение работой и прикрепление к зоне ox_target.

Зарегистрируйте хранилище на сервере

Хранилище должно существовать на сервере перед открытием. Зарегистрируйте его один раз при запуске вашего ресурса:

lua
-- server.lua
exports.ox_inventory:RegisterStash('police_evidence', 'Evidence locker', 100, 500000, false)

Аргументы по порядку:

Аргумент Смысл
id Уникальная строка. Используется для открытия хранилища и как его ключ в базе данных
label Имя, показываемое в верхней части хранилища
slots Количество слотов
maxWeight Лимит веса в граммах (500000 — это 500 кг)
owner false для общего хранилища, true для одного на игрока, или фиксированный идентификатор
groups Опциональная таблица работ, разрешённых открывать её
coords Опциональная позиция, вблизи которой должен быть игрок

Требуются только первые четыре. Содержимое сохраняется ox_inventory, поэтому оно выживает при перезагрузках вашего скрипта и сервера.

Внимание: id — это идентичность хранилища. Если вы позже измените 'police_evidence' на другую строку, старое содержимое останется в базе данных под старым id и новое хранилище начнётся пусто.

Откройте его с клиента

На клиенте откройте хранилище с экспортом и тем же id:

lua
-- client.lua
exports.ox_inventory:openInventory('stash', 'police_evidence')

Сервер проверяет groups и coords при поступлении запроса, поэтому клиент не может их пропустить. Если id хранилища никогда не был зарегистрирован, ничего не откроется.

Вы также можете открыть хранилище для игрока с сервера, например из команды или события, которое вы уже проверили:

lua
exports.ox_inventory:forceOpenInventory(source, 'stash', 'police_evidence')

Личные хранилища: owner = true

Для гардероба или шкафчика, где каждый игрок имеет собственное содержимое, используйте owner = true:

lua
exports.ox_inventory:RegisterStash('personal_locker', 'Personal locker', 50, 100000, true)

Id хранилища одинаков для всех, но ox_inventory прикрепляет идентификатор игрока к нему, поэтому каждый игрок получает отдельный инвентарь. На ESX это лицензия или идентификатор персонажа, на QBox и QBCore — id гражданина.

Вы также можете передать фиксированного владельца, что полезно для дома, где только владелец и люди, которых вы решили, могут его видеть:

lua
local identifier = 'char1:abc123'
exports.ox_inventory:RegisterStash('house_' .. identifier, 'House storage', 80, 200000, identifier)

Когда owner — это строка, любой открывающий это хранилище присоединяется к этому владельцу, поэтому проверка доступа должна происходить в вашем собственном коде сервера перед его открытием.

Хранилища работы: groups

groups — это таблица имён работ, каждое с минимальным рангом:

lua
exports.ox_inventory:RegisterStash(
    'police_armory',
    'Police armory',
    80,
    300000,
    false,
    { police = 0, sheriff = 2 }
)

Игрок с работой police на ранге 0 или выше может открыть её, и sheriff только с ранга 2. Все остальные отказаны сервером. Это работает с работами ESX, работами QBCore и работами QBox, потому что ox_inventory читает их из фреймворка.

Чтобы также потребовать, чтобы игрок стоял в хранилище, передайте coords как последний аргумент:

lua
exports.ox_inventory:RegisterStash(
    'police_armory', 'Police armory', 80, 300000, false,
    { police = 0 }, vec3(452.1, -980.2, 30.7)
)

Откройте его с ox_target

Хранилище обычно открывается из места в мире. С ox_target добавьте зону, которая вызывает экспорт:

lua
exports.ox_target:addSphereZone({
    coords = vec3(452.1, -980.2, 30.7),
    radius = 1.0,
    options = {
        {
            name = 'open_police_armory',
            icon = 'fa-solid fa-box-archive',
            label = 'Open armory',
            groups = { police = 0 },
            onSelect = function()
                exports.ox_inventory:openInventory('stash', 'police_armory')
            end,
        },
    },
})

groups здесь только скрывают опцию, что удобно. Реальная проверка — та, что на RegisterStash. Для зон в целом смотрите добавление зоны ox_target.

Хранилища, определённые в файле

Если вы не хотите писать код, ox_inventory читает хранилища из data/stashes.lua. Каждая запись имеет имя, метку, слоты, вес, опциональные owner, groups и местоположение. Посмотрите примеры записей в этом файле в вашей версии, скопируйте одну и перезагрузите ox_inventory. Используйте регистрацию кода, когда хранилище создаётся другим ресурсом, например скриптом жилья.

Совет: чтобы проверить, работает ли хранилище, откройте его, поместите элемент, перезагрузите ваш ресурс и откройте его снова. Если элемент всё ещё там, id совпадает и содержимое сохранено.

Контрольный список

Симптом Решение
Хранилище не открывается Сначала зарегистрируйте его на сервере с точным же id
Хранилище пусто после переименования Id изменился; старое содержимое находится под старым id
Все делят то же личное хранилище Зарегистрируйте с owner = true
Игрок без работы открывает его Добавьте groups = { jobname = grade } в RegisterStash
Открывается откуда угодно Передайте coords как последний аргумент
Нужны элементы для добавления Смотрите добавление элементов в ox_inventory

Короткие ответы

В чём разница между хранилищем и инвентарём игрока в ox_inventory?

Хранилище — это отдельное хранилище с собственными слотами и лимитом веса, определяемое строковым идентификатором. Оно принадлежит миру, работе или одному игроку в зависимости от owner и groups, которые вы даёте ему.

Как сделать хранилище, которое личное для каждого игрока?

Зарегистрируйте его с owner, установленным в true. ox_inventory затем хранит одну отдельную копию хранилища для каждого игрока, поэтому два игрока, открывающих одинаковый id хранилища, видят разное содержимое.

Почему моё хранилище открывается пусто или вообще не открывается?

Хранилище не было зарегистрировано на сервере, id отличается между вызовом регистрации и вызовом открытия, или игроку не хватает требуемой работы или он слишком далеко от coords.

Скрипты без этой проблемы

Item Creator V2Создавайте используемые предметы с анимациями, пропами, эффектами и не только — без кода.Смотреть скрипт →Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →

Читайте также

ox_libESXQBoxКак добавлять элементы в ox_inventory: items.lua, изображения и используемые элементыДобавьте пользовательский элемент в ox_inventory: запись data/items.lua, изображение в web/images, предоставление его с AddItem и делание его используемым с экспортом клиента.1 октября 2026 г. · 3 мин чтенияЧитать →ox_libESXQBoxМетаданные элементов ox_inventory: AddItem, Search, SetMetadata и уникальные элементыИспользуйте метаданные в ox_inventory: добавляйте элементы с данными, ищите и читайте слоты, обновляйте с помощью SetMetadata, показывайте пользовательскую метку и описание, и создавайте уникальные элементы, такие как ID и ключи.1 октября 2026 г. · 3 мин чтенияЧитать →ox_libESXQBoxМагазины ox_inventory: data/shops.lua, RegisterShop и значкиКак создать магазин в ox_inventory: запись data/shops.lua, цены и валюта, местоположения и цели, магазины, ограниченные работой, RegisterShop из другого ресурса и значки.1 октября 2026 г. · 3 мин чтенияЧитать →