Настройка
Каждый магазин настраивается в панели и хранится в вашей базе данных — см. 🏪 Создание магазина. Файлы нужны для того, что общее для всех магазинов.
Какой файл за что отвечает
Заголовок раздела «Какой файл за что отвечает»| Файл | За что отвечает | Открыт? |
|---|---|---|
config.lua | Фреймворк, язык, взаимодействие, пед по умолчанию, команда, картинки, категории, правила ограбления, идентификаторы | Да |
bridge/server.lua | Деньги, счета, предметы, инвентарь, работы, уведомления, колбэки и собственное оповещение полиции | Да |
bridge/client.lua | Уведомления, подсказки, данные игрока и колбэки на клиенте | Да |
bridge/target.lua | Как продавцы и точки магазинов добавляются в ox_target или qb-target | Да |
bridge/utils.lua | Считывает идентификаторы игрока (Steam, license, Discord, FiveM, Xbox) | Да |
locales/*.lua | Тексты в игре: уведомления, подсказки, сообщения об ограблении | Да |
html/locales.js | Тексты внутри панелей и окна магазина на всех двенадцати языках | Читаемый |
html/index.html, style.css, script.js | Панели и окно магазина | Читаемый |
list/peds.lua | Модели педов, доступные в панели | Escrow |
mic_shopcreator.sql | Девять таблиц, импортируются один раз | Да |
client.lua, server.lua | Логика магазинов | Escrow |
config.lua
Заголовок раздела «config.lua»| Параметр | Что делает | По умолчанию |
|---|---|---|
Config.Locale | Язык в игре и в панелях. См. Языки | 'en' |
Config.Framework | 'esx' или 'qbcore'. Автоматически не определяется. На QBox используйте 'qbcore' — QBox запускает ресурсы QBCore через слой совместимости | 'esx' |
Config.Command | Команда, открывающая панель Shop Creator | 'shopcreator' |
Config.IdentifierType | Как распознаются владельцы и сотрудники: 'discord', 'license', 'esx' или 'citizenid'. См. Установка | 'discord' |
Продавцы и взаимодействие
Заголовок раздела «Продавцы и взаимодействие»| Параметр | Что делает | По умолчанию |
|---|---|---|
Config.Interaction | 'ox_target', 'qb-target' или 'default' (подсказка и E) | 'ox_target' |
Config.RadiusInteract | При 'default' — на каком расстоянии в метрах должен находиться игрок | 2.0 |
Config.SpawnNPC | false — продавцы не создаются: место отмечается маркером (при 'default') или сферой target. Нет продавца — некого и грабить | true |
Config.DefaultPed | Модель, которая используется, если у локации её нет или она недействительна | 'a_f_m_bevhills_01' |
Config.PedSpawnDistance | Продавцы существуют, только пока игрок находится в пределах этого количества метров | 20.0 |
| Параметр | Что делает | По умолчанию |
|---|---|---|
Config.Categories | Категории, предлагаемые при добавлении товара; окно магазина группирует товары по ним | items, weapons, misc |
Config.InventoryImagePath | Список папок с картинками. Для каждого товара окно по очереди пробует <item name>.png в каждой папке и берёт первую, которая загрузилась | nui://ox_inventory/web/images/ |
Config.AllowEmployeesAddProducts | В магазинах игроков — могут ли сотрудники добавлять новые товары. Владельцы могут всегда; управлять существующими сотрудники могут всегда | false |
Не используете ox_inventory? Укажите в Config.InventoryImagePath папку с картинками вашего инвентаря, например nui://qb-inventory/html/images/. Добавьте вторую запись, если ваши картинки разложены по нескольким папкам.
Ограбления
Заголовок раздела «Ограбления»| Параметр | Что делает | По умолчанию |
|---|---|---|
Config.BlacklistWeapons | Предполагается как список оружия, с которым нельзя начать ограбление. Эта версия его не читает: ограбление начинается с любым оружием, и только голыми руками — никогда | weapon_unarmed, weapon_nightstick, weapon_stungun |
Config.RobberyNotifyJobs | Работы, которые оповещаются о начале ограбления | police |
Config.PoliceAlert | "default" оповещает перечисленные выше работы уведомлением и блипом на минуту. "custom" вместо этого вызывает TriggerPoliceAlert в bridge/server.lua | "default" |
Config.RobberyCooldown | Запасной кулдаун для магазина, у которого сохранённого нет. Код считает его в минутах, как и поле для конкретного магазина (комментарий в config.lua говорит о секундах) | 300 |
Config.TakeRobberyMoneyFromVault | В магазинах игроков денежные награды берутся из сейфа магазина — и прекращаются, когда он пуст | true |
| Параметр | Что делает | По умолчанию |
|---|---|---|
Config.Screenshot | Прикреплять к логам Discord скриншот экрана игрока. Требует запущенного screenshot-basic | true |
Сама ссылка на webhook задаётся для каждого магазина в панели, а не здесь.
Команды и разрешения
Заголовок раздела «Команды и разрешения»| Команда | Кто может использовать | Что делает |
|---|---|---|
/shopcreator | ACE mic_shop.open | Открывает панель Shop Creator. Переименовывается через Config.Command и, как любая команда, может быть назначена на клавишу в настройках FiveM |
Владельцам и сотрудникам магазинов разрешения не нужны: окно магазина показывает им кнопку-шестерёнку Shop Settings, когда они открывают магазин, которым владеют или в котором работают.
Поставляются двенадцать языков: en, es, fr, de, it, pt, ru, ja, ko, zh-CN, ar и nl. Текст хранится в двух местах, и оба следуют за Config.Locale:
locales/<code>.lua— то, что показывает игра: уведомления, подсказки, сообщения об ограблении.html/locales.js— то, что показывают панели и окно магазина, по одному блоку на язык.
Как добавить язык:
- Скопируйте
locales/en.luaвlocales/<code>.luaи переведите текст справа в каждой строке. Ключи и любые%sоставьте. - Добавьте
locales/<code>.luaвshared_scriptsвfxmanifest.luaрядом с остальными, чтобы игроки его скачивали. - В
html/locales.jsскопируйте блок'en', переименуйте его в ваш код и переведите. - Укажите свой код в
Config.Locale, выполнитеrefreshи перезапустите ресурс.
Ключ, которого не хватает в вашем Lua-файле, отображается в игре как Translation not found: <key>.
Четыре открытых файла в bridge/. Названия функций оставляйте как есть — код магазинов вызывает их по имени.
bridge/server.lua — один блок для ESX, один для QBCore, выбирается через Config.Framework.
| Функция | Для чего нужна |
|---|---|
GetPlayer, GetPlayerJob | Объект игрока и его работа |
GetMoney, AddMoney, RemoveMoney | Наличные |
GetAccount, AddAccountMoney, RemoveAccountMoney | Именованные счета: bank, black_money |
GetInventoryItem, AddInventoryItem, RemoveInventoryItem | Предметы. Если запущен ox_inventory, читает через него |
GetPlayerInventory | Инвентарь владельца, который показывается, когда он закупает товар для магазина |
ShowNotification | Серверные уведомления |
RegisterServerCallback | Колбэки через ESX или QBCore |
TriggerPoliceAlert(x, y, z, shopLabel) | Вызывается при каждом ограблении, если Config.PoliceAlert = "custom". По умолчанию пуста — вставьте сюда вызов вашего диспетчерского скрипта |
bridge/client.lua — ShowNotification, ShowHelpNotification, GetPlayerData и TriggerServerCallback. На QBCore ShowHelpNotification пуста; заполните её собственным вызовом подсказки или draw-text, если вы используете Config.Interaction = 'default' или хотите видеть приглашение для сотрудника.
bridge/target.lua — добавляет пункт «открыть магазин» каждому продавцу (или небольшой сфере, если Config.SpawnNPC выключен) для ox_target или qb-target и снова убирает их при изменении магазинов.
Собственный диспетчерский скрипт полиции: задайте Config.PoliceAlert = "custom" и впишите вызов оповещения вашего диспетчерского ресурса в TriggerPoliceAlert в bridge/server.lua. Функция получает координаты продавца и название магазина.
Экспорты
Заголовок раздела «Экспорты»Клиентские экспорты для открытия магазинов из другого ресурса:
| Экспорт | Аргументы | Что делает |
|---|---|---|
OpenShop | ID магазина, ID локации | Открывает окно этого магазина с учётом его кулдауна и ограничения по работе |
OpenShopAsEmployee | ID магазина, ID локации | То же, что OpenShop; шестерёнка Shop Settings появляется, если игрок владеет магазином или работает в нём |
OpenShopAsOwner | — | Открывает панель Shop Creator, если у игрока есть mic_shop.open |
Ресурсы target также могут вызывать клиентское событие mic_shopcreator:client:openShop, передав в данных shopId и locationId, — именно так работают встроенные опции target. ID магазинов и локаций — те, что показаны в панели.