MMORPG od hry pro jednoho hráče odlišuje server, který stojí za vším, co vidíte. V tomto prvním dílu devlogu Ancient Online: Remastered vysvětlujeme, jak stavíme MMORPG v Unreal Engine 5.8: jak je práce rozdělena mezi klienta a server, jak se simuluje svět a jak dokážeme jeden propojený svět upravovat naživo.
Dvě části: klient a server
Ancient Online tvoří dva samostatné programy:
- Klient je napsaný v C++ na Unreal Engine 5.8. Jeho prací je vykreslování, zvuk, rozhraní a vstup.
- Server je na Unrealu nezávislý: napsali jsme ho od nuly v C++23. Tady běží všechna pravidla hry.
Proč jsme server napsali zvlášť, a ne uvnitř enginu? Protože server MMORPG potřebuje něco jiného než herní engine: není tu grafika, zato jsou tu tisíce entit, trvalá data, dlouhý nepřetržitý provoz a potřeba předvídatelného výkonu. Samostatný server nám dovoluje dělat jen tu práci, která je nutná, a mít pod kontrolou každý bajt.
Autoritativní server: klientovi nevěřit
Naše základní pravidlo zní: klient tvrdí, server rozhoduje.
- Pohyb: Vstup hráče jde na server a server vypočítá polohu. Klient zobrazuje polohu, kterou server nahlásí, s plynulou interpolací. Klient, který se „sám teleportuje“ nebo projde zdí, se tak z pohledu serveru nikam nedostane.
- Boj: Výsledky jako poškození, zásahy a odhození se počítají na serveru. Server například rozhoduje, zda úder v kombu srazí soupeře k zemi, a výsledek rozešle všem ve stejný okamžik.
- Ekonomika: Předměty, měna a transakce v obchodě se mění jen na serveru a v databázi.
Cenou za tento přístup je nutnost dobře zvládat síťovou latenci; odměnou je svět, kde je podvádění mnohem těžší a pro všechny platí stejná pravidla.
Smyčka světa 25 Hz
Server aktualizuje svět 25krát za sekundu. V každém kroku se posune AI příšer, pohyb, boj, efekty dovedností i počasí. Pevný krok drží simulaci předvídatelnou a zajišťuje, že stejný vstup vždy dá stejný výsledek.
Ne každý hráč potřebuje vědět o všem. Server dělí svět na mřížku a každému hráči posílá aktualizace jen o entitách v jeho oblasti zájmu (těch poblíž). Síťový provoz tak zůstává rozumný i v přeplněném městě.
Odlehčený binární protokol
Mezi klientem a serverem není žádný JSON ani REST; každá zpráva je binární paket s pevným rozložením. Šetří to šířku pásma i čas procesoru. Když přidáváme nový systém (například počasí, pohyb nebo herní službu účtů), napíšeme pro něj samostatný, verzovaný kontrakt paketů a sdílenými hlavičkovými soubory zaručujeme, že klient i server pracují se stejným kontraktem.
Perzistence: ukládání, aniž by hra čekala
Data hráčů žijí v databázi PostgreSQL. Není ale přijatelné, aby smyčka světa v každém kroku čekala na databázi. Ukládání proto probíhá na pozadí, jako perzistence typu write-behind: server světa odkládá změny do fronty (Redis) a zapisovač na pozadí je po dávkách zapisuje do databáze. Plynulost hry nezávisí na rychlosti databáze.
Kanály a přihlašovací server
Hráči se nejdřív připojují k přihlašovacímu serveru, který řeší ověření účtu, výběr postavy a relaci. Potom přecházejí na jeden ze čtyř herních kanálů (CH1–CH4). Aktuální stav kanálů ukazuje stránka Stav serverů na webu hry.
Jeden propojený svět upravovaný naživo
Svět Ancient Online je navržen jako jeden propojený svět, ne jako samostatné mapy oddělené načítacími obrazovkami; je rozdělený na buňky a načítá se streamováním.
Obsah světa (terén, objekty, rozmístění příšer) není uložen v kódu, ale v databázi, a to verzovaně. Tento svět můžeme upravovat editorem světa přímo ve hře: změny se nejdřív dělají v konceptu, zkontrolují se a pak se publikují. Každé publikování vytvoří novou verzi a klient porovnáním otisku ověřuje, že data světa, která má, odpovídají datům serveru. Při neshodě počká na aktualizaci dat a teprve pak pokračuje do hry.
Úkoly: Lua jako skriptovací jazyk
Úkoly a dialogy NPC se píšou na serveru v jazyce Lua 5.4. Díky tomu můžeme úkoly vyvíjet a testovat bez nové kompilace serveru.
Zprávy hráčů nikdy neopouštějí naše servery
Pro překlad chatu ve hře nepoužíváme externí překladovou službu. Na vlastních serverech provozujeme lokální překladový model, který běží jen na procesoru; zprávy hráčů se neposílají žádnému externímu API. Hráči mluvící různými jazyky si tak mohou rozumět, aniž by jejich zprávy kdy opustily studio.
Co bude dál
Druhý díl devlogu popisuje rozhodnutí, která jsme udělali, aby se stejný svět dal hrát myší, na dotykovém displeji i ovladačem. Chcete-li poznat studio, přečtěte si Kdo je Astronaut Entertainment?; samotnou hru najdete na stránce Hry.


