Membuka dimensi sosial game: memahami arsitektur client-server, memilih netcode, dan menyinkronkan state antar pemain dengan aturan otoritas yang jelas, lalu praktik membangun prototipe multiplayer Rimba Runner

Game yang dimainkan sendiri menyenangkan, tapi game yang dimainkan bersama punya daya tarik yang berbeda. Multiplayer adalah salah satu topik paling sulit dalam game development — bukan karena menulis kodenya, tapi karena masalah konseptualnya: bagaimana dua komputer yang tidak pernah benar-benar sinkron bisa berbagi satu dunia yang tampak sama?
Episode ini membangun fondasi multiplayer Rimba Runner versi co-op: arsitektur client-server, pilihan netcode, dan sinkronisasi state. Kalian akan paham kenapa "siapa yang berkuasa atas dunia game" adalah pertanyaan terpenting dalam netcode — dan jawabannya menentukan keamanan, keadilan, dan performa.
Semua game online berjalan di atas satu dari dua arsitektur dasar:
Mengapa client-server menjadi standar modern? Karena server sebagai pemegang otoritas tunggal memudahkan (1) sinkronisasi — satu sumber kebenaran, (2) anti-cheat — pemain tidak bisa memaksa state sendiri (kita dalami di episode 18), dan (3) penanganan pemain yang datang dan pergi.
Netcode adalah lapisan yang mengirim state antar mesin. Pilihan arsitekturnya tergantung jenis game:
| Pendekatan | Cocok Untuk | Cara Kerja |
|---|---|---|
| Simulasi deterministik (lockstep) | RTS, game berbasis turn | Tiap client jalankan simulasi sama, hanya input yang dikirim |
| Client-authoritative | Game cepat, kompetitif | Client mengeksekusi & server memvalidasi |
| Server-authoritative | FPS, game kompetitif serius | Server menjalankan semua logika; client hanya input + render |
Aturan praktis: semakin penting keadilan & keamanan, semakin banyak logika di server. Game kasual co-op bisa memakai client-authoritative dengan host pemain; game kompetitif berperingkat wajib server-authoritative (akan kita bedah di episode 18 dan 21).
Setiap frame, tiap client berada di posisi yang sedikit berbeda dengan server karena latency (delay jaringan). Tugas netcode adalah menutup kesenjangan ini. Tiga teknik inti:
Implementasi sinkronisasi paling sederhana di Godot memakai RPC (Remote Procedure Call) dan MultiplayerSynchronizer. Contoh: pemain memberitahu posisinya ke yang lain.
@rpc("any_peer", "call_local")
func sync_position(pos: Vector2) -> void:
global_position = pos
func _physics_process(delta: float) -> void:
if is_multiplayer_authority():
# Hanya pemilik objek yang mengupdate posisinya
move_and_slide()
sync_position.rpc(global_position)Prinsip penting yang muncul di sini: is_multiplayer_authority() — hanya satu mesin yang berhak mengubah posisi objek (pemiliknya). Client lain hanya menerima dan menampilkan. Ini bentuk pertama dari authority yang akan berkembang menjadi tema besar anti-cheat di episode 18.
Tidak semua pesan harus sampai dengan urutan yang pasti. Netcode membedakan dua jenis transport:
Mengapa posisi pakai unreliable? Karena mengirim posisi tiap 50 ms dengan penjaminan pengiriman ulang justru membuat gerakan lebih lambat (retry menambah latency). Posisi yang hilang satu paket langsung "terganti" paket berikutnya. Inilah kenapa game online tidak membangun seluruh komunikasinya di atas satu tipe transport.
Tip
Sebelum membangun netcode sendiri, periksa dulu solusi engine: Godot punya Multiplayer API + ENet bawaan, Unity punya Netcode for GameObjects dan solusi pihak ketiga (Photon, Mirror, Netcode), Unreal punya Replication tingkat lanjut. Untuk game indie, memakai solusi ini hemat bertahun-tahun kerja.
Bangun prototipe sederhana: dua pemain bisa bergerak di level yang sama, melihat satu sama lain. Langkah:
[x] Host & join dengan peer id
[x] Setiap pemain spawn karakter sendiri
[x] Hanya pemilik karakter yang menggerakkan (authority)
[x] Posisi tersinkron via RPC ke pemain lain
[x] Dua instance jalan tanpa desync yang menggangguWarning
Multiplayer tidak bisa di-debug dengan baik hanya dari satu mesin. Jalankan minimal dua instance (atau editor + build standalone) untuk melihat masalah latency dan desync. Bug "jalan sendiri tapi tidak terlihat lawan" hanya muncul saat ada dua pemain nyata.
Multiplayer mengubah game dari pengalaman pribadi menjadi ruang sosial.
Inti yang harus dibawa pulang:
Di episode 14 selanjutnya kita akan melengkapi sisi online: online services & backend — leaderboard, account, dan game services, lengkap dengan praktik membangun fitur online Rimba Runner. Sampai jumpa di episode 14!