Приветствую вас, дорогие любители бесконечных слотов на серверах MineCraft!
Материал, который я сегодня предложу вам, написал замечательный человек, модератор, и RJ ๖ۣۜmkrtes.
В нем вы найдете много интересной информации..
... о том, как работают сервера MineCraft.
... о том, почему не рекомендуется делать больше 100 слотов.
... о том, почему сервера лагают.
... как они устроенны.
....и многое другое!...
Многие из наших игроков никогда не задумывались о том, как же работает сервер, на котором они играют? Зато они любят жаловаться на лаги, возмущаться запретом каких то предметов, и предлагать поставить на сервера "какой нибудь мод" и увеличить количество слотов на сервере.
В этой статье я вкратце опишу вам, как работают наши сервера и откуда берутся ЛААААГИ!
А так же почему администрация не ставит на сервера кучу очень полезных модов и плагинов...
Это Java - язык программирования,
на котором написан майнкрафт...
- Чанки — для тех, кто не знает, весь мир Minecraft разделён на куски площадью 16х16 кубов и высотой в зависимости от настроек. Все чанки в радиусе видимости игроков загружены в память сервера и находятся в HashMap-е, каждый «тик» сервера каждый чанк обрабатывается. В это время выполняется следующее: все активные чанки (те, которые находятся в определенном радиусе от игроков) перебираются по очереди. Для каждого чанка выполняется обработка погоды (насыпать снег, ударить молнией), а так же случайная обработка блоков — из всего чанка выбирается несколько десятков случайных блоков, проверяется, нужно ли эти блоки обновлять (по типу блока) и вызывается специальная функция на выбранном блоке.
- Тайлы — это специальные блоки, которые обрабатываются каждый тик, а не случайно. К данным блокам относятся печи (обновление статуса пережигания материала, оставшегося топлива, это должно делаться равномерно, а не случайно, как тик остальных блоков), так же там находятся спавнеры мобов (блоки, которые спавнят мобов вокруг себя), котлы для зельеварения и подобные вещи. Они все хранятся в списке (List), который заполняется при загрузке чанка или при установке нового тайла во время работы, и перебираются каждый цикл по очереди.
- Срочные блоки — они, конечно, так не называются, но тем не менее, это блоки, которые нужно обработать «срочно», то есть на следующем цикле или с небольшой задержкой (тоже в циклах, тут все считается в циклах, даже время, даже аллах), а не случайно, т.к. случайные блоки обрабатываются раз в несколько минут в среднем. Обрабатываются примерно как тайлы, только у них может быть указана задержка, через сколько циклов их нужно обработать. Задачи на обработку обычно генерируются во время работы сервера из-за действий игрока или других блоков. В частности, так обрабатывается редстоун, который должен очень быстро реагировать на внешние изменения, блоки огня, текущая вода и подобные.
- Обновление света — Minecraft использует статическое освещение, разделенное на блоки. Каждый блок имеет свой уровень освещённости от 15 до 0. При изменении блоков их освещённость должна быть пересчитана, алгоритм не очень сложный, но рекурсивный, а так же есть два типа освещения — от блоков (факелов, огня и тп) и от неба, они должны рассчитываться независимо, то есть два раза на каждое изменение (если в мире есть небо, в Nether его нет).
- Entity — это практически все объекты. Мобы, игроки, предметики, валяющиеся на полу, тележки, лодки, картины, молния, стрелы и прочее. Все они хранятся в одном большом списке и по очереди на них вызывается функция tick(), перед этим проверяется, не умерли ли они, если умерли, то они удаляются из списка и из памяти сервера, соответственно.
- Спавн мобов — тоже отдельное действие. Мобы спавнятся в определенном радиусе от игрока, при этом выбирается случайная точка в чанке и на основе нескольких сдвигов в разные стороны выбирается, можно ли поставить туда моба, и он создаётся
- Обработка игроков — все пакеты, которые прислали игроки необходимо обработать, очевидно. Каждое движение, взмах рукой, восстановление здоровья, поворот головы - все это обрабатывается сервером.
- Загрузка и генерация чанков — если происходит попытка доступа к блоку чанка, которого нет в памяти, чанк должен быть загружен с диска, если его нет на диске, он должен быть сгенерирован. Не надо объяснять, что жесткий диск почти всегда очень узкое место. Генерация чанка ещё сложнее, чем его загрузка.
- Сохранение чанка — во время общего сохранения сервера или просто, когда чанк долго не использовался и может быть выгружен, чанки необходимо сохранить на диск — преобразовать в поток и записать в файл.
Казалось бы, все нормально и тут нет ничего преступного, все сделано довольно хорошо и добавить нечего. Проблема тут такая: всё это обрабатывается в одном основном потоке. В последних версиях в Mojang почитали немного про многопоточные штуки и научились сохранять чанки на диск в отдельном потоке. Безусловно это прорыв, потому что это было чертовски узкое место, давным-давно сервер сохранялся по 15 минут и на это время полностью вис, теперь такого нет. Тем не менее, проблема не решена.
CraftBook - один из первых плагинов для Баккита, добавляет лифты,
ворота, мосты, станции для вагонеток и ускорители.
При этом есть ещё и Bukkit!
Indusrial Craft 2 - всем известный популярный мод, добавляет в мир электричество,
новые устройства, инструменты, блоки, предметы и многое другое.
А после всего этого, есть еще и МОДЫ!
Все, о чем говорилось выше - касалось чистого майна и майна с плагинами. На нашем проекте это сервера Classic, SandBox и TeraWars. Плагины много чего добавляют, но они оперируют только тем, что уже есть в майнкрафте. А что делать, если хочется.. например... новую руду? Титановую, например? Тут на сцену и выходят моды, которые добавляют в майн еще кучу всяких ресурсов, событий, взаимосвязей, рецептов крафта, существ, измерений.. и так далее и тому подобное. Примеры глобального мода - ThaumCraft, DivineRPG (стоят на 4 серверах нашего проекта)или IndustrialCraft (установлен на 7 серверах). Моды должны уметь взаимодействовать друг с другом, с плагинами и собственно с ядром майнкрафта.
Взаимодействие с другими модами еще проблематичнее - начиная от банального совпадения id разных предметов из разных модов, и заканчивая вопросом - что получится из уранового лома в утилизаторе? Может, он окажется не уничтожим, а может положит сервер ошибками обработки. И все эти сложности возрастают многократно, если мы захотим сделать не бессмысленный лом, а ввести его в игровой процесс того же ИндастриалКрафта, как часть механизмов.
Для серверов с модами существует особая платформа, называемая ForgeModLoader, которая позволяет добавить в майнкрафт урановый лом. В нем стандартизированы многие функции, и прописаны определенные правила разработки модов, соблюдение которых облегчает совместную работу модов. Ведется например единая база id предметов, что бы в разных модах под одним id не оказывались агуитовая броня и атомная бомба. Однако Forge работал только на "ванильном" чистом майнкрафте без плагинов!
(в статье использовано много материала с habrahabr.ru)
Ну а это - команда Mojang, которые в общем то и делают "главный" Майнкрафт :)