TeamKind

Проект игровых серверов Minecraft Bedrock: выживание и мини-игры на одном инстансе, общие аккаунт и экономика между инстансами, глубоко модифицированное серверное ядро.

Период
август 2018 г. — декабрь 2023 г.
Статус
Завершён
Моя роль
Основал проект в 2018 году и первые два года вёл сообщество, а разработку — с 2020-го. Как ведущий разработчик отвечал за архитектуру, ядро и ключевые системы. По отдельным вопросам советовался с разработчиком другого крупного Minecraft-проекта, часть плагинов и отдельных механик отдавал на фриланс.
Баннер TeamKind: три режима — Survival, SkyWars и FastBuilders

Стек

  • PHP
  • PocketMine-MP
  • Guzzle
  • Slim
  • MySQL
  • SQLite
  • Redis
  • WebSocket
  • nginx
  • JavaScript

Задача

До TeamKind я вёл сообщество одного из крупных проектов Minecraft Bedrock Edition: хорошо видел, какие жалобы повторяются и чего игрокам не хватает, но влиять на продукт не мог. Хотелось проект, где разработка идёт от обратной связи, платные привилегии расширяют возможности, не превращаясь в pay-to-win, а выживание, SkyWars и FastBuilders работают как одна система, а не три отдельных продукта. Технически задача упиралась в ограничения используемого ядра и конфигурации: обычное выживание начинало терять TPS уже около 70–80 игроков, а держать предстояло несколько миров и мини-игры сразу. Отдельной проблемой были злоупотребления через сформированные сетевые пакеты.

Решение

Игрок всегда заходит через лобби: оно проверяет активную сессию и отправляет его на закреплённый инстанс, а нового игрока — на наименее загруженный. Каждый инстанс держит выживание, SkyWars и FastBuilders одновременно. Переход в мини-игру происходит внутри него: инвентарь сохраняется, подготавливается под режим и возвращается после матча. Игрока никуда не пересаживают. Между инстансами общие аккаунт, привилегии, валюта и кейсы. Дома и приваты привязаны к карте и остаются локальными. Для этого я развивал и дорабатывал собственную версию серверного ядра, адаптируя её под высокую нагрузку, несколько игровых режимов и устранение уязвимостей.

Архитектура

Архитектура TeamKindЛобби — единая точка входа: игрок подключается к нему всегда, система проверяет активную сессию и отправляет его на закреплённый инстанс, а новому назначает менее загруженный. Инстанс можно сменить и вручную. Аккаунт, привилегии, валюта и кейсы общие между инстансами, а карта, дома и приваты привязаны к своему. Каждый инстанс держит выживание, SkyWars и FastBuilders: переход между режимами происходит внутри него, инвентарь сохраняется и возвращается. Активная сессия у аккаунта может быть только одна.инвентарь сохраняется и возвращаетсяобщеена закреплённый инстанс, новому — на менее загруженныйЛобби— 19132единая точка входа — игрок всегда подключается сюдапроверяет активную сессию — она у аккаунта только однаИгровой инстанс 1— 19133ВыживаниеSkyWarsFastBuildersДанные картыкарта, дома и приваты этого инстансаИгровой инстанс 2— 19134тот же набор режимовсвоя карта, свои дома и приватыОбщий слой проектааккаунт · привилегии · валюта · кейсы
Лобби — единая точка входа: игрок подключается к нему всегда, система проверяет активную сессию и отправляет его на закреплённый инстанс, а новому назначает менее загруженный. Инстанс можно сменить и вручную. Аккаунт, привилегии, валюта и кейсы общие между инстансами, а карта, дома и приваты привязаны к своему. Каждый инстанс держит выживание, SkyWars и FastBuilders: переход между режимами происходит внутри него, инвентарь сохраняется и возвращается. Активная сессия у аккаунта может быть только одна.

Ключевые технические решения

  • Собственный форк ядра. Апстрим PocketMine-MP к тому моменту официально не поддерживался, а базовое ядро не покрывало требований проекта, поэтому я существенно доработал его под необходимую нагрузку, стабильность и игровую механику.
  • Мини-игры внутри инстанса выживания, а не на отдельных серверах: инвентарь сохраняется и восстанавливается, переподключения нет, и SkyWars не ощущается отдельным продуктом.
  • Аккаунт, привилегии, валюта и кейсы общие между инстансами, а всё привязанное к карте остаётся локальным: купленное работает везде, но дома и приваты остаются привязаны к конкретной карте.
  • Один аккаунт — одна активная игровая сессия: одновременно играть с него на нескольких инстансах нельзя. Чтобы перейти на другой инстанс, игрок сначала завершает текущую сессию.
  • Управляемая перезагрузка: перед обновлением сервер корректно завершает активность, вместо того чтобы обрывать игроков на середине.

Проект игровых серверов Minecraft Bedrock Edition, в котором полноценное выживание было объединено с SkyWars и FastBuilders.

Ядро

Отдельные инстансы держали 180+ игроков одновременно. Ядро существенно дорабатывалось под нагрузку проекта.

TeamCore — глубоко модифицированный форк серверного ядра с существенными изменениями в производительности, сетевой безопасности, работе миров и чанков, а также игровой логике. После доработок ядро стабильнее работало под нагрузкой и лучше соответствовало требованиям проекта. Благодаря этим изменениям TeamKind стал одним из первых серверов Minecraft Bedrock Edition 1.1.X в СНГ, где полноценное выживание и SkyWars работали на одном сервере при высоком для этого ядра онлайне. Это же позволило добавить много собственных команд и игровых механик без потери стабильности. Одна из стабильных версий этого ядра доступна здесь.

Логотип TeamCore
Логотип собственного форка ядра — TeamCore.

Обзор

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

Аккаунт и авторизация

Для всех серверов проекта использовался единый аккаунт. Сначала пароли хешировались SHA-512 с индивидуальной солью и дополнительным серверным секретом, который не хранился в базе. Через несколько месяцев схему заменили на bcrypt: он создан для хранения паролей, а его намеренно высокая вычислительная стоимость делает перебор дорогим. После входа сессия сохранялась, и при переходе между серверами пароль вводить заново не требовалось.

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

Сайт доната и платежи

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

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

Донат без pay-to-win

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

Границы доната: что привилегии дают и чего намеренно не дают, чтобы платящий игрок не получал преимущества в бою.

Бонусные вопросы

Бонусные вопросы связывали игру с группой проекта во ВКонтакте. Вопрос, время публикации и награда задавались на сервере, а за пять минут до старта сервер сам создавал в группе отложенную запись. Игрок отвечал командой /bonus на любом сервере проекта; сервер проверял время и ответ и при успехе выдавал награду.

Бонусные вопросы
Бонусный вопрос: задание публикуется в сообществе, игрок отвечает прямо в игре командой /bonus, за верный ответ выдаётся награда. Сам вопрос, время и награда настраиваются на сервере.

Управляемая перезагрузка

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

Управляемая перезагрузка
Перезагрузка предупреждает игроков, доигрывает мини-игры и выдаёт награды, прежде чем сервер уйдёт на обновление.

Модерация

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

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

Торговля между игроками

Игроки покупали и продавали предметы друг другу через встроенную торговлю. Механика закрывала типичные схемы обмана и со стороны продавца, и со стороны покупателя. Особо ценные предметы выставлять на продажу было нельзя, а с каждой сделки сервер удерживал комиссию 10% от стоимости предмета.

Сделка между игроками: витрина с доступными товарами, комиссия 10% и механика, закрывающая обман с обеих сторон. Особо ценные предметы выставить нельзя.

Игровые механики

Уровни

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

Система уровней: уровень растёт за проведённое в игре время, причём бездействие не засчитывается.

FastBuilders

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

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

Магическая раздача

На специальных участках спавна периодически появлялись редкие и ценные предметы.

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

Невидимость

В отличие от стандартного эффекта невидимость убирала не только модель персонажа, но и все признаки присутствия: частицы эффектов, звуки шагов, броню и подсказки при взаимодействии. Команда /vanish list показывала модераторам всех, кто сейчас невидим.

Невидимость: игрок скрывается целиком, не только модель, но и все признаки присутствия.

Другие механики

В видео — система случайных заданий с наградами и смена ника, префикса и скина прямо в игре.

Ещё несколько систем, сделанных за годы: небольшие, но заметные в повседневной игре.

Результаты

  • Один инстанс держал 180+ игроков одновременно.
  • Выживание, SkyWars и FastBuilders работали внутри одного инстанса, без пересадки игрока между серверами.
  • Аккаунт, привилегии, валюта и кейсы оставались общими между инстансами.
  • Доработанное ядро устранило исходное ограничение производительности: до этого используемая конфигурация начинала терять TPS уже при 70–80 игроках.

Метрики

игроков онлайн на одном инстансе
180+

Факты

  • Самый активный игрок проекта Wauder за последний год работы TeamKind провёл в игре 1339,3 часа; второй результат — 797,5 часа у Said_123.
  • Одна из стабильных версий собственного форка ядра TeamCore сохранилась в открытом доступе на GitHub.