GreenCubes: от Minecraft до MMORPG за 4(?) года

в 15:36, , рубрики: game development, Gamedev, minecraft, mmorpg, геймдизайн, метки: , , ,

Приветствую вас, уважаемые читатели!

В этом посте я бы хотела поделиться с вами историей развития своего игрового проекта «GreenCubes», надеюсь, она будет вам интересна, а для кого-то окажется даже полезной. Думаю, данная статья может пригодится тем, кто начинает или недавно начал какой-то игровой проект, ведь чужой опыт всегда стоит учитывать. Я расскажу о том, насколько вредно зависеть от решений и услуг других, как делать всё самостоятельно и о том, что мечтать не вредно. В настоящее время мы располагаемся тут.

Minecraft

Наш проект (в начале нас было только двое: я и Feyola) начинался как сервер Minecraft для друзей. То есть, скорее для друзей друзей друзей, потому что с друзьями мы играли и раньше, но в этот раз решили запуститься уже на более-менее постоянной основе и не сильно фильтровать приходящих людей. Запуск наметили на 1 ноября 2010 года, приурочив его к выходу Minecraft Halloween Update, который принёс в Minecraft много нового. Мы расстались с нашим старым миром и начали всё заново, серьёзно и даже без админских команд.

Друзья приводили друзей, некоторые из них начали организовывать стримы — люди начали стремительно (по меркам того времени) прибывать. Буквально через недели проект начал требовать от нас усилия: внезапно из простого сервера, где мы планировали играть с друзьями, GreenCubes превратился в сервер, над которым нужно ещё и работать. Пришлось учиться, и учиться очень быстро: требовалось многое, от умения принимать важные решения, такие как ввод вайт-листа или, например, уменьшение лимита онлайна, чтобы сервер не упал (он как раз тогда стоял на окне :)), до администрирования серверов на Debian, написания собственных плагинов для сервера и создания полноценного сайта.

Сайты до этого я делать умела, а вот всё остальное было в новинку. Это было лучшее время в нашей жизни, наверное! Мы учились поднимать сервера на Линуксе и самому линуксу, написанию плагинов и программированию на Java, работе с сообществом. Довольно быстро мы решили, что мы должны начать заниматься этим серьёзно и попробовать заработать на проекте деньги. Перспектива выглядела туманно и даже сомнительно, но попробовать стоило. По крайней мере, свободного времени было достаточно.

Challenge

Первой действительно серьёзной проблемой стало то, что Pentium 4, стоявший на окне, уже не вытягивал. Собрав наши небольшие сбережения мы решили арендовать сервер. Именно стоимость аренды сервера на Windows (на тот момент другие варианты были нам слабо знакомы) подтолкнула нас к тому, чтобы учить Linux и поднимать сервер на Debian. Так, купив книжку и начитавшись мануалов, Feyola стала «системным администратором» :D

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

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

Заделав все дыры и изрядно понервничав, мы продолжили это нелёгкое дело. В следующий раз нам в спину ударил автор плагина для сервера Minecraft под названием «hey0» — модификации сервера, позволявшей для него плагины на Java. А сделал автор плагина вот что: он написал «я устал, я ухожу», попросту полностью остановив поддержку плагина. Тогда же зародился CraftBukkit — альтернативная модификация, которая стала заменой hey0. Но под него не было очень важного для нас плагина авторизации! Так что пришлось мне писать его самостоятельно.

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

Очень быстро нам перестало хватать того сервера, который мы арендовали. Собрав изрядные по тем временам для нас деньги, мы арендовали выделенный сервер (до этого ютились на виртуальном). Новый сервер позволил нам держать онлайн аж в 100 человек! Это была просто небывалая цифра, ни у кого таких цифр тогда (в феврале 2011) не было. Но сервер колоссально тормозил (замедление было более чем в 20 раз от номинальной скорости). Даже новый выделенный мощный сервер колоссально тормозил при 80+ игроках онлайн! Мы упёрлись в архитектуру сервера Minecraft. Очередной раз нас подвело то, что мы слишком зависим от сторонних продуктов.

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

К этому времени проект начал приносить какие-никакие, но деньги. Мы продавали премиум-аккаунт, который включал в себя, в основном, вход на сервер после его переполнения, и внутриигровые предметы. Жить на это вдвоём было ещё нельзя, но перспективы были. Если бы только удалось избавиться от жутких лагов и дать возможность играть всем, кто этого хочет…

