RE:NODE

Minecraft13 мин чтения

Экономика Minecraft: EssentialsX, Vault, магазины и стоки

Настройка экономики сервера: что на самом деле делает Vault, балансы и цены команд в EssentialsX, плагины магазинов, провайдер на базе данных и борьба с инфляцией.

0 прочтений

Экономика в Minecraft - это три задачи, которые решают три разные вещи: что-то, что хранит балансы, Vault, чтобы все остальные плагины могли это найти, и один или несколько плагинов магазинов, перемещающих деньги между игроками. На Paper стандартный ответ - EssentialsX для балансов, Vault в роли моста и плагин магазина сверху, и эта связка вытянет сервер выживания на сто игроков, ни разу не обратившись к базе данных. Чего никто не планирует, так это устройства самой экономики - где деньги входят на сервер и где выходят, - а именно это определяет, будут ли цены хоть что-то значить через три месяца.

Что такое Vault и чем он не является#

Vault - это не экономика. Он не хранит балансы, в нём нет команд, которые бы кому-то выдавали деньги, и почти нет настроек. Это справочник: плагины регистрируются как провайдеры, другие плагины спрашивают Vault «кто здесь отвечает за экономику?», и Vault отдаёт ссылку. Тот же механизм работает для прав и префиксов чата, благодаря чему чат EssentialsX показывает префикс LuckPerms, хотя эти два плагина ничего не знают друг о друге.

только один провайдерПлагин магазиназапрашивает балансыПлагин Jobsплатит игрокамVaultнаходит провайдераПровайдер экономикиEssentialsX или другойБалансыфайлы или база данных
Vault - справочник, а не банк

Отсюда три следствия, и все три порождают обращения в поддержку:

  • Один Vault ничего не делает. Установите его без провайдера, и каждый плагин магазина запишет в лог что-то вроде «no economy plugin found» и отключится.
  • Ровно один провайдер. Установите две экономики, и одна из них выиграет регистрацию. Тогда балансы расходятся: /balance показывает одно число, магазин списывает с другого, и игроки замечают это задолго до вас.
  • Vault - это зависимость, а не функция. Настраивать и подстраивать в нём нечего.

Проверить, что зарегистрировалось, можно одной командой в консоли:

bash
$ vault-info

Она выводит зарегистрированных провайдеров экономики, прав и чата. Если строка экономики пуста или называет то, что вы не собирались ставить, остановитесь на этом и исправьте, прежде чем трогать что-либо другое. Существует поддерживаемый преемник под названием VaultUnlocked, добавляющий поддержку нескольких валют, но большинство плагинов по-прежнему ориентируются на оригинал, так что ставьте то, что просит ваш список плагинов, и никогда не оба сразу.

EssentialsX Economy: вариант по умолчанию и его пределы#

EssentialsX - поддерживаемый форк Essentials, а его экономика входит в базовый jar - отдельной загрузки нет. Необязательные модули (chat, spawn, protect, anti-build, GeoIP, Discord) - это отдельные jar-файлы, и ставить стоит только те, которыми вы пользуетесь, потому что каждый добавляет обработчики событий на однопоточный сервер.

Прежде чем что-либо строить сверху, нужно понять, где лежат деньги:

code
plugins/Essentials/  config.yml  worth.yml  kits.yml  economy.log  userdata/    0d2a2b79-....yml    3f1c88e1-....yml

Один YAML-файл на игрока, с ключом по UUID, в userdata/. Это и есть весь механизм хранения. У EssentialsX нет SQL-бэкенда, и никакая настройка его не добавит. Для одного сервера это вполне нормально - чтение и запись небольшого файла быстры, ломаться тут нечему. Перестаёт быть нормальным это ровно в двух ситуациях: когда за прокси стоит несколько серверов, которым нужны общие балансы, и когда сервер работает с online-mode=false, где UUID генерируются из имён, а не выдаются Mojang, так что смена имени или переключение режима незаметно отрывает игрока от его денег.

Команды, которыми пользуются на самом деле:

КомандаЧто делает
/balance [player]Ваш баланс или чей-то чужой
/baltopТаблица лидеров и ваш индикатор инфляции
/pay <player> <amount>Перевод от игрока к игроку
/eco give|take|set|reset <player> <amount>Создание денег администратором
/sell hand|all|blocksПродажа серверу по ценам из worth.yml
/worth [item]Сколько за это платит сервер

