Небольшой реверс инжиниринг Minecraft

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

Дальше немного о том, как Minecraft написан, как функционирует и соображения почему-же оно смогло так хорошо продаться.

Если кто не в курсе, Minecraft это такая себе игра, которая представляет собой Dwarf Fortress от лица рядового гнома. Можно крафтить вещи, копать ямы и отбиваться от монстров. Мир бесконечен - создается на лету. Физические ограничения - 65 тыс. квадратных километров.

Minecraft написан на Java с использованием http://lwjgl.org/ - некой платформо-зависимой прослойки, которая представляет собой что-то типа SDL, но для Java. Игра может работать как апплет в браузере или как standalone приложение. Разница только в точке входа.

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

Кода мало. Ну, реально, там несколько десятков классов, простой рендер, простая сетевая подсистема. Это в клиенте. В сервере итого меньше.

Взять тот же рендер - там все на кубиках построено. Земля рендерится через VBO, куда накидываются видимые грани кубиков. Никакого occlusion culling нет, да и не нужен он - там все квадратиками и в одном VBO до 15 тысяч полигонов. Никаких шейдеров, все на FFP.

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

Собственно я решил сделать себе радар с минералами для мультиплеера. Вариантов несколько:

1. Сделать injection своего Java класса и работать с игровыми данными
2. Сделать прослойку между opengl.dll и игрой и выключать z-test для нужной мне геометрии

С первым вариантом мне не хотелось возиться - копать обфусцированный Java код то еще удовольствие.

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

Ну заодно зафиксировал цвета в VBO, чем получил равномерное освещение везде.

Как бы пруф:

Ну и напоследок…

Посмотрев внутренности игры, однозначно прихожу к выводу, что идея решает. Главное совсем уж не подкачать с реализацией. Человек не сильно заморачивался с картинкой, кодом и просто взял интересную идею и начал обвешивать ее фичами. Я не могу сказать, что Minecraft хорошо написан, не могу сказать что Notch (собственно автор) мега-супер-программер. Просто человеку пришла в голову хорошая идея и он, как умел, ее реализовал. Я совершенно не могу сравнить количество труда затраченного на Minecraft с любой другой более крупной игрой. Народ тратит уйму денег, уйму усилий и совершенно не добивается того, что смог сделать один программист с хорошей идеей.

Так что congratulations Notch.

blog comments powered by Disqus