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

За свою 9-летнюю историю (если считать от даты релиза) Minecraft заработал потрясающее количество поклонников и хейтеров как среди обычных игроков, так и среди гиков. Простая концепция мира из кубиков превратилась из обычного развлечения в универсальную среду для общения и создания различных объектов из реального мира.

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

Что такое прокси-сервер за 7 минут

Но не будем дальше говорить о том, что именно игроки создают, а посмотрим на серверную часть приложения и осветим проблемы (порой весьма сложные), которые могут возникнуть в процессе работы под нагрузкой. Сразу оговоримся, что речь пойдет только о Java Edition.

Виды серверов

Самым простым вариантом является сервер, встроенный в клиент игры. Создали мир, нажали на одну кнопочку, и вот сервер стал доступен по локальной сети. Никакой серьезной нагрузки такой вариант выдержать не может, а поэтому мы не будем его даже рассматривать.

Vanilla

Компания Mojang Studios распространяет серверную часть игры в виде Java-приложения бесплатно на официальном сайте. Это позволяет создать свой собственный выделенный сервер и персональный мир, сделав его доступным для подключения из любой точки планеты. Для тех, кто делает это впервые, есть отличный туториал, доступный в соответствующей игровой Wiki.

У этого подхода есть один серьезный недостаток, а именно — отсутствие возможностей «из коробки» подключать плагины, расширяющие функционал сервера и позволяющие не только автоматизировать многие процессы, но и оптимизировать производительность. Кроме того, у официального сервера достаточно большое потребление оперативной памяти на каждого подключенного игрока.

Bukkit

Созданное энтузиастами на базе Vanilla-версии серверное приложение Bukkit значительно расширяло возможности игры за счет поддержки плагинов и модов (модификаций). Оно позволило не только добавлять в игровой процесс новые блоки, но и выполнять различные манипуляции, недоступные ванильному ПО. Что интересно, памяти это приложение требовало значительно меньше.

Установить Bukkit не составляет особого труда, соответствующая инструкция есть на ресурсе GamePedia. Но это не имеет смысла, так как с 2014 года команда Bukkit распалась, разработчики проекта стали сотрудниками Mojang Studios, а репозиторий заброшен. Таким образом, Bukkit фактически мертв, и имеет смысл обратить внимание на два следующих проекта.

Обход АНТИ ПК + Читы | Прокси МКПЕ

SpigotMC

Для облегчения жизни разработчиков плагинов была необходимость в API для взаимодействия с игровым миром. Именно эту задачу и решили создатели Spigot, взяв за основу ядро Bukkit и переработав его для достижения лучшей надежности и производительности. Тем не менее, Git-репозиторий проекта был заблокирован в связи с Законом об авторском праве в цифровую эпоху (DMCA), и скачать оттуда исходники невозможно.

На текущий момент SpigotMC активно развивается и используется. Он поддерживает все плагины, созданные под Bukkit, однако с ним обратно не совместим. Чтобы обойти запрет DMCA Takedown, был придуман элегантный способ под названием BuildTools. Этот инструмент избавляет от необходимости дистрибуции скомпилированного приложения и позволяет пользователям выполнить компиляцию Spigot, CraftBukkit и Bukkit из исходного кода. Все это делает запрет DMCA бесполезным.

PaperMC

Казалось бы, все круто, и Spigot стал прекрасным вариантом. Но некоторым энтузиастам этого показалось мало, и они запилили свой собственный форк Spigot «на стероидах». На странице проекта ключевым достоинством указано, что “It’s stupid fast”. Развитое коммьюнити позволяет оперативно решать возникающие вопросы, а расширенное API — делать интересные плагины. Запустить PaperMC можно одной простой командой, приведенной в документации.

С совместимостью у PaperMC все прекрасно, так что написанные плагины под SpigotMC легко заработают и на PaperMC, но без официальной поддержки. Обратная совместимость со SpigotMC также присутствует. Теперь, когда мы перечислили различные варианты создания сервера, перейдем к тем проблемам производительности, которые могут возникать.

Читайте также:  Самая маленькая пушка в Майнкрафт

Проблемы и решения

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

Так что при выборе сервера следует обращать внимание не на количество ядер, а на тактовую частоту. Чем она будет выше, тем лучше будет производительность.

Что касается вопроса об объеме оперативной памяти, тут следует исходить из следующих показателей:

  • планируемое количество игроков;
  • планируемое количество миров на сервере;
  • размер каждого мира.

Следует помнить, что Java-приложению всегда нужен запас по оперативной памяти. Если вы рассчитываете на потребление памяти в 8 гигабайт, то фактически надо иметь 12. Цифры условные, но суть от этого не меняется.

Для запуска серверной части рекомендуем воспользоваться флагами, указанными в статье Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Эта «черная магия» позволяет серверу грамотно настроить «сборщик мусора» и оптимизирует использование оперативной памяти. Не стоит выделять памяти больше, чем реально потребляет сервер при пиковом наплыве игроков.

