Semua artikel

Membangun MMORPG dengan Unreal Engine 5.8 — Devlog #1: Server Otoritatif dan Arsitektur Dunia

Arsitektur Ancient Online: klien Unreal Engine 5.8, server otoritatif berbasis C++, loop dunia 25 Hz, dan satu dunia utuh yang disunting langsung.

Meja kerja dengan monitor dan laptop yang berjajar di sebuah studio berpenerangan redup

Yang membedakan MMORPG dari game pemain tunggal adalah server di balik semua yang kamu lihat. Dalam bagian pertama devlog Ancient Online: Remastered ini, kami menjelaskan bagaimana kami membangun MMORPG dengan Unreal Engine 5.8: bagaimana pekerjaan dibagi antara klien dan server, bagaimana dunia disimulasikan, dan bagaimana kami bisa menyunting satu dunia yang utuh secara langsung.

Dua Bagian: Klien dan Server

Ancient Online terdiri dari dua perangkat lunak yang terpisah:

  • Klien ditulis dalam C++ di atas Unreal Engine 5.8. Rendering, audio, antarmuka, dan input adalah tugasnya.
  • Server tidak bergantung pada Unreal: kami menulisnya dari nol dalam C++23. Semua aturan game berjalan di sini.

Mengapa server kami tulis terpisah, bukan di dalam engine? Karena kebutuhan server MMORPG berbeda dari kebutuhan game engine: tidak ada grafis, tetapi ada ribuan entitas, data persisten, waktu aktif yang panjang, dan kebutuhan akan performa yang dapat diprediksi. Server yang terpisah memungkinkan kami mengerjakan hanya apa yang diperlukan dan mengendalikan setiap byte.

Server Otoritatif: Tidak Memercayai Klien

Aturan dasar kami adalah ini: klien mengajukan klaim, server mengambil keputusan.

  • Pergerakan: Input pemain dikirim ke server, dan server menghitung posisinya. Klien menampilkan posisi yang dilaporkan server dengan interpolasi yang halus. Jadi, klien yang “menteleportasi dirinya sendiri” atau berjalan menembus tembok tidak sampai ke mana-mana di mata server.
  • Pertarungan: Hasil seperti damage, pukulan yang kena, dan knockback dihitung di server. Misalnya, server yang memutuskan apakah sebuah pukulan combo menjatuhkan lawan, lalu menyiarkan hasilnya kepada semua orang pada saat yang sama.
  • Ekonomi: Item, mata uang, dan transaksi toko hanya berubah di server dan di basis data.

Harga dari pendekatan ini adalah keharusan mengelola latensi jaringan dengan baik; imbalannya adalah dunia tempat berbuat curang jauh lebih sulit dan aturan yang sama berlaku bagi semua orang.

Loop Dunia 25 Hz

Server memperbarui dunia 25 kali per detik. Pada setiap langkah, AI monster, pergerakan, pertarungan, efek skill, dan cuaca semuanya maju. Langkah yang tetap menjaga simulasi tetap dapat diprediksi dan memastikan input yang sama selalu menghasilkan keluaran yang sama.

Tidak setiap pemain perlu tahu segalanya. Server membagi dunia menjadi grid dan mengirimi tiap pemain pembaruan hanya untuk entitas yang berada dalam area minat pemain itu (yang ada di dekatnya). Dengan begitu lalu lintas jaringan tetap wajar bahkan di kota yang ramai.

Protokol Biner yang Ringan

Tidak ada JSON atau REST di antara klien dan server; setiap pesan adalah paket biner dengan tata letak tetap. Ini menghemat bandwidth sekaligus waktu CPU. Saat menambahkan sistem baru (seperti cuaca, pergerakan, atau layanan akun dalam game), kami menulis kontrak paket tersendiri yang berversi untuknya, dan kami memakai berkas header bersama untuk menjamin klien dan server bekerja dari kontrak yang sama.

Persistensi: Menyimpan Tanpa Membuat Game Menunggu

Data pemain berada di basis data PostgreSQL. Namun, membiarkan loop dunia menunggu basis data pada setiap langkah tidak bisa diterima. Karena itu penyimpanan dilakukan di latar belakang, sebagai persistensi write-behind: server dunia menaruh perubahan ke dalam antrean (Redis), dan penulis latar belakang memasukkannya ke basis data secara berkelompok. Jalannya game tidak bergantung pada kecepatan basis data.

Channel dan Server Login

Pemain mula-mula terhubung ke server login, yang menangani verifikasi akun, pemilihan karakter, dan sesi. Setelah itu mereka pindah ke salah satu dari empat channel game (CH1–CH4). Status terkini channel ditampilkan di halaman Status Server di situs game.

Satu Dunia Utuh, Disunting Langsung

Dunia Ancient Online dirancang sebagai satu dunia yang utuh, bukan peta-peta terpisah yang dibatasi layar pemuatan; dunia ini dibagi menjadi sel dan dimuat secara streaming.

Konten dunia (medan, objek, penempatan monster) disimpan bukan di kode melainkan di basis data, berversi. Kami bisa menyunting dunia ini dengan editor dunia di dalam game: perubahan mula-mula dibuat dalam draf, diperiksa, lalu dipublikasikan. Setiap publikasi membuat versi baru, dan klien memverifikasi bahwa data dunia yang dipegangnya cocok dengan milik server dengan membandingkan sebuah digest. Jika tidak cocok, klien menunggu data diperbarui sebelum melanjutkan ke dalam game.

Quest: Lua sebagai Bahasa Skrip

Quest dan dialog NPC ditulis dalam Lua 5.4 di server. Dengan begitu kami bisa mengembangkan dan menguji quest tanpa mengompilasi ulang server.

Pesan Pemain Tidak Pernah Meninggalkan Server Kami

Kami tidak memakai layanan penerjemahan eksternal untuk terjemahan chat dalam game. Kami menjalankan model penerjemahan lokal yang hanya memakai CPU di server kami sendiri; pesan pemain tidak dikirim ke API eksternal mana pun. Dengan cara itu, pemain yang berbeda bahasa bisa saling memahami tanpa pesan mereka pernah keluar dari studio.

Apa Selanjutnya

Bagian kedua devlog membahas keputusan yang kami ambil saat membuat dunia yang sama bisa dimainkan dengan mouse, layar sentuh, dan controller. Untuk mengenal studio ini, baca Siapa Astronaut Entertainment?; untuk game-nya sendiri, lihat halaman Game.

Bagikan:
Juga tersedia dalam29