Магазины ox_inventory: data/shops.lua, RegisterShop и значки

Как создать магазин в ox_inventory: запись data/shops.lua, цены и валюта, местоположения и цели, магазины, ограниченные работой, RegisterShop из другого ресурса и значки.

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

Запись магазина в data/shops.lua

Откройте ox_inventory/data/shops.lua. Каждый магазин — это таблица, обозначенная типом магазина:

lua
return {
    General = {
        name = 'Shop',
        inventory = {
            { name = 'burger', price = 10 },
            { name = 'water', price = 5, count = 50 },
            { name = 'lockpick', price = 150 },
        },
        locations = {
            vec3(25.7, -1347.3, 29.5),
        },
    },
}

Ключ (General) — это тип магазина. Поля:

Поле Смысл
name Название, показываемое в верхней части магазина
inventory Элементы на продажу
locations Координаты, где игроки могут открыть магазин
targets То же самое, но с ящиками ox_target (смотрите ниже)
groups Работы, разрешённые использовать магазин
blip Параметры значка карты

Проверьте записи по умолчанию в вашей копии файла: они показывают точные поля, которые поддерживает ваша версия, и лучший способ начать — скопировать один и изменить его.

Внимание: каждое имя элемента в inventory должно существовать в data/items.lua. Магазин, который перечисляет отсутствующий элемент, может не открыться или печатать ошибки. Смотрите добавление элементов в ox_inventory.

Элементы, цены и валюта

Каждая строка inventory — это небольшая таблица:

lua
inventory = {
    { name = 'water', price = 5 },
    { name = 'sandwich', price = 12, count = 20 },
    { name = 'lockpick', price = 150, currency = 'black_money' },
    { name = 'WEAPON_PISTOL', price = 2500, license = 'weapon' },
},
  • price — это цена одного устройства.
  • count — это запас. Без неё элемент неограничен, а с ней запас уменьшается, когда игроки покупают.
  • currency — это элемент, который платит за него. По умолчанию это деньги, и black_money — это частая альтернатива.
  • license запрашивает элемент лицензии перед покупкой игроком.
  • grade ограничивает один элемент минимальным рангом работы, когда магазин использует groups.

Открытие: местоположения и цели

С locations, ox_inventory показывает взаимодействие на этих координатах. С targets, это создаёт ящики ox_target, что лучше для прилавка или окна:

lua
targets = {
    {
        loc = vec3(25.7, -1347.3, 29.5),
        length = 0.7,
        width = 0.5,
        heading = 0.0,
        minZ = 29.0,
        maxZ = 31.0,
        distance = 1.5,
    },
},

ox_target должен запускаться для этого, так как магазин от него зависит. Если вы хотите только один из двух способов, удалите другую таблицу.

Магазины, ограниченные работой и значки

Ограничьте магазин работе с groups, используя имена работ и минимальные ранги:

lua
Police = {
    name = 'Police armory',
    groups = { police = 0 },
    inventory = {
        { name = 'WEAPON_STUNGUN', price = 0 },
        { name = 'ammo-9', price = 0, count = 200 },
    },
    locations = { vec3(480.2, -996.5, 30.7) },
},

Для значка карты добавьте таблицу blip в магазин:

lua
blip = { id = 59, colour = 69, scale = 0.8 },

id — это номер спрайта и colour — номер цвета. Числа приходят из списков значков GTA, и то же самое объяснено в создании значков в FiveM. Перезагрузите ox_inventory, чтобы применить изменения файла.

Зарегистрируйте магазин из другого ресурса

Когда магазин создаётся вашим собственным скриптом, например ресурсом бизнеса или работы, не редактируйте data/shops.lua. Зарегистрируйте его на сервере:

lua
-- server.lua of your resource
exports.ox_inventory:RegisterShop('Bakery', {
    name = 'Bakery',
    inventory = {
        { name = 'bread', price = 4 },
        { name = 'croissant', price = 6, count = 30 },
    },
    locations = {
        vec3(-1285.7, -1127.1, 6.8),
    },
})

RegisterShop(type, data) принимает строку типа и ту же таблицу, что и в файле. Зарегистрируйте её при запуске ресурса. Если ox_inventory перезагружается, ваш ресурс должен зарегистрировать магазин снова, поэтому регистрируйте на onServerResourceStart и для ox_inventory тоже:

lua
AddEventHandler('onServerResourceStart', function(resource)
    if resource == 'ox_inventory' then
        registerMyShops()
    end
end)

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

Если вы не хотите местоположение или цель в магазине, или хотите открыть его из собственного интерфейса, используйте экспорт клиента:

lua
exports.ox_inventory:openInventory('shop', { type = 'General', id = 1 })

type — это ключ магазина. id — это позиция местоположения в списке locations (или targets), начиная с 1. Если магазин имеет одно местоположение, используйте id = 1. Магазин без мест, зарегистрированный кодом, открывается только с его типом, поэтому протестируйте вашу версию, если id необходим.

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

Создание магазинов без редактирования кода

Если вы устанавливаете много магазинов, редактирование Lua становится повторяющимся. Shop Creator позволяет вам создавать магазины в игре.

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

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

Симптом Решение
Магазин не появляется Перезагрузите ox_inventory после редактирования data/shops.lua
Магазин открывается пусто или ошибки Элемент в inventory отсутствует в data/items.lua
Не могу взаимодействовать с магазином Проверьте locations или targets, и что ox_target запущен
Неправильная валюта Установите currency на запись элемента
Магазин работы открыт для всех Добавьте groups = { job = grade }
Зарегистрированный магазин потерян после перезагрузки Вызовите RegisterShop снова, когда ox_inventory запускается

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

Где я добавляю магазин в ox_inventory?

В ox_inventory/data/shops.lua, как новую запись с именем, списком inventory и одной или несколькими locations или targets. Перезагрузите ox_inventory после этого.

Может ли магазин брать чёрные деньги вместо наличных?

Да. Установите currency = 'black_money' на запись элемента, и магазин будет взимать этот элемент вместо денег по умолчанию.

Как создать магазин из собственного скрипта?

Вызовите exports.ox_inventory:RegisterShop(type, data) на сервере, затем откройте его с клиента с exports.ox_inventory:openInventory('shop', { type = type }).

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

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

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

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: RegisterStash, openInventory и хранилища работыКак создавать хранилища в ox_inventory: зарегистрировать один на сервере, открыть его с клиента или ox_target, сделать его личным для каждого игрока или заблокировать работой.1 октября 2026 г. · 3 мин чтенияЧитать →