Ringkasan
Matchmaking P2P Steam dibangun berdasarkan konsep lobi. Lobi merupakan sebuah entitas yang ada di server backend Steam yang mirip seperti ruang obrolan. Pengguna dapat membuat lobi baru; mengaitkan data dengan lobi; mencari lobi berdasarkan data tersebut; bergabung ke lobi; dan berbagi informasi dengan pengguna lain di lobi. Satu lobi dapat menampung hingga 250 pengguna di dalamnya, meskipun biasanya sebagian besar game hanya berisi 2-16 pemain. Matchmaking berdasarkan skill dibangun di atas fondasi ini.
API matchmaking P2P Steam adalah serangkaian fungsi yang memungkinkan pengguna untuk menemukan pengguna lain untuk bermain bersama. Fungsi matchmaking terdapat dalam
ISteamMatchmaking, yang berisi rincian selengkapnya tentang parameter untuk setiap fungsi. Semua lobi diidentifikasi dengan ID Steam unik, mirip dengan akun atau server game. Contoh Steamworks mengilustrasikan implementasi lobi yang berfungsi penuh.
Alur proses matchmaking
Biasanya, proses mengumpulkan pemain ke dalam sebuah grup adalah sebagai berikut:
- Pengguna memilih mode multipemain di dalam game dan cara bermain yang mereka inginkan (aturan, skenario, dll.)
- Game mencari lobi yang memiliki serangkaian aturan yang sama dengan menggunakan API pencarian lobi.
- Jika lobi ditemukan, maka pemain akan masuk ke lobi tersebut; jika tidak, maka game akan membuat lobi baru.
- Pengguna tetap berada di lobi sampai ada cukup pemain yang siap untuk meluncurkan game-nya. Data dikomunikasikan antar-anggota ruangan untuk menentukan siapa yang dapat mengambil karakter tertentu atau menentukan pengaturan individu lainnya. Jika ada beberapa aturan yang perlu diberlakukan di lobi (cth. hanya satu pemain yang bisa bermain sebagai karakter tertentu), maka pemilik lobi-lah satu-satunya yang dapat melakukannya.
- Antarmuka pengguna bisa jadi terkait atau tidak terkait dengan lobi; jika iya, fitur komunikasi data lobi dapat digunakan untuk mengirim pesan obrolan antar-anggota lobi. Data suara juga dapat dikirim, tapi harus menggunakan API Jaringan Steam.
- Setelah game siap diluncurkan, semua pengguna akan bergabung ke server game atau terhubung ke pengguna yang dipilih untuk menghosting game, kemudian meninggalkan lobi. Setelah semua pengguna meninggalkan lobi, maka lobinya akan secara otomatis dihilangkan.
Mencari lobi
Agar game-mu dapat mencari lobi, kamu harus memanggil API
ISteamMatchmaking::RequestLobbyListFungsi ini bersifat asinkron, dan mengembalikan handle SteamAPICall_t yang dapat kamu gunakan untuk melacak status permintaan. Tergantung dari koneksi pengguna ke backend Steam, panggilan ini dapat memerlukan waktu antara 300 milidetik hingga 5 detik untuk diselesaikan, tapi tidak lebih dari 20 detik.
Jumlah hasil yang dikembalikan dapat ditemukan di hasil panggilan
LobbyMatchList_t, yang kemudian dapat kamu gunakan di
ISteamMatchmaking::GetLobbyByIndex untuk mengulangi masing-masing hasil dan mendapatkan ID-nya.
Hasil dapat mencapai hingga 50, tapi biasanya hanya dua atau tiga yang dikembalikan. Hasil yang dikembalikan diurutkan berdasarkan jarak geografis dan didasarkan pada filter kedekatan yang ditentukan. Secara defaul, kami tidak akan mengembalikan lobi yang sudah penuh, dan filter jarak ditentukan ke
k_ELobbyDistanceFilterDefault (terdekat). Untuk menambahkan filter, sebelum kamu memanggil
RequestLobbyList
, kamu perlu memanggil satu atau beberapa fungsi pemfilteran ini:
Membuat lobi
Jika kamu tidak dapat menemukan lobi yang bisa dimasuki, maka kamu bisa membuat lobi. Cukup panggil
ISteamMatchmaking::CreateLobby dan tunggu sampai selesai. Hasil panggilan akan menunjukkan keberhasilannya. Jika berhasil, ID Steam lobinya akan dikembalikan dalam struktur
LobbyCreated_t, yang bisa digunakan untuk menentukan metadata lobi. Hal pertama yang dapat kamu lakukan setelah kamu membuat lobi adalah menerapkan data ke lobi, yang bisa digunakan oleh client game lain untuk mencarinya (lihat di bawah).
Bergabung ke lobi
Jika kamu menemukan lobi yang bagus, baik dari pencarian atau dari teman, kamu dapat menggunakan
ISteamMatchmaking::JoinLobby dan tunggu hasil panggilan dari
LobbyEnter_t. Setelah kamu masuk ke lobi, kamu dapat menggunakan API data lobi untuk mendapatkan rincian tentang lobinya dan menentukan apa yang harus ditampilkan (jika ada data yang ingin ditampilkan).
Ketika pengguna bergabung atau meninggalkan lobi, callback
LobbyChatUpdate_t akan diposting ke semua anggota lobi, termasuk pemiliknya.
Untuk mengulangi guna melihat pemain mana yang saat ini berada di lobi, gunakan:
Untuk info lebih lanjut tentang pengguna lain di lobi, kamu harus menggunakan API teman. Lihat
Teman, undangan, dan lobi untuk selengkapnya.
Metadata Lobi
Metadata lobi memungkinkanmu untuk mengatur status lobi sesukamu, termasuk nama lobi, map, mode game, status game terkini, atau apa pun yang bisa kamu pikirkan.
Pengguna akan secara otomatis memiliki data lobi terbaru dari lobi mana pun tempat mereka menjadi anggotanya. Untuk lobi yang dikembalikan melalui hasil pencarian, pengguna akan memiliki data lobi yang ada pada saat mereka melakukan pencarian. Jika lobinya adalah milik teman, maka tidak akan ada data lobi yang tersedia untuk dilihat sampai
ISteamMatchmaking::RequestLobbyData dipanggil dan berhasil diselesaikan.
Jika data lobi diubah di lobi, maka semua anggota lobi akan menerima callback
LobbyDataUpdate_t (callback yang sama yang memberitahumu bahwa panggilan
ISteamMatchmaking:: call RequestLobbyData telah selesai).
Berikut adalah serangkaian fungsi yang dapat kamu gunakan untuk mendapatkan dan menerapkan data lobi. Hanya pemilik lobi yang dapat menetapkan atau menghapus data lobi.
Berikut adalah fungsi yang memungkinkanmu mengulangi metadata (biasanya hanya digunakan untuk tujuan melakukan debug):
Lobi juga memungkinkan anggota untuk menentukan metadata mereka sendiri, sehingga anggota lain dapat menerima pembaruan dengan fungsi berikut:
Komunikasi dalam lobi
Untuk berbagi informasi di dalam lobi (pesan obrolan, sinyal mulai permainan, dll.) kamu perlu memanggil
ISteamMatchmaking::SendLobbyChatMsg, yang mengirimkan pesan biner sederhana ke semua pengguna dalam lobi. Anggota lobi perlu mendengarkan callback
ISteamMatchmaking::LobbyChatMsg_t. Setelah menerima callback, barulah kamu dapat menggunakan
ISteamMatchmaking::GetLobbyChatEntry untuk mengambil isi pesan.
Teman, undangan, dan lobi
Kamu dapat mengetahui semua lobi tempat teman pengguna berada dengan API teman:
int cFriends = SteamFriends()->GetFriendCount( k_EFriendFlagImmediate );
for ( int i = 0; i < cFriends; i++ )
{
FriendGameInfo_t friendGameInfo;
CSteamID steamIDFriend = SteamFriends()->GetFriendByIndex( i, k_EFriendFlagImmediate );
if ( SteamFriends()->GetFriendGamePlayed( steamIDFriend, &friendGameInfo ) && friendGameInfo.m_steamIDLobby.IsValid() )
{
// friendGameInfo.m_steamIDLobby adalah lobi valid yang dapat kamu masuki atau gunakan RequestLobbyData() untuk mendapatkan metadatanya
}
}
Kamu dapat mengundang teman ke lobi dengan
ISteamMatchmaking::InviteUserToLobbyPengguna tersebut akan menerima dialog obrolan dengan tautan untuk bergabung ke game. Ketika pengguna mengeklik tautannya, dan mereka sedang tidak bermain game-nya, game akan diluncurkan dengan baris perintah:
+connect_lobby <64-bit lobby id>
. Pastikan aplikasimu mengimplementasikan
ISteamApps::GetLaunchCommandLine sehingga kamu bisa menonaktifkan peringatan popup ketika diluncurkan dengan baris perintah.
Jika pengguna sudah ada dalam game, callback
ISteamFriends::GameLobbyJoinRequested_t akan diposting, yang berisi ID Steam dari lobi yang ingin dimasuki pengguna. Terserah pada game-mu untuk mematuhinya atau tidak.
Jika kamu ingin pengguna memilih dari daftar teman untung diundang ke lobi, kamu dapat memanggil
ISteamFriends::ActivateGameOverlayInviteDialog.
Ini akan mengaktifkan overlay Steam dalam game ke dialog yang dirancang untuk mengundang teman ke lobi saat ini.
Autentikasi
Setiap pengguna di lobi Steam telah sepenuhnya diautentikasi dengan backend Steam. Game tidak perlu lagi melakukan langkah autentikasi dengan pengguna lobi, kecuali jika ingin mengetahui apakah mereka terkena ban VAC (lihat Teknologi Anti-Cheat Valve). Jika ada pengguna yang mencoba login dari lokasi lain dengan akun yang sama, login sebelumnya akan secara otomatis dihapus dari lobi yang ada.
Membersihkan
Setelah game dimulai, setiap pengguna dapat meninggalkan lobi dengan:
ISteamMatchmaking::LeaveLobbySetelah semua pengguna keluar, lobi akan secara otomatis dihancurkan di backend.
Tip Terkait Lobi
- Sebisa mungkin, buatlah lobi hanya jika diperlukan. Sebagai contoh, ketika pengguna mengundang teman untuk bermain, atau memicu tindakan manual yang membutuhkan lobi
- Jangan perbarui metadata lobi pada frekuensi tinggi. Hanya tambahkan metadata dan nilai yang digunakan untuk pencarian (contohnya, jenis atau status game). Kamu tidak perlu memasukkan jumlah pemain, karena pencarian lobi sudah akan mencari lobi dengan slot yang tersedia
- Jangan bergabung dengan lobi hanya untuk mencari tahu metadatanya. Metadata lobi dapat diunduh secara terpisah untuk semua lobi, yang kemudian dapat digunakan game-mu untuk menampilkan daftar lobi yang dapat dipilih pengguna, atau game dapat secara otomatis memutuskan hasil pencarian mana yang akan digabungkan
Ada pertanyaan lain?
Ajukan pertanyaan di
forum diskusi Matchmaking Steam & Lobi.