UnicoreCMS

Выдача покупок

Как купленное доезжает до игрового сервера, плагином или через 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). Откроется окно с шаблонами команд. Шаблоны общие для всех серверов и задаются один раз.

В каждом пресете лежат команды под конкретный плагин прав:

ПресетПлатформа
LuckPermsBukkit/Spigot/Paper, Forge, Fabric, Sponge, Velocity
EssentialsX + GroupManagerBukkit/Spigot/Paper
PermissionsEx (PEX)Bukkit/Spigot/Paper, legacy
FTB RanksForge / NeoForge / Fabric
PowerRanksBukkit/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 — нет. Если покупки предметов регулярно падают с ошибкой «игрок не найден», значит игроки покупают с сайта, не заходя в игру. Здесь выручит только выдача через плагин со складом.

Ручная выдача

В карточке пользователя есть кнопка выдачи: предмет или привилегия конкретному игроку, без оплаты. Команды идут той же дорогой, через очередь и по тем же шаблонам. Удобно для компенсаций и разборов.

Содержание