Выдача покупок
Как купленное доезжает до игрового сервера, плагином или через RCON
Игрок нажал «Купить», деньги списались. Теперь предмет надо положить ему в инвентарь, а привилегию выдать на сервере. Способа два, нужный вы выбираете в карточке каждого сервера.
UnicoreConnect — плагин для Spigot/Paper/Sponge. Сайт складывает покупку на склад, плагин ходит в API и забирает её при заходе игрока.
Плюсы: работает с офлайн-игроками, ничего не теряется при падении сервера, покупка не зависит от того, доступна ли консоль. Экономика, баны и статистика игрового времени тоже ездят через него.
Минус один: плагин надо поставить. На модовых сборках без Bukkit-совместимости это не всегда получится.
Сайт сам подключается к консоли сервера и выполняет команды: lp user ... parent add vip, give Notch minecraft:diamond 64.
Плюсы: ставить ничего не нужно, подойдёт любой сервер с RCON, хоть ванильный, хоть модовый.
Минусы: игрок должен быть в сети (большинство команд не работают с офлайн-игроками), а команды придётся описать шаблонами под ваш плагин прав.
У каждого сервера свой способ
Один сервер может жить на плагине, другой на RCON. А у отдельного товара способ можно переопределить, если ему нужна особая команда.
Настройка RCON
Включить RCON на игровом сервере
В server.properties:
enable-rcon=true
rcon.port=25575
rcon.password=длинный-случайный-парольПорт наружу не открывать. Протокол RCON передаёт пароль практически открытым текстом; если сайт и сервер на разных машинах, гоняйте через приватную сеть или SSH-туннель.
Прописать доступ в карточке сервера
Управление контентом → Серверы → нужный сервер → блок RCON. Хост, порт, пароль. Сайт шифрует пароль в базе на ENCRYPTION_KEY и наружу его не отдаёт.
Кнопка Проверить соединение открывает сессию и говорит, подходит ли пароль. Не пропускайте этот шаг: половина проблем с выдачей вылезает здесь. Работает она только после того, как сервер сохранён.
Переключить способ выдачи
В той же карточке: Способ выдачи → RCON.
Выбрать пресет команд
Управление контентом → Серверы → Выдача (RCON). Откроется окно с шаблонами команд. Шаблоны общие для всех серверов и задаются один раз.
В каждом пресете лежат команды под конкретный плагин прав:
| Пресет | Платформа |
|---|---|
| LuckPerms | Bukkit/Spigot/Paper, Forge, Fabric, Sponge, Velocity |
| EssentialsX + GroupManager | Bukkit/Spigot/Paper |
| PermissionsEx (PEX) | Bukkit/Spigot/Paper, legacy |
| FTB Ranks | Forge / NeoForge / Fabric |
| PowerRanks | Bukkit/Spigot/Paper |
| Sponge (Nucleus + LuckPerms) | SpongeForge / SpongeVanilla |
| Vanilla /give | Ванильный сервер, только предметы |
Выберите пресет и нажмите Заполнить: семь шаблонов подставятся готовыми командами. Дальше правьте руками, пресет только даёт отправную точку. У каждого поля показано, во что команда развернётся с реальными значениями, а плейсхолдеры собраны отдельным списком. Кликаете по полю команды, потом по плейсхолдеру, и он вставляется в это поле.
Ник или UUID
UUID в командах принимают LuckPerms и PowerRanks. Остальные работают по нику, поэтому в их пресетах стоит {user.username}. Если поменять одно на другое «чтобы надёжнее», команды перестанут находить игрока.
Семь шаблонов
| Шаблон | Когда выполняется |
|---|---|
| Выдача предмета | Покупка товара в магазине |
| Выдача группы навсегда | Куплена привилегия без срока |
| Выдача группы на срок | Куплена привилегия на период |
| Снятие группы | Срок привилегии вышел |
| Выдача права навсегда | Куплено донат-право без срока |
| Выдача права на срок | Куплено донат-право на период |
| Снятие права | Срок права вышел |
Пустой шаблон означает «ничего не делать». Если у вашего плагина нет временных групп, оставьте «на срок» пустым. Тогда сработает бессрочный вариант, а снятие возьмёт на себя фоновая задача по расписанию.
Плейсхолдеры
В шаблоны подставляются значения в фигурных скобках. Неизвестный плейсхолдер остаётся в команде как есть. В очереди это видно, так что опечатку найти легко.
| Плейсхолдер | Пример |
|---|---|
{user.username} | Notch |
{user.uuid} | 069a79f4-44e9-4726-a5be-fca90e38aaf5 |
{user.real} | 150.00 |
{user.virtual} | 10.00 |
{user.email} | user@example.com |
| Плейсхолдер | Пример |
|---|---|
{server.id} | hitech |
{server.name} | HiTech |
{server.version} | 1.12.2 |
| Плейсхолдер | Пример |
|---|---|
{product.name} | Diamond |
{product.id} | 42 |
{product.item_id} | minecraft:diamond |
{product.nbt} | {Enchantments:[{id:sharpness,lvl:5}]} |
{product.amount} | 64 |
{product.price} | 99.00 |
| Плейсхолдер | Пример |
|---|---|
{group.ingame_id} | vip |
{permission.node} | essentials.fly |
| Плейсхолдер | Пример |
|---|---|
{period.seconds} | 2592000 |
{period.duration} | 30d |
{period.duration} подходит плагинам, которые понимают 30d или 12h. Если плагин ждёт число секунд, берите {period.seconds}.
Пример: LuckPerms
lp user {user.uuid} parent add {group.ingame_id}
lp user {user.uuid} parent addtemp {group.ingame_id} {period.duration} accumulate
lp user {user.uuid} parent remove {group.ingame_id}Не убирайте `accumulate`
Без этого флага повторная покупка не продлевает привилегию, а перезаписывает срок. Игрок, купивший второй месяц на двадцатый день первого, потеряет десять дней и придёт разбираться.
Пример: ванильная выдача
give {user.username} {product.item_id} {product.amount} {product.nbt}Порядок аргументов в /give менялся между версиями Minecraft, а в 1.13+ NBT записывается иначе. Прогоните команду в консоли сервера руками, прежде чем пускать её в магазин.
Очередь
Команды не летят в консоль мгновенно. Они ложатся в очередь, а фоновая задача разбирает её каждые пять секунд. Так покупка не потеряется, если сервер в этот момент перезагружался.
Что происходит при неудаче:
- Команда получает попытку и уходит в ожидание.
- Задержка удваивается с каждой попыткой: 30 секунд, минута, две… до получаса.
- После восьмой неудачной попытки команда помечается как проваленная и больше сама не повторяется.
- Если сервер не отвечает, очередь не шлёт ему остальные команды в этом заходе и не тратит попытки впустую.
Очередь открывается кнопкой Очередь команд в карточке сервера: там видно, что ушло, что ждёт, что упало и с какой ошибкой. Кнопка Повторить неудачные возвращает все упавшие команды в работу с нуля. Ею и лечат ситуацию «сервер лежал сутки».
Онлайн-игрок
Большинство плагинов прав умеют работать с офлайн-игроками, а вот /give — нет. Если покупки предметов регулярно падают с ошибкой «игрок не найден», значит игроки покупают с сайта, не заходя в игру. Здесь выручит только выдача через плагин со складом.
Ручная выдача
В карточке пользователя есть кнопка выдачи: предмет или привилегия конкретному игроку, без оплаты. Команды идут той же дорогой, через очередь и по тем же шаблонам. Удобно для компенсаций и разборов.