Набравшись к тому времени опыта в программировании на Java мы возомнили себя «сильными» программистами, способными, если уж не горы свернуть, то хотя бы пофиксить узкие места в сервере, чтобы он стал по производительнее. К сожалению, мы только расшатали сервер, из-за наших «исправлений» он начал тормозить ещё больше и иногда даже падал… Не скажу, что мы совсем не добились результата: например, нам удалось перевести работу печек на секунды вместо циклов сервера, что улучшило игру, так как не приходилось ждать часами переплавки руды (позже такуе же очевидное изменение сделали авторы Bukkit). Но тогда мы в первый раз решили, что всё очень плохо, и если мы не изменим что-то кардинально, то нашему проекту конец: мы не можем уменьшить предел онлайна, мы не можем оставить сервер лагать, и уж тем более не можем увеличить предел. Очередь входа на сервер была уже огромной (относительно онлайна), люди жаловались на лаги и длинную очередь, уходили с проекта.

GreenServer

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

GreenServer, оглядываясь назад, был наверное самой наивной задачей из всех, которые мы тогда перед собой ставили. Ни я, ни Feyola не имели достаточно опыта как в программировании вообще, тем более в создании чего-то столь серьёзного. Я была уверена, что смогу закончить весь необходимый функционал к концу мая. Как стало модно последнее время говорить, «я никогда так сильно не ошибался».

К концу мая я не только не успела всё закончить — всё что я успела, это сделать ужасно забагованную тестовую версию практически без функционала. Я была уверена, что уж хотя бы ещё через месяц я точно всё закончу, сделаю всё что есть в официальном сервере Minecraft и наших плагинах, и мы пойдём дальше. Я снова сильно ошиблась, конечно же. И хотя нам удалось с горем пополам 27 июня 2011 года перейти на GreenServer, переход был печальным.

Мы получили ужасно нестабильный сервер, который не только не обладал огромной частью функционала (не было мобов, например), так ещё и постоянно падал, не говоря уж о многочисленных ошибках. За первые два дня мы исправили их просто уйму, и кое-как перешли с версии Alpha на версию Beta, что должно было означать хотя бы стабильность. Тогда мы решили, что к концу лета должны закончить всё, что потеряли при переходе, и перейти с версии Beta на версию 1.0. Стоит ли мне говорить, что сервер на стадии Beta до сих пор?

Мы выпускали по 3-5 обновлений в неделю, но всё равно совершенно не успевали в сроки. Перенести мобов с оригинального кода Minecraft не получалось из-за огромных различий в архитектуре, а в сервере тем временем находились всё новые и новые баги… Нам пришлось потратить всю осень 2011 года для того, чтобы сделать GreenServer стабильным, но это стоило того! Сервер смог тянуть более 300 игроков одновременно (наш рекорд — 500+), а перезагрузка требовалась лишь для установки обновления. Это был успех! Именно тогда мы поняли, что усилия стоили результата. Пожалуй, мы имели первый в мире полноценный сервер Minecraft, пусть и не с полным функционалом, зато поддерживающим огромный онлайн и официальный клиент последней версии.

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

Клиент

В то время мы тащили за собой клиент Minecraft. Он был немного модифицирован, с плагинами, но мы всегда переходили на самый новый клиент Minecraft. С одной лишь разницей от наших конкурентов в том, что фактически от новой версии у нас была лишь цифра. Большинство функций новых версий Minecraft не поддерживал сервер, и мы их не вводили либо намеренно, либо из-за недостатка времени. Однако некоторые функции мы всё же реализовывали, например, мы быстро сделали поршни, введённые в Beta 1.6, сразу подумав о том, как люди могут ими грифить постройки и введя необходимые меры защиты. Многие сервера после этого обновления серьёзно страдали от гриферов, но не мы. Мы научились думать, что если один игрок как-то может испортить игру другому игроку, он обязательно попытается это сделать. Конечно, не каждый игрок, но в более-менее открытом сообществе обязательно найдутся люди, которые захотят ему навредить.

После этого мы решили вводить свои идеи, свой контент. Мы поняли, что тянуть за собой постоянные бессмысленные обновления клиента Minecraft уже не возможно и приняли решение перестать обновлять клиент, и вводить только наши изменения, а не изменения Notch'а (создателя Minecraft) и Jeb'a (тот, кто начал разрабатывать Minecraft после выхода версии 1.0). Мы остановились на версии клиента 1.0, которая как раз вышла тогда. Наши руки были более-менее развязаны. С Minecraft у нас с того момента были разные пути.

Мы начали вносить серьёзные изменения контента и геймплея, требующих в том числе объемных модификаций клиента. Сделали мод на полноценное написание книг (которое и по сей день является гораздо более качественным, чем то, что позже ввели в Minecraft): у нас в сообществе книги стали довольно важны, каждый зажиточный игрок имеет свою библиотеку, многие игроки пишут свои книги или переписывают книги из других источников, развито (точнее, было развито) книгоиздательское дело.

Внесли такие серьёзные архитектурные изменения как расширение максимального количества типов блоков с 256 до 4095, которое тоже позже (значительно) появилось в оригинале. Конечно же мы не претендуем на право первопроходцев в этих модификациях, моды на Minecraft с такими функциями были задолго до того, как их сделали мы, но мы были первым действительно крупным сервером, который имел этот функционал.