/eco создаёт деньги из ничего. Она должна принадлежать одной группе, должна журналироваться, а выдать её модераторам, «чтобы они помогали людям», - самый частый способ убить экономику сервера. Права для неё - essentials.eco, для остального - essentials.pay, essentials.balance.others, essentials.sell и essentials.worth. Выдавайте их группам, а не отдельным игрокам - руководство по LuckPerms описывает наследование, чтобы группа модераторов незаметно не унаследовала права владельца.

Настройки, формирующие экономику#

Большинство регуляторов находятся в одном файле:

plugins/Essentials/config.yml
starting-balance: 100currency-symbol: '$'min-money: 0max-money: 10000000000000economy-log-enabled: truecommand-costs:  home: 50  sethome: 500  tpa: 25  back: 100enabled-signs:  - buy  - sell  - balance  - trade

О четырёх из них стоит сказать по предложению.

starting-balance по умолчанию равен 0. Небольшой стартовый баланс дружелюбнее нулевого, потому что новичок без денег не может купить инструменты, которые позволили бы ему хоть что-то заработать. Большой - это кран, масштабирующийся вместе с числом зашедших людей.

min-money по умолчанию отрицательное число, а это значит, что игроки могут уходить в долг. Если долг не входит в ваши игровые механики, поставьте 0.

max-money по умолчанию равен десяти триллионам, а это не потолок, а скорее слух. Снижение его до значения, которого игрок может реально достичь, придаёт числу смысл и делает неконтролируемую инфляцию заметной, вместо того чтобы её поглощать.

economy-log-enabled записывает каждую транзакцию в plugins/Essentials/economy.log: кто, сколько и зачем. По умолчанию выключено. Включите сейчас, потому что день, когда он понадобится, - это день, когда кто-то уже потратил деньги.

command-costs - самая недоиспользуемая возможность плагина. Плата за /home, /tpa, /back и /sethome создаёт постоянный, скучный отток с баланса каждого активного игрока, а именно это и нужно экономике. Заодно она мягко отбивает охоту к спаму телепортацией, из-за которого сервер выживания начинает походить на лобби.

Цены для /sell и /worth берутся из отдельного файла:

plugins/Essentials/worth.yml
worth:  cobblestone: 0.05  iron_ingot: 6  gold_ingot: 9  diamond: 120  wheat: 1  sugar_cane: 0.2

Современный EssentialsX использует в качестве ключей названия материалов; очень старые файлы использовали числовые ID предметов, и их нужно конвертировать. У предмета без записи продать нельзя, и сообщение об ошибке так и говорит - это самый быстрый способ выяснить, что ваш worth.yml неполон.

Магазины: таблички, сундуки и меню#

Три семейства, и большинству серверов нужны два из них.

Сундуки-магазины игроков. ChestShop и QuickShop-Hikari - обычный выбор. Игрок ставит сундук, вешает на него табличку, а остальные щёлкают, чтобы купить у него товар из запаса или продать ему. Это самый здоровый вид магазина, потому что деньги движутся между игроками вбок, а не появляются и исчезают, и потому что запас конечен. QuickShop-Hikari - поддерживаемый форк старой линейки QuickShop; данные магазинов он по умолчанию хранит в собственной файловой базе и может быть направлен на внешнюю. В любом случае под сундуками-магазинами нужна защита территории, иначе магазин - просто сундук, который может открыть кто угодно.

Административные магазины с меню. EconomyShopGUI - обычный бесплатный вариант, есть и платные альтернативы. Меню, фиксированные цены, бесконечный запас и бесконечный спрос. Их легко настроить, и именно они порождают почти всю инфляцию, потому что административный магазин, который покупает предмет по фиксированной цене, - это машина, превращающая продукцию ферм в деньги без верхнего предела.

Аукционы и торговые команды. Игрок с игроком, никаких фиксированных цен, и полезный сток, если брать плату за размещение лота или процент.

Рядом стоит сторона доходов. Обычно это Jobs Reborn: он платит игрокам за добычу, земледелие, строительство и убийства, а его кривая выплат - главный кран вашей экономики. Все эти плагины работают через Vault, и все откажутся включаться, если провайдер не зарегистрировался, поэтому /vault-info - первое, что стоит проверить, если плагин магазина не появляется.

