Това, което отличава една MMORPG от игра за един играч, е сървърът зад всичко, което виждате. В тази първа част от дневника на разработката на Ancient Online: Remastered обясняваме как изграждаме MMORPG с Unreal Engine 5.8: как е разпределена работата между клиента и сървъра, как се симулира светът и как успяваме да редактираме един-единствен, цялостен свят на живо.
Две части: клиент и сървър
Ancient Online се състои от два отделни софтуера:
- Клиентът е написан на C++ върху Unreal Engine 5.8. Негова работа са рендирането, звукът, интерфейсът и въвеждането.
- Сървърът не зависи от Unreal: написахме го от нулата на C++23. Всички правила на играта работят тук.
Защо написахме сървъра отделно, а не вътре в двигателя? Защото това, от което се нуждае един MMORPG сървър, е различно от това, от което се нуждае един игрови двигател: няма графика, но има хиляди обекти, постоянни данни, дълго време на непрекъсната работа и нужда от предвидима производителност. Отделният сървър ни позволява да вършим само необходимата работа и да контролираме всеки байт.
Авторитетният сървър: без доверие към клиента
Основното ни правило е това: клиентът твърди, сървърът решава.
- Движение: Въведеното от играча отива към сървъра и сървърът изчислява позицията. Клиентът показва позицията, която сървърът съобщава, с плавна интерполация. Така клиент, който „се телепортира сам“ или минава през стена, за сървъра не стига никъде.
- Бой: Резултати като щети, попадения и отблъскване се изчисляват на сървъра. Например сървърът решава дали удар от комбо поваля противника и разпраща резултата до всички едновременно.
- Икономика: Предметите, валутата и транзакциите в магазина се променят само на сървъра и в базата данни.
Цената на този подход е, че мрежовото забавяне трябва да се управлява добре; печалбата е свят, в който мамите са много по-трудни и за всички важат едни и същи правила.
Световен цикъл на 25 Hz
Сървърът обновява света 25 пъти в секунда. На всяка стъпка напредват изкуственият интелект на чудовищата, движението, боят, ефектите на уменията и времето. Фиксираната стъпка държи симулацията предвидима и гарантира, че едно и също въвеждане винаги дава един и същ резултат.
Не всеки играч трябва да знае за всичко. Сървърът разделя света на мрежа и изпраща на всеки играч обновления само за обектите в неговата зона на интерес (тези наблизо). Така мрежовият трафик остава разумен дори в оживен град.
Лек двоичен протокол
Между клиента и сървъра няма JSON или REST; всяко съобщение е двоичен пакет с фиксирана структура. Това пести и трафик, и процесорно време. Когато добавяме нова система (като времето, движението или услугата за акаунти в играта), пишем за нея отделен, версиониран договор за пакетите и използваме общи заглавни файлове, за да гарантираме, че клиентът и сървърът работят по един и същ договор.
Постоянство: запис, без играта да чака
Данните на играчите са в база данни PostgreSQL. Но не е допустимо световният цикъл да чака базата данни на всяка стъпка. Затова записът става във фонов режим, като отложен запис (write-behind): световният сървър пуска промените в опашка (Redis), а фонов записвач ги записва в базата данни на партиди. Ходът на играта не зависи от скоростта на базата данни.
Канали и сървър за вход
Играчите първо се свързват със сървъра за вход, който се грижи за проверката на акаунта, избора на герой и сесията. След това преминават към един от четирите игрови канала (CH1–CH4). Актуалното състояние на каналите се показва на страницата „Статус на сървърите“ в сайта на играта.
Един цялостен свят, редактиран на живо
Светът на Ancient Online е проектиран като един-единствен, цялостен свят, а не като отделни карти, разделени от екрани за зареждане; той е разделен на клетки и се зарежда поточно.
Съдържанието на света (терен, обекти, разположение на чудовищата) се пази не в кода, а в базата данни, с версии. Можем да редактираме този свят с редактор на света в самата игра: промените първо се правят в чернова, проверяват се и после се публикуват. Всяко публикуване създава нова версия, а клиентът проверява дали данните за света, които държи, съвпадат с тези на сървъра, като сравнява контролна сума. Ако има несъответствие, той изчаква данните да се обновят, преди да продължи към играта.
Мисии: Lua като скриптов език
Мисиите и диалозите с NPC се пишат на Lua 5.4 на сървъра. Това ни позволява да разработваме и тестваме мисии, без да компилираме сървъра отново.
Съобщенията на играчите никога не напускат сървърите ни
За превода на чата в играта не използваме външна услуга за превод. На собствените си сървъри пускаме локален модел за превод, който работи само на процесор; съобщенията на играчите не се изпращат към никакъв външен API. Така играчите, които говорят различни езици, се разбират, без съобщенията им изобщо да напускат студиото.
Какво следва
Втората част от дневника на разработката разглежда решенията, които взехме, докато правехме един и същ свят играем с мишка, сензорен екран и контролер. За да опознаете студиото, прочетете „Кои са Astronaut Entertainment?“; а за самата игра вижте страницата „Игри“.