Генерация карты блоков

Вы действительно считаете, что Луна существует, только когда вы на неё смотрите?

Альберт Эйнштейн

Абсолютно новый сервер. Как только игрок первый раз успешно подключается, игровой персонаж появляется на общей точке сбора (спаун). Это единственное место, где игровой мир предварительно генерируется сервером. В этот же момент клиентская часть смотрит в настройки, и ключевым параметром является дальность прорисовки. Измеряется она в чанках (область карты 16×16 и высотой в 256 блоков) Сколько чанков там указано, именно столько и будет запрошено у сервера.

На сервере хранится глобальная карта мира, и если в ней еще нет сгенерированных блоков в точке появления игрового персонажа, то сервер их динамически генерирует и сохраняет у себя. Мало того, что это требует больших вычислительных ресурсов, так еще и постоянно увеличивает размер карты мира. На одном из старейших анархических серверов 2b2t (2builders2tools) размер карты уже превысил 8 Tb, а граница мира проходит на отметке в 30 млн блоков. С этим сервером связаны тысячи историй, и он заслуживает отдельной статьи серии статей.

Генерация мира вокруг одного игрока — не проблема. Генерация мира вокруг сотни игроков вызовет незначительные тормоза сервера на протяжении короткого времени, после чего нагрузка снизится. Генерация мира на дальность прорисовки клиента вокруг тысячи игроков уже способна «уронить» сервер и повыбрасывать с него всех клиентов по таймауту.

В серверном ПО имеется такое значение, как TPS (Ticks per Server — тактов в секунду). Штатно 1 такт равен 50 мс. (1 секунда реального мира равна 20 тактам игрового мира). Если обработка одного такта вырастет до 60 секунд — серверное приложение будет закрыто, выкинув всех игроков.

Выход — ограничить мир определенными координатами и выполнить предварительную генерацию блоков. Тем самым мы снимаем необходимость динамической генерации в процессе игры, и серверу будет достаточно прочитать уже существующую карту. Оба вопроса решаются одним-единственным плагином WorldBorder.

Проще всего задать границу мира в виде окружности относительно точки спауна (хотя можно ее сделать любой формы) одной командой:

/wb set spawn

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

/wb fill

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

/wb confirm

В общей сложности на то, чтобы сгенерировать мир радиусом в 5000 блоков (~40 млрд блоков) ушло примерно 2 часа на процессоре Intel® Xeon® Gold 6240. Поэтому, если хотите запустить прегенерацию большей карты, учитывайте, что этот процесс займет приличное количество времени, а TPS сервера будет серьезно снижено. Кроме того, помните, что даже радиус в 5000 блоков потребует примерно 2 Гб места на дисковом накопителе.

Читайте также:  Как изменить описание предмета в Майнкрафт

Несмотря на то, что крайняя версия плагина была разработана для Minecraft версии 1.14, опытным путем выяснено, что она прекрасно работает и на последующих версиях. Полный список команд с пояснениями доступен на форуме плагина.

Проблемные блоки

Разновидностей блоков в Minecraft великое множество. Однако мы бы хотели остановить внимание читателей на таком блоке, как TNT. Как следует из названия, этот блок представляет собой взрывчатку (примечание редакции — это игровой предмет виртуального мира и ничего с настоящими ВВ этот предмет не имеет). Его особенность такова, что в момент активации на него начинает действовать сила гравитации. Это заставляет сервер обсчитать все координаты, если в этот момент блок начинает падать.

Если блоков TNT несколько, то детонация одного блока вызывает детонацию и включение гравитации у соседних блоков, разбрасывая их во все стороны. Вся эта красивая механика на стороне сервера выглядит как множество операций по подсчету траектории каждого из блоков, а также взаимодействия с соседними блоками. Задача крайне ресурсоемкая, что легко может проверить каждый. Сгенерируйте и подорвите куб из блоков TNT, размером хотя бы 30x30x30. И если вы думали, что у вас хороший мощный игровой компьютер, то сильно заблуждались

/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt

Подобный «эксперимент» на сервере с Intel® Xeon® Gold 6240 привел к серьезной «просадке» TPS и 80% нагрузке на CPU в течение всего времени детонации блоков. А следовательно, если кто-либо из игроков сможет проделать подобное, то проблема с производительностью затронет всех находящихся на сервере игроков.

Еще более жесткий вариант — Кристаллы Края. Если TNT все же взрывается последовательно, то Кристаллы Края детонируют все одновременно, что в теории может вообще остановить работу серверного приложения.

Избежать этого сценария можно, только полностью запретив использование данных блоков в игровом мире. Например, с помощью плагина WorldGuard. Обратите внимание, что сам по себе этот плагин не работает без другого плагина WorldEdit. Так что устанавливаете вначале WorldEdit, а затем WorldGuard.