Краны, стоки и почему на каждом сервере заводится триллионер#

Экономика - это бак с кранами и сливами. Деньги, что входят, - кран, что выходят, - сток, а сервер с кранами и без стоков раздувается, пока цены не перестанут что-либо значить, и единственное интересное число - сколько нулей у кого-то на счёту.

КраныСтоки
Продажа административным магазинамПокупка в административных магазинах
Выплаты JobsЦены команд (/home, /back)
Награды за голосование и время игрыНалоги магазинов и плата за размещение
Награды за квесты и подземельяСтоимость ремонта, зачарования и косметики
/eco giveАренда привата или участка

Классический провал настолько конкретен, что его можно назвать. Административный магазин покупает сахарный тростник по фиксированной цене. Кто-то строит автоматическую ферму тростника. Теперь у сервера есть печатный станок, выпуск которого ограничен только числом ферм, и через две недели верхний баланс в тысячу раз превышает медианный. Та же история повторяется с арбузами, бамбуком, железными фермами и дропом мобов.

Два правила предотвращают большую часть этого:

  • Цена определяется временем добычи с учётом автоматизации. Не тем, насколько предмет кажется редким. Если редстоун-машина может производить его, пока никого нет онлайн, цена покупки должна быть около нуля, либо административный магазин вообще не должен его покупать.
  • Административные магазины должны в основном продавать, а не покупать. Пусть игроки покупают у игроков. Сервер продаёт то, что игроки сделать не могут, - спавнеры, удобства без прав, косметику, - а покупает почти ничего.

Стоки тоже должны масштабироваться. Фиксированные 50 за /home - реальные траты в первый день и бесплатно к третьей неделе. Процентные стоки - налог 5% с каждой продажи в магазине, плата 2% за размещение на аукционе - сами идут в ногу с экономикой. Фиксированные сборы - нет.

Раз в неделю смотрите /baltop и записывайте цифры. Стабильный рост общей суммы и верхнего баланса - это нормально. Верхний баланс, удваивающийся каждый месяц, - это кран, который вы не задумывали, и включённый ранее лог подскажет, какой именно. Если вы думаете о реальных деньгах поверх всего этого, сначала прочитайте монетизацию игрового сервера в рамках правил, потому что собственные коммерческие правила Minecraft ограничивают то, что можно продавать.

Перенос экономики в базу данных#

База данных для экономики нужна в двух случаях: когда несколько серверов за прокси должны делить один баланс и когда вы хотите запрашивать или анализировать данные экономики вне игры. В остальном файлы годятся и проще.

Поскольку EssentialsX так не умеет, придётся менять провайдера. XConomy и TheNewEconomy - бесплатные провайдеры Vault с хранением в SQL; CMI - платный комбайн, в который входит экономика с той же возможностью. Что бы вы ни выбрали, рискованная часть - миграция: убедитесь, что у нового плагина есть импортёр данных userdata EssentialsX, запустите его на копии, сравните /baltop до и после и храните старую папку userdata/, пока не будете уверены.

Игровые тарифы на RE:NODE включают один слот базы данных. Вы создаёте его в панели, и она сама генерирует хост, имя базы, пользователя и пароль, а кнопка «Open in phpMyAdmin» входит в phpMyAdmin с одноразовым токеном, действующим шестьдесят секунд. Как бы ваш плагин ни называл раздел хранилища, ему нужны одни и те же пять значений:

yaml
host: '<the host shown on the slot>'port: '<the port shown on the slot>'database: '<the generated database name>'username: '<the generated user>'password: '<the generated password>'

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

Как делать это правильно, описано в статье резервные копии и восстановление баз данных, а как переносить данные в слот и из него вручную - в статье импорт и экспорт в phpMyAdmin. Если экономика общая для сети за прокси, то сети прокси Velocity объясняют, почему у каждого плагина с состоянием в такой сети та же проблема.

Резервные копии, аудит и способы, которыми пропадают деньги#