Новички

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

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

Чтобы новичкам было проще играть, мы расширили мир, ввели систему обучения, создали города для новичков, параллельно вводя довольно много нового контента. Значительно облегчили регистрацию и начало игры на сервере. Вообще вопрос новичков в игре — очень большой и серьёзный. Его всегда стоит продумывать, когда начинаешь создание какой-либо игры. Нужно отдавать себе отчёт о том, как новички попадут в мир игры, что они будут делать в начале, как они узнают обо всём многообразии того, что можно делать в вашей игре. Уверена, где-то есть целая куча статей на тему того, как организовать приятный вход новичка в игру… Мы же даже не задумывались об этом в самом начале. Вы знаете, что почти никто не хочет проходить обучающие квесты? Мы это узнали очень не сразу.

Мы поняли, что наша игра слишком сложна для новичка. Даже не смотря на все наши усилия, играть, не прочитав перед этим несколько гайдов и без поддержки хотя бы википедии со списком рецептов крафта, было ужасно сложно первое время. Мы поняли, что для начала обязаны полностью изменить крафт. Мы используем крафт как в Minecraft, в котором все рецепты нужно запоминать или подсматривать. Конечно, с одной стороны это интересное геймплейное решение, с другой — совершенно бессмысленное: все рецепты крафта известны и вместо удобного крафта или поиска рецептов, получается лишь неудобное запоминание или подглядывание в третьи источники. Мы решили сделать красивый интерфейс крафта, в котором не нужно будет ничего запоминать. Придумали, сделали макет, нарисовали дизайн… получилось отлично! Одна лишь проблема: мы опять ударились в ограничение архитектуры. На этот раз архитектуры клиента.

Новый клиент

Возможно, абзац будет не совсем понятен далёким от программирования графики людям, но надеюсь это не будет большой проблемой.

Клиент Minecraft сделан на OpenGL без применения графического движка. Даже внутри кода клиента разделения на графический движок и логику почти нет, это значит, что вызовы OpenGL перемешаны с кодом логики. Для тех, кто серьёзно работал с OpenGL, возможно, будет очевидно, что вносить изменения в такой код, при этом ничего не сломав, ужасно сложно. Нужно обязательно не забыть где-нибудь сделать popMatrix и прочие glEnd и glDisable… Нет ничего удивительного, что через полтора года моей работы с таким кодом клиента, который к тому же писала не я сама, клиент начал сыпаться. Сыпаться просто ужасно, начиная от простых лагов, заканчивая совершенно странными графическими багами и падениями.

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

Правильное решение было лишь одно: мы должны начать писать новый клиент. Но это ещё не всё, новый клиент решил бы далеко не все наши проблемы.

Новая игра

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

Когда-то мы считали, что у нас есть отличная игра игра Minecraft, всё что нам нужно — сделать социальные функции для большого числа игроков, такие как города и экономика, избавиться от лагов, дать возможность большому числу игроков играть одновременно и мы будем успешны! Какое-то время это работало, но потом люди снова стали уходить.

Всё дело было в том, что у нас не так много осталось от Minecraft. Разве что убогие квадратные модельки, да изменяемый мир. Мы не ввели большого количества функций Minecraft, которые были интересны игрокам, у нас не было разнообразия интересных модов Minecraft. Мы не делали Minecraft, собственно, мы не делали ничего. У нас было много своего контента, у нас был изменяемый мир, но в целом у нас не было игры, в которую люди хотели бы играть. Всё что осталось у нас — социальная песочница, в которую переставало быть интересно играть даже заядлым олдфагам, которые играли у нас более двух лет.

Всё что нам оставалось — это делать игру. Настоящую игру, с геймплеем, а не просто песочницу. Но основной проблемой было то, что мы хотели делать MMORPG, при этом не лишаясь нашего сообщества и развитого мира…

И к нашему третьему дню рождения (1 ноября 2013), кроме нового клиента мы анонсировали разработку совершенно новой игры — MMORPG с полностью изменяемым миром.

Инди-разработчики

Вы никогда не задумывались о том, что крупные геймдев-компании постоянно кормят нас сиквелами уже давно всем надовших хитов? Assassins Creed XI, Call of Duty 20, Battlefield 9… Мало какая крупная компания позволяет себе сделать что-то совсем новое, конечно что-то более-менее новое появляется, когда какой-нибудь Близзард делает по-своему клон DoTA, но это всё же не новая игровая концепция.

