
К недостатку, количества контента в игре (блоки, мобы и другое) маловато, пройти игру можно всего за несколько часов. Сделать её интересной помогает моддинг, добавляющий тонны нового контента, чтобы играть было по-настоящему интересно. Сегодня я расскажу (на основе личного опыта), какие же проблемы стоят перед моддингом игры и созданием сервера с модами.
Зачем вам это знать? Это повод ответить на вопрос, почему на серверах не появляются новые моды (в том числе самописные) и почему все силы уходят на борьбу с ошибками игры.
Проблема 1: Закрытый исходный код игры.
Чтобы что-то разрабатывать под игру, хорошо бы знать как это всё работает. Да вот незадача: Minecraft в нынешнем виде – это коммерческий продукт с закрытым исходным кодом.Существует возможность «добыть» исходники игры благодаря Mod Coder Pack (MCP). Качество полученного кода никакое, потому что исходники получаются путём деобфуксации и декомпиляции файлов игры. В коде отсутствуют какие-либо комментарии от разработчиков (они теряются при компиляции), качество деобфуксации очень сильно хромает: попробуй угадай что делает func_147108_a() и зачем нужно поле field_70170_p.
Поскольку выбора никакого нет, всем кто занимается моддингом, приходится пользоваться всем этим «добром». Учитывая большую известность MCP, вопрос необходимости обфуксации (запутывания) кода игры остаётся открытым. Кроме неудобств, пользы от неё никакой...
Проблема 2: Отсутствие официального API для моддинга.
Раз уж исходный код игры закрыт, её разработчики могли бы позаботиться о создании официального API для моддинга. Кто как не они, лучше зная устройство игры, могут предоставить исчерпывающую документацию по его использованию. Когда-то давно разработчики игры «кормили завтраками» про введение Plugin API. Как мы видим, появиться ему было не суждено.API необходимо для того чтобы иметь возможность установить сразу несколько модов, не конфликтуя друг с другом. Эту проблему отчасти решил Minecraft Forge. Данное API от сообщества упрощает установку модификаций игры, добавление нового контента, отслеживание игровых событий и всё. В Forge не хватает набора вспомогательных утилит для выполнения рутинных действий, например работы с инвентарями. Из-за этого каждому автору мода приходится «изобретать велосипеды», что нередко приводит к багам.
В качестве примера возьмём работу с инвентарём. Допустим, нам надо поместить в сундук какой-то предмет. На первый взгляд задача кажется простой. А на деле всё обстоит куда сложнее: найти свободные слоты в инвентаре или же объединить предмет с существующими, не забыв при этом проверить идентичность и чтобы кол-во не превышало максимальный размер стопки. Мест, где можно ошибиться здесь хватает...
В некоторых случаях возможностей Forge не хватает, приходится делать костыли из-за отсутствия способа сделать это грамотно. К таким случаям я отношу: использование фейк-игроков для «автокликеров»; различные способы перемещения блоков.
Автокликеры. Повод для использования фейка, вместо игрока вызван необходимостью научить механизм или существо использовать инструменты без участия игрока, поскольку это единственный и универсальный способ, совместимый со всеми модами. При использовании, предмет (допустим, кирка) в качестве одно из параметров получает объект игрока, использующего инструмент в данный момент. Это нужно для всяких проверок связанных с игроком (зависит от мода). Если не передать этот параметр (а у нас игрока нет, если использует механизм), в подавляющем большинстве случаев произойдёт краш. Потому широко используют «фейков» (подделку) вместо настоящего игрока, дабы инструмент мог получить необходимые ему сведения об игроке. Сложность здесь доставляет ещё работа с инвентарём игрока. Очень сложно синхронизировать инвентарь фейка с инвентарём механизма.
Перемещение блоков. Все блоки в игре размещаются по сетке. Блоки можно ставить и разрушать - третьего не дано. Поршни умеют работать только с «простыми» блоками - теми, которые не имеют логики. Сундуки, печки и другие блоки с логикой поршни перемещать не могут из-за привязки логики к блоку по его координатам. Создателям модов этого мало: они придумывают различные телепорты и инструменты, дающие возможность переместить любой блок, попутно получая порцию новых багов и дюпов. А всё потому, как было сказано ранее, третьего не дано. В игре нет способа убрать блок без уведомления о разрушении: если мы «сетним» сундук, он в любом случае выбросит своё содержимое, а это уже получается дюп. Приходится делать костыли для очистки инвентаря и блокировки дропа с блока из-за отсутствия возможности уведомить блок о готовности к перемещению. А авторы модов не имеют никакой возможности запретить перемещение своих блоков (особенно это актуально для многоблочных конструкций).
Проблема 3: Целый «зоопарк» платформ.
Если разработчики игры не дают API, тогда его сделает сообщество. Так возникло множество платформ для разработки под игру начиная от: Bukkit, ModLoader, Forge, SpoutCraft, заканчивая Sponge. Недостатком является отсутствие совместимости между этими платформами, их создатели словно «живут в разных вселенных», не признавая существование других платформ. Хорошо, хоть Forge и ModLoader объединились.Каждая из платформ имеет свои достоинства и недостатки. Bukkit очень удобен для разработки серверных плагинов, имеет хорошую документацию; Forge позволяет устанавливать моды. В итоге, чтобы создать тот самый идеальный сервер, нам приходится совмещать Forge и Bukkit. Одна платформа даёт возможность добавлять новый контент в игру при помощи модов, другая – управлять сервером при помощи плагинов.
Тут то начинаются проблемы: платформы не знают о существовании друг друга; не рассчитаны на совместную работу. При разработке ядра сервера с поддержкой этих двух API, обязательно что-нибудь да сломается. Приходится постоянно делать «фиксы» модов, чтобы те не обходили плагины привата. Недостатком Bukkit является отсутствие поддержки модов, из-за чего приходится использовать различные трюки для получения к объектам из модов. В общем, очень много ненужной работы приходится делать, чтобы вся эта «солянка» из модов и плагинов работала стабильно.
Проблема 4: Игра далеко до идеала.
Поговорив о сложностях разработки под игру, мы плавно переходим в её устройству.Наиболее известной проблемой всех массовых серверов являются лаги. Проблема эта вызвана вовсе не плохим железом или тем что игра написана на Java. Проблема в архитектуре игры. Всё современное железо наращивает свою мощность за счёт увеличения кол-ва ядер. У нас в игре основная логика обрабатывается одним потоком, то есть игра задействует только одно ядро процессора. Это делает невозможным масштабирование сервера путём приобретения более мощного железа. В итоге приходится довольствоваться небольшим числом слотов, о тысяче говорить не приходится.
Все мы хотим новый контент и в этом нам помогают регулярно выходящие обновления игры. Игрокам хорошо, а вот для владельцев серверов и создателей модов, обновления - это боль. Если простым серверам с плагинами обновляться несложно (а для них это единственный способ получения новых возможностей), то свою идеально отлаженную сборочку с модами придётся пересобирать с нуля. Беда в том, игру с каждым обновлением переписывают чуть ли не наполовину, ломая при этом совместимость кодовой базы предыдущих версий. Инструкции по техническим изменениям для создателей модов, разработчики не предоставляют. В общем, разбирайтесь сами как хотите и наступайте на те же грабли. Потому даже у опытных создателей модов, после обновления присутствует много ошибок. Кто-то наоборот, забрасывает поддержку своего творения, из-за того что ему надоело постоянно обновляться.
Качество кода игры оставляет желать лучшего, он похож на лапшу. В игре нет разделения между логикой и игровым движком. Код GUI (интерфейсы с кнопочками) перемешан с вызовом OpenGL функций. Вот так мы получаем баги с текстурами и отрисовкой, потому что запросто можно забыть включить/отключить нужный GL-атрибут. Отсутствует какой-либо GUI фреймовик. Всё приходится рисовать вручную, рассчитывать позицию элементов управления, обрабатывать взаимодействие с ними. Потому интерфейс игры такой скудный.
Разрабатывая ядро сервера, я лучше познакомился с устройством игры. В это время я нашёл новые ошибки, которые Mojang почему-то не считают нужным исправлять:
- Любимый всеми Java программистами NullPointerException. В игре нигде не предусмотрено защиты от передачи null-значения. Попытка исправить это, породила новые ошибки в модах, использующих «грязный хак».
- Предмет с кол-вом 0 - это нормально. В игре нигде нет проверки на количество, везде проверка только на null. Пришлось её дописывать самому, чтобы игроки не могли ставить «багнутые» предметы в рамку.
- Помеченные к удалению сущности, могут взаимодействовать с блоками. Но зачем? Кроме дюпов (например, бросание предмета в тигель) это ничего полезного не даёт. В итоге блокам приходится проверять валидность сущности, хотя обработчик мира просто не должен давать их. Если же проверку забыли сделать - получите дюп.
- Возникла ошибка при сохранении мира? Не беда - мы её просто выведем в лог. Если откажет диск - сервер у нас продолжит работать дальше, а после перезапуска всех откатит обратно в каменный век. Почему не предусмотрена остановка сервера при возникновении критических ошибок!?
- Страдайте игроки, пока сервер сохраняет карту! Mojang не умеет писать многопоточный код. Дикие лаги в старых версиях игры вынудили их сделать сохранение карты в фоне. Получилось так себе: сервер периодически фризит, пока он дожидается завершения сохранения всех чанков.
Каким должен быть идеальный майнкрафт
На этом мы заканчиваем часть, касающуюся проблемы игры. Хочется рассказать, какой хотелось бы видеть игру. В первую очередь, Minecraft должен стать не просто игрой, а платформой для моддинга. Разработчики игры должны заниматься улучшением игры, оптимизируя её и расширяя возможности API. Контент для игры пусть создаёт сообщество, оно способно дать намного больше, чем разработчики игры.Нынешние обновления игры можно назвать бестолковыми. Игре уже 10 лет, уровень качества графики не поменялся, зато системные требования выросли. Создаётся впечатление, что разработчики сами не знают чего добавить: то новые цветные блоки добавят или мобов, то надумают поменять «надоевшие» текстуры и модель лошади. Разработчики отчасти стараются идти навстречу сообществу, но получается оно так себе: вместо API с безграничными возможностями, мы получаем костыли в виде JSON конфигов, чтобы игра у нас тормозила ещё больше.
Что в итоге
Признаюсь, я расстроен таким положением дел в игре. Для меня разработка модов - дело неблагородное. Даже если ты умеешь создавать качественный код, майнкрафт тебя всё равно обломает. Здесь если пытаешься исправить один баг, будь готов получить ещё два. Сплошной бардак, где никому ничего не надо.Крупнейший сервер Hypixel не так давно заявил о создании собственной игры наподобие Minecraft. Это правильное решение, потому что потолок возможностей Minecraft весьма ограничен...