Хранилища ox_inventory: RegisterStash, openInventory и хранилища работы
Как создавать хранилища в ox_inventory: зарегистрировать один на сервере, открыть его с клиента или ox_target, сделать его личным для каждого игрока или заблокировать работой.
Вам нужно место для хранения вещей: ящик доказательств полиции, личный гардероб, сейф в доме. С ox_inventory это хранилище: именованный инвентарь с собственными слотами и лимитом веса, сохранённый в базе данных. Эта статья охватывает регистрацию хранилища на сервере, открытие его с клиента, его личность, ограничение работой и прикрепление к зоне ox_target.
Зарегистрируйте хранилище на сервере
Хранилище должно существовать на сервере перед открытием. Зарегистрируйте его один раз при запуске вашего ресурса:
-- 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:
-- client.lua
exports.ox_inventory:openInventory('stash', 'police_evidence')Сервер проверяет groups и coords при поступлении запроса, поэтому клиент не может их пропустить. Если id хранилища никогда не был зарегистрирован, ничего не откроется.
Вы также можете открыть хранилище для игрока с сервера, например из команды или события, которое вы уже проверили:
exports.ox_inventory:forceOpenInventory(source, 'stash', 'police_evidence')Личные хранилища: owner = true
Для гардероба или шкафчика, где каждый игрок имеет собственное содержимое, используйте owner = true:
exports.ox_inventory:RegisterStash('personal_locker', 'Personal locker', 50, 100000, true)Id хранилища одинаков для всех, но ox_inventory прикрепляет идентификатор игрока к нему, поэтому каждый игрок получает отдельный инвентарь. На ESX это лицензия или идентификатор персонажа, на QBox и QBCore — id гражданина.
Вы также можете передать фиксированного владельца, что полезно для дома, где только владелец и люди, которых вы решили, могут его видеть:
local identifier = 'char1:abc123'
exports.ox_inventory:RegisterStash('house_' .. identifier, 'House storage', 80, 200000, identifier)Когда owner — это строка, любой открывающий это хранилище присоединяется к этому владельцу, поэтому проверка доступа должна происходить в вашем собственном коде сервера перед его открытием.
Хранилища работы: groups
groups — это таблица имён работ, каждое с минимальным рангом:
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 как последний аргумент:
exports.ox_inventory:RegisterStash(
'police_armory', 'Police armory', 80, 300000, false,
{ police = 0 }, vec3(452.1, -980.2, 30.7)
)Откройте его с ox_target
Хранилище обычно открывается из места в мире. С ox_target добавьте зону, которая вызывает экспорт:
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.