Такое положение дел на рынке игр, по моему мнению, создалось из-за того, что игровые компании погрязли в бизнесе. Разрабатывая новую игру, они в первую очередь оценивают трудозатраты на производство, раскрутку, риски; рассчитывают окупаемость и прочие бизнес-вещи. И только когда всё посчитано и инвесторы с издателями решили, что проект окупится, стартует разработка. Всё это приводит к тому, что разработчику проще выпустить следующий CoD с уверенностью, что они заработают следующий миллиард, чем делать что-нибудь интересное. Конечно, не все попадают под такой пример… но минимизировать риски стараются почти все.

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

Гейм-дизайн

Мы поставили перед собой, на мой взгляд, одну из самых сложных целей в геймдеве: создать полноценную онлайн-RPG с полностью изменяемым миром.

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

К счастью, так как мы были сервером Minecraft, у нас есть опыт решения проблем с изменяемым миром, таких как: места для новичков, загаживание мира, застревание игроков и прочие — не имей мы этого опыта, делать что-то подобное было бы просто безумием!

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

Если кому-то интересно, что же мы напридумывали, то большинство базовых идей собрано здесь. Просто объединить хорошие идеи для создания хорошей RPG, как выяснилось, мало. Продумывая всё подробнее, мы наткнулись на то, что всё ужасно сложно. Баланс, различные мелочи… В настоящее время детали геймплея всё ещё прорабатываются и будут прорабатываться ещё долго. Некоторые вещи мы начнём вводить до того, как всё будет продумано, но до этого ещё есть время :)

Программирование

Программист у нас в команде один — это я. И хотя на самом деле этого довольно мало, работать в команде я не умею и не очень хочу. В целом, это конечно же мои личные проблемы, но стоит упомянуть, что тянуть такой проект одной (в плане программирования) очень сложно.

У нас уже есть написанный сервер, а значит часть дела сделана: нужно только написать клиент. Казалось бы, что может быть проще, имея такой опыт работы. До этого я очень много «общалась» с кодом клиента Minecraft и была уверена, что написать новый не составит особого труда, тем более на нормальном движке. Я никогда так сильно не ошибалась, как говорится…

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

Клиент было решено писать на Java. У меня есть много причин, почему Java, а не C++, например, тут можно целую статью написать об этом, так что дискуссию на сей счёт открывать не стоит (Java-haters gonna hate). Но основные причины в том, что я отлично знаю Java, умею писать на ней многопоточный код, и у нас всё написано на Java. Использование других языков потребовало бы намного больше часов на обучение, отладку и написание кода. На Java можно делать производительные клиентские приложения, и я это докажу :)

Конечно, у нас была возможность взять какой-нибудь Unreal Engine или Unity и писать клиент на их скриптовых языках… Но это породило бы новые проблемы: во-первых, пришлось бы разбираться с лицензиями и прочей бюрократией, проект у нас всё-таки коммерческий, а значит нужно кому-то куда-то платить, часто не понятно сколько и каким образом (у Unity, конечно, преимущество в этом вопросе перед UE). Во-вторых, изменяемый мир требует возможности на очень низком уровне собирать меши (модели) ландшафта, значит нужен доступ желательно в «самый низ», к коду движка, а не его скриптам, пусть даже компилируемым. Опять же, остаётся проблема с изучением всех тонкостей движка.

Я остановилась на open-source движке jMonkeyEngine версии 3.0. Это полностью открытый движок, написанный на Java. В качестве рендера использует OpenGL. Других движков на Java, скорее всего, даже нет, но это не проблема: в jME есть всё, что нужно. Если честно, это лучшая библиотека, с которой я работала, не считая trove.

Текущая ситуация

Не смотря на то, что наш проект сейчас значительно менее популярен, чем в лучшие времена, мы держимся весьма уверенно. Для четверых человек GreenCubes в настоящее время является основной работой: кроме меня и Feyol'ы, у нас есть штатный художник и кто-то типа комьюнити-мэнеджера, которая занимается довольно большим спектром работы с сообществом и разными небольшими задачами. Вообще, работа с сообществом — это ужасно важно: в настоящее время нам на безвозмездной основе помогают несколько модераторов и хелперов, решающих ингейм-проблемы игроков и следящие за порядком, а наш форум является довольно большим и активным сообществом, где обсуждают не только наш проект. Вообще, есть определённая группа игроков, для которых мы стали почти второй жизнью, кто с нами уже почти три года. Это довольно приятно :)

Вместо заключения

Конечно, мне есть о чём ещё рассказать, но статья получилась и без того слишком длинная. Гораздо лучше будет, если вы просто зададите свои вопросы: на некоторые я отвечу сразу, некоторые выделю ещё для одной статьи, которая может быть появится, когда накопится то, что можно было бы показать/рассказать. Так что спрашивайте ваши ответы; если хотите, чтобы о чём-то конкретном я рассказала подробнее — тоже пишите.

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

Огромное спасибо моему другу и коллеге Xitaly за редактирование текста.

To be continued...

Автор: Rena4ka

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js