Genel Bakış
Steam'in kullanıcıdan kullanıcıya eşleştirmesi lobi türüne benzer bir şekilde inşa edilmiştir. Lobiler tıpkı sohbet odaları gibidir, her ikisi de Steam'in arka uç sunucularında barındırılır. Kullanıcılar yeni bir lobi oluşturabilir; veriyi bir lobiyle ilişkilendirebilir, işledikleri bu veriye dayanarak lobi arayabilir ve lobideki diğer kullanıcılarla bilgi paylaşabilir. Bir lobi birçok oyunun oyuncu sayısı çoğunlukla 2-16 arasında değişse de 250'ye kadar kullanıcıyı barındırabilir. Yetenek temelli eşleştirme bu sistem üzerine kurulmuştur.
Steam'in kullanıcıdan kullanıcıya eşleştirme API'ı, kullanıcıların birlikte oyun oynayabilecekleri kullanıcıları bulmasına ayarlanmıştır. Tüm eşleştirme işlevleri
ISteamMatchmaking'de, her bir işlev için olan parametrelerde daha fazla ayrıntı barındırmaktadır. Lobiler eşsiz bir şekilde, kullanıcılarda ve oyun sunucularında olduğu gibi Steam ID tarafından tanımlanır. Steamworks Örnekleri lobilerin tam çalışan bir uygulamasına sahiptir.
Eşleştirme işlem akışı
Oyun oynamak için grup oluşturma modeli genellikle aşağıdaki gibidir:
- Kullanıcılar çok oyunculu oynamak istediği bir oyunu ve oyunun türünü seçer (kurallar, bölümler ve benzeri)
- Oyun, aynı kurallara sahip lobileri arama API'ını kullanarak arar.
- Eğer bir lobi bulunursa o lobiye katılınır; eğer bulunmazsa yeni bir lobi oluşturulur
- Kullanıcılar oyunu başlatmaya yetecek kadar oyuncu olana kadar lobide kalır. Veri, kullanıcıların hangi karakteri seçmek istedikleri veya diğer kullanıcı ayarları lobi üyeleri arasında paylaşılır. Eğer lobide şart koşulan bir kural varsa (sadece bir kullanıcı belirli bir karakteri oynayabilir gibi) bu koşulu sadece lobi sahibi belirleyebilir.
- Lobiyle ilişkili bir kullanıcı olabilir veya olmayabilir. Eğer varsa lobi verisi iletişim işlevleri lobi üyeleri arasında sohbet mesajlarına izin verebilir. Ses verisi de gönderilebilir; ancak gönderilebilmesi için Steam Ağ Oluşturma API'ının kullanılması gerekmektedir.
- Oyun başlamaya hazır olduğunda, tüm kullanıcılar oyun sunucusuna katılabilir veya kullanıcı tarafından belirlenen oyun sunucusuna bağlanabilir ve daha sonra lobiden ayrılabilir. Tüm kullanıcılar lobiden ayrıldığında sunucu kendiliğinden kapatılır.
Lobi aramak
Oyununuzun lobi araması olmasını için
ISteamMatchmaking::RequestLobbyList'i çağırmanız gerekmektedir. Bu işlev eşzamansızdır ve talebinizin durumunu takip etmek için bir SteamAPICall_t kullanımını döndürür. Kullanıcıların Steam arka ucuna bağlantılarına bağlı olarak bu çağrının tamamlanması 300ms'den 5 saniye kadar sürebilir ve 20 saniyelik bir zaman aşımı süresi vardır.
Dönen sonuçların sayısı
LobbyMatchList_t arama sonucundadır ve daha sonra bunların hepsini tekrarlamak ve ID'lerini almak için
ISteamMatchmaking::GetLobbyByIndex'i kullanabilirsiniz.
En fazla 50 sonuca kadar döndürülebilir; ancak genellikle bu sayı birkaçı geçmez. Sonuçlar, coğrafi mesafeye göre sıralanan ve yakınındaki herhangi bir filtreye bağlı olarak döndürülür. Varsayılan olarak tamamen dolu lobileri ve yakınlık ayarı
k_ELobbyDistanceFilterDefault (civarında) ayarlanmış olanları döndürmeyeceğiz. Bu filtreleri eklemek için
RequestLobbyList
'i çağırmadan önce bir veya birkaç filtreleme işlevini çağırmalısınız:
Lobi oluşturmak
Eğer bir kullanıcının katılabileceği mevcut bir lobi bulamıyorsanız, bu artık bir lobi kurmanız gerektiğinin işaretidir. Sadece
ISteamMatchmaking::CreateLobby'yi çağırın ve tamamlanmasını bekleyin. Bu aramanın sonucu başarılı olup olmadığınızı gösterecektir ve eğer başarılıysa, lobinin steamID'sine
LobbyCreated_t yapısıyla geri dönecektir ve bu, lobide üstveriyi ayarlamak için kullanılabilir. Bir lobi oluşturduktan sonra yapacağınız ilk şey o lobinin verisini ayarlamak olacaktır ve böylece diğer oyun istemcileri bunu, aramak için kullanabilecektir (aşağıda görebilirsiniz).
Lobiye katılma
Arayarak veya arkadaşınızınkine katılarak iyi bir lobi bulduysanız
ISteamMatchmaking::JoinLobby'yi kullanabilir ve
LobbyEnter_t arama sonucunu bekleyebilirsiniz. Lobideyken, lobi veri API'ını kullanarak ne görüntüleneceğine karar vermek için lobi detaylarını alacaksınız (eğer görüntüleyecek bir ekran varsa).
Bir kullanıcı lobiye katılır veya terk ederse, bir
LobbyChatUpdate_t geri çağrısı o lobinin kurucusu dâhil tüm üyelerine gönderilir.
Hangi kullanıcının lobide olduğunu yinelemek için şunları kullanın:
Lobideki başka bir kullanıcı hakkında bilgi almak için arkadaş API'ını kullanmanız gerekmektedir. Bunun hakkında ayrıntılı bilgi almak için
Arkadaşlar, davetler ve lobiler bölümüne bakın.
Lobi Üstverisi
Lobi Üst verileri; lobi adlarını, mevcut haritayı, oyun modunu, oyunun mevcut durumunu veya aklınıza gelebilecek herhangi bir lobi durumunu ayarlamanıza imkân tanır.
Bir kullanıcı, üyesi olduğu herhangi bir lobinin lobi verisini otomatik olarak alacaktır. Arama sonuçlarıyla dönen lobilerde kullanıcı, lobi aramasını yaptığı zamandaki lobi verilerini alacaktır. Eğer bu bir "arkadaşının" lobisiyse,
ISteamMatchmaking::RequestLobbyData çağrılana ve başarılı bir şekilde sonuçlanana dek herhangi bir lobi verisi görünmeyecektir.
Eğer lobi verisi lobiye katıldıktan sonra değiştirilirse, bütün lobi üyeleri
LobbyDataUpdate_t geri çağrısı alacaktır (bu geri çağrı
ISteamMatchmaking::RequestLobbyData çağrısının tamamlandığını bildiğiniz bir işler).
Aşağıda, lobi verilerini almak ve ayarlamak için kullanabileceğiniz işlevler bulunmaktadır. Sadece lobi sahibi lobi verisini ayarlayabilir veya silebilir.
Üst veriler üzerinde yineleme yapmanızı sağlayan işlevler aşağıdadır (bu genellikle yalnızca hata ayıklama amacıyla kullanılır):
Lobiler ayrıca üyelerin, diğer üyelerin aşağıdaki işlevlerle ilgili güncellemeleri alabilecekleri kendi meta verilerini ayarlamasına da imkân tanır.
Lobiyle iletişim kurma
Lobide bilgi göndermek için (sohbet mesajları, oyun başlatma işaretleri ve benzeri)
ISteamMatchmaking::SendLobbyChatMsg çağırmalısınız. Bu, lobideki tüm kullanıcılara basit bir ikili mesaj gönderir. Lobi üyelerinin
ISteamMatchmaking::LobbyChatMsg_t geri çağrısını dinlemeleri gerekmektedir. Geri çağryı aldıktan sonra mesajın içeriğini almak için
ISteamMatchmaking::GetLobbyChatEntry'yi kullanabilirsiniz.
Arkadaşlar, davetler ve lobiler
Bir kullanıcının arkadaşlarının yer aldığı bütün lobileri arkadaşlar API'ını kullanarak bulabilirsiniz:
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 geçerli bir lobidir, buna katılabilir ya da RequestLobbyData() kullanarak üstverisini alabilirsiniz
}
}
Bir arkadaşınızı lobiye
ISteamMatchmaking::InviteUserToLobby ile çağırabilirsiniz
. Arkadaşınız oyuna katılma bağlantısını içeren bir sohbet iletisi alacaktır. Eğer kullanıcı bağlantıya tıklarsa ve oyunu hâlihazırda çalıştırmıyorsa, oyun şu komut satırıyla başlatılacaktır:
+connect_lobby <64-bit lobby id>
. Bir komut satırıyla uygulamanızı başlattığınızda uyarı penceresini devre dışı bırakabilmeniz için uygulamanızın
ISteamApps::GetLaunchCommandLine'ı uygulamanıza imkân tanıdığına emin olun.
Eğer kullanıcı oyunu başlatmışsa, katılmak istediği lobi kullanıcısının Steam ID'sini içeren
ISteamFriends::GameLobbyJoinRequested_t geri çağrısını alacaktır. Bu yanıta cevap vermeye sizin oyununuz karar verecektir.
Eğer kullanıcının lobiye davet edeceği kişileri bir arkadaş listesinden seçmesini istiyorsanız
ISteamFriends::ActivateGameOverlayInviteDialog'u çağırabilirsiniz.
Bu, arkadaşları mevcut lobiye davet etmek için tasarlanmış olan diyalogların görüneceği Steam oyun içi arayüzünü etkinleştirir.
Kimlik Doğrulama
Steam lobisinde olan bir oyuncunun kimliği, Steam arka ucu tarafından tamamen doğrulanmıştır. Oyunun gerçekleştirmesi gereken ilave kimlik doğrulama aşamalarına gerek yoktur, eğer tabii bu oyuncuların VAC yasaklamasına sahip olup olmadığına bakmıyorsa (bkz. Valve Anti Hile Teknolojisi). Eğer bir kullanıcı aynı hesapla ikinci bir yerden bağlanmaya çalışırsa önceki girişleri otomatik olarak mevcut lobilerden silinir.
Temizlik
Oyun başladıktan sonra her kullanıcı şunu kullanarak lobiden çıkabilir:
ISteamMatchmaking::LeaveLobbyBütün oyuncular çıktıktan sonra lobi, arka uçta otomatik olarak yok edilir.
Lobi İpuçları
- Genel olarak lobileri sadece gerekli olduğu zaman oluşturmalısınız. Örneğin eğer bir kullanıcı bir arkadaşını oynamaya davet ederse ya da lobi gerektiren bir manuel bir eylemi tetiklerse.
- Lobilerin üstverisini çok sık güncelleştirmeyin. Sadece arama için kullanılan üstverileri ve değerleri (oyun türü ya da oyun durumu gibi) ekleyin. Lobi araması boş yere sahip lobileri otomatik olarak aradığı için oyuncu sayımını koymanıza gerek yoktur.
- Sırf üstverilerini öğrenmek için lobilere katılmayın. Lobi üstverileri, bütün lobiler için ayrı ayrı indirilebilir ve bu veri; oyununuz tarafından kullanıcıların lobi seçebileceği bir liste oluşturmak için kullanılabilir ya da oyununuz bu veriyi kullanarak hangi arama sonuçlarına katılacağını otomatik olarak belirleyebilir.
Daha Fazla Sorunuz Mu Var?
Steam Eşleştirmesi ve Lobileri tartışma forumunda sorularınızı sorabilirsiniz.