Добавил мультиплеер в свою игру

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

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

С чего начал

Мир игры состоит из чанков, которые представляют собой массив блоков 25*25*83, и первым шагом необходимо было синхронизировать их. Вариант с отправкой сида клиентам и уже генерация мира на их стороне не мог сработать, так как игроки могут как угодно изменять мир, вплоть до того, что убрать из него все блоки. Единственным вариантом была отправка клиентам чанков. находящиеся в радиусе их видимости.

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

Решением явилась отправка чанка единожды при попадании его в радиус видимости, а затем отправка изменённых блоков, а также состояний блоков (если они у них есть) например, нажимная плита - нажата / не нажата.

С сущностями все просто. Достаточно было присвоить им уникальный id и оправлять клиенту сообщения вида - создай сущность с Id <ID>, удали сущность с id <ID>, измени положение сущности c id <ID>, отобрази получение урона сущностью с id <ID>.

Неожиданные сложности

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

Адаптация кода не заняла много времени, так как строк, специфических для Windows было мало, и то они были связанны со сбором данных о потребляемых игрой ресурсах(сколько памяти используется и д. р). Первые сложности были вызваны не понимаем, как получать и линковать библиотеки, но тут я их упущу. Неожиданностью стало, что в компиляторе g++ присутствуют баги и что его версия привязана к версии Ubuntu. Обновление последней до 24.04 и правка кода решили проблему.

Что в итоге

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

Планы на будущее

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

4.5K4.5K показов
156156 открытий
6 комментариев

Красавчик, пилить игру с мультиплеером это сразу +3 к сложности разработки.
Ты какое-то решение из коробки выбрал типа Fusion или NGO, или свой сетевой код пишешь?
А, удачи с разработкой, разумеется.

Ответить

Свой сетевой код и движок

Ответить

Не скажу что писать сетевой движок уж так сложно.

Если есть куда подглядывать, и понимаешь необходимые для тебя спецификации, то адекватно делается. Я делал для себя лично прототип на шарпах, поглядывая глазом в исходники от mirror, litenetlib и решение михаэля лидгрена. Самое проблемное, это всякие приколы с тем, как бороться с nat, upnp и прочие костыли для ipv4.

А так, подключиться по сокету с dtgrm типом передачи в пределах /24 и отправить сообщение - так это делается в три строчки.

Ответить

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

Ответить

Сильно напомнило мой проект мультиплеерный 10 летней давности когда умел только в гейм мейкер

Ответить