Деньги исчезают или умножаются небольшим числом предсказуемых способов.

  • Ошибка в правах персонала. Кто-то наследует essentials.eco от родительской группы. Проверяйте группы, а не людей, и держите /eco в одном месте.
  • Баг дупликации. Любой дюп превращается в бесконечные деньги, как только административный магазин покупает продублированный предмет по фиксированной цене. Это вторая причина, по которой административные магазины не должны много покупать.
  • Восстановление. Откат мира откатывает и файлы userdata/, если они в той же резервной копии, и не откатывает, если экономика в базе данных.
  • Неаккуратная остановка. EssentialsX записывает файлы игроков по мере изменения балансов, но процесс, убитый при достижении лимита памяти, всё равно может потерять последние записи. На RE:NODE сервер, достигший лимита памяти, останавливается и запускается заново с чистого состояния, а не уходит в swap, - это правильное поведение, но последние секунды всё же теряются, поэтому оставляйте запас, а не подгоняйте heap под тариф вплотную.
  • UUID в offline-режиме. При online-mode=false идентификатор - это хэш имени. Балансы следуют за именами, а не за людьми.

Держите журнал транзакций включённым, держите включённым журнал блоков, чтобы можно было доказать, что лежало в сундуке магазина, и разделяйте доступ к панели и власть в игре: модератору, которому нужна консоль, не нужны платежи, а роли и субпользователи панели существуют как раз для такого разделения. Сторона панели описана в статье субпользователи и минимальные привилегии, а внутриигровая - в статье защита от грифинга и античит, откуда и берутся доказательства.

Игровые тарифы включают слоты для резервных копий, которые можно запускать по требованию или с вкладки Schedules, а восстановление - одна кнопка. Сделайте копию перед сменой провайдера, перед массовой правкой worth.yml и перед тем, как кому-то выдать /eco.

Устранение неполадок#

«No economy plugin found» при запуске. Отсутствует Vault, либо ничто не зарегистрировалось как провайдер. Выполните /vault-info. Если строка экономики пуста, ваш плагин экономики не загрузился - пролистайте лог вверх и найдите его собственную ошибку.

`/balance` работает, но магазин говорит, что экономики нет. Установлены два провайдера, и магазин получил не того. Удалите один.

Балансы сбрасываются до стартового. Изменился UUID. Проверьте, что online-mode в server.properties не переключали, и что файл в userdata/ по-прежнему существует с ожидаемым именем.

«You cannot sell that.» В worth.yml нет записи для этого материала, либо ключ записан старым числовым ID.

Магазины на табличках ничего не делают. Тип таблички не указан в enabled-signs, либо у игрока нет права essentials.signs.use.<type>. Таблички работают только для включённых типов.

Деньги не сохранились после сбоя. Ожидаемо для последних записей после неаккуратной остановки. Если это происходит регулярно, сервер упирается в лимит памяти; это проблема размера, а не экономики.

FAQ#

Нужен ли мне вообще Vault?

Если какой-либо плагин, кроме плагина экономики, работает с деньгами, то да. Магазины, работы, аукционы и большинство плагинов квестов находят экономику через Vault. Серверу, где деньгами пользуется только EssentialsX, формально он не нужен, но вы всё равно установите его в течение недели.

Может ли EssentialsX хранить балансы в базе данных?

Нет. Он записывает по одному файлу YAML на игрока в plugins/Essentials/userdata/. Экономика на базе данных означает замену провайдера на такой, который поддерживает хранение в SQL, и перенос балансов.

Как остановить инфляцию без вайпа?

Сначала закройте краны: перестаньте покупать в административных магазинах предметы, которые можно фармить, и сгладьте верх кривой выплат Jobs. Затем добавьте масштабируемые процентные стоки, например налог на продажи в магазинах. Вайп - крайняя мера, о нём нужно объявлять за недели.

Могут ли игроки иметь один баланс на нескольких серверах?

Только с общим хранилищем. Балансы в файлах привязаны к серверу, так что сети за прокси нужен провайдер экономики на базе данных, к которой подключаются все бэкенды.

Какой стартовый баланс разумен?

Достаточный для первого набора инструментов и пары телепортаций, и не больше. Точное число зависит от ваших цен; проверка - может ли новичок сделать что-то полезное в первый час, не пропуская при этом первую неделю.

Как сбросить экономику?

Остановите сервер, сделайте резервную копию, затем либо удалите файлы userdata/ (это заодно сотрёт дома и прочее состояние игроков), либо воспользуйтесь командой сброса вашего провайдера для всех игроков. /eco reset <player> возвращает одного игрока к стартовому балансу, и это более безопасный инструмент, когда проблема в одном аккаунте, а не во всей экономике.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000