Заключение

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

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

Источник: selectel.ru

Прокси для Майнкрафт

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

Когда нужен прокси для Майнкрафт

У любого геймера очень часто возникают ситуации, когда есть острая потребность использовать прокси. Такой посредник в Интернет-сети становится незаменимым помощником, перенаправляющим трафик.

Когда же нужен прокси для Майнкрафт? В тех случаях, если:

  • разработчик или местные провайдеры по некоторым причинам закрывают доступ к игре (в определенных странах);
  • создает несколько аккаунтов в игре;
  • использовать анонимно IP адрес устройства;
  • блокируется с офисного ПО;
  • блокировать вредоносный трафик в сети.

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

Прокси позволяет обращаться к Интернет-ресурсам со скрытым IP адресом. Поэтому вас невозможно будет «вычислить» с помощью IP адреса.

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

Читайте также:  Когда вышла minecraft dungeons

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

Какие же виды прокси можно использовать для Майнкрафт? Бесплатные (фри) и платные (индивидуальные) прокси. Однако фри прокси не рекомендуется использовать в силу ряда причин:

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

Индивидуальный прокси, наоборот, имеет высокую скорость, стабильно низкий пинг, анонимный IP адрес, безопасность и конфиденциальность, круглосуточную поддержку.

Как использовать прокси для Minecraft

Использование прокси возможно в тех случаях, если есть программы, поддерживающие работу с ним. Если такие программы отсутствуют, то на помощь приходят специальные программы-проксификаторы. Например, полезная утилита Proxifier создана в таких целях. Она автоматически отслеживает данные, которые поступают от приложений и перенаправляет соединения. Ее ключевыми особенностями являются возможность запускать приложения через прокси, поддерживать работу с разными клиентами, мониторить сетевые соединения и скрывать IP-адрес.

Для настройки прокси в проксификаторе нужно в запущенной программе выбрать Profile и создать запись для прокси-сервера с помощью Add. На вкладке вписать IP адрес, порт, логин и пароль. Затем в Advanced вносим наименование прокси-сервера. Сохранив данные, возвращаемся в предыдущее окно и проверяем обновления. После успешной проверки сохраняем настройки.

При настройке рекомендуется отказаться пропускать все соединения через прокси.

Следующим этапом настройки является настройка правил. Для этого добавляем правило и выбираем файл, создающий трафик для прокси. Затем в открывшемся окне выбираем Майнкрафт и сохраняем настройки. В результате в главном окне программы-проксификатора будет отображаться выбранное приложение, которое будет работать через настроенный Proxifier.

Источник: proxy-sale.com

Прокси#

Перед началом создания модов надо понять и правильно использовать очень важную вещь.

Дело в том, что Minecraft состоит из нескольких частей:

  • Физический клиент — это программа, которую вы запускаете с помощью лаунчера.
  • Физический сервер, который часто называется выделенным сервером — программа, которая запускается с помощью файлов типа minecraft_server.jar .
  • Логический клиент отвечает за отображение моделей и текстур, за прием данных от мышки и клавиатуры, за отображение GUI.
  • Логический сервер отвечает за всю игровую логику: спавн мобов, погоду, обновление инвентарей, AI и все другие механики игры.

Зачем надо это знать? А затем, что при попытке выполнить отрисовку текстуры блока на стороне сервера он незамедлительно крашнется! И наоборот, попытка реализовывать игровую механику (открытие GUI, создание взрывов) на стороне клиента может привести к непредсказуемым багам, появлению пустых твердых блоков, рассинхронизации и так далее.

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

CommonProxy#

Для начала нам надо создать класс для выполнения действий, которые должны выполняться на стороне и клиента, и сервера.

Для этого создайте пакет proxy внутри пакета нашего мода и класс CommonProxy внутри него. Объявите внутри класса три уже знакомых вам метода:

public class CommonProxy public void preInit(FMLPreInitializationEvent event) > public void init(FMLInitializationEvent event) > public void postInit(FMLPostInitializationEvent event) > >

ClientProxy#

Теперь создадим класс для действий, которые должны выполняться только на стороне клиента, а именно:

  • Регистрация моделей блоков/мобов/предметов
  • Регистрация рендеров этих самых моделей
  • .

Для этого создадим класс ClientProxy, наследующий класс CommonProxy в пакете proxy:

Заметьте, что мы вызываем все три метода из CommonProxy с помощью super , чтобы они обязательно выполнились на стороне клиента.

Регистрация в главном файле#

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

Эта аннотация содержит два поля, которые обозначают пути до классов ClientProxy и CommonProxy. При запуске, Forge будет автоматически определять нужную сторону (клиент/сервер) и создавать объект класса ClientProxy или CommonProxy.

Последнее, что нам нужно сделать: выполнить три метода (preInit, init, postInit) в нашем главном файле мода:

Полный код главного файла мода:

Источник: mcmodding.ru