Steamworks dokumentáció
Steam Meccskeresés és Várók

Áttekintés

A Steam pont-pont közötti meccskeresése a várók elgondolása köré épül. A váró olyan entitás, amely a Steam háttérkiszolgálókon található, és nagyon hasonlít egy csevegőszobához. A felhasználók létre tudnak hozni új várót, adatokat tudnak társítani a várókhoz, kereshetnek várókat ezen adatok alapján, csatlakozhatnak várókhoz, és információkat oszthatnak meg a váróban levő többi felhasználóval. Egyetlen váróban legfeljebb 250 felhasználó lehet, ám a játékok többségénél legfeljebb 2-16 játékos van. Erre a rendszerre ügyességalapú meccskeresés is épül.

A Steam pont-pont közötti meccskereső API olyan funkciók készlete, amelyek lehetővé teszik a felhasználóknak más felhasználók keresését, akikkel játszhatnak. A meccskeresési funkciók mindegyike az ISteamMatchmaking-ben található, ami további részleteket tartalmaz az egyes funkciók paramétereiről. A várókat egyedi SteamID azonosítja, ahogy a felhasználókat és játékszervereket. A Steamworks példában megtalálható a várók egy teljes körűen működő megvalósítása.

Meccskeresési folyamat

A csoportok játékra összegyűjtésének szokásos folyamata a következő:
  1. A felhasználó kiválasztja a játékban, hogy többjátékost szeretne játszani, és milyen fajtát (szabályok, felállás stb.).
  2. A játék a várókereső API használatával olyan várókat keres, amelyeknek hasonló vagy egyező szabályaik vannak.
  3. Ha található váró, akkor a játék csatlakozik ahhoz a váróhoz; ha nem található váró, akkor újat hoz létre.
  4. A felhasználók a váróban maradnak, míg nincs elég játékos, aki kész a játék elindítására. A várótagok között adatok cserélődnek a játszani kívánt karakterről vagy egyéb felhasználónkénti beállításokról. Ha vannak olyan szabályok, amelyeket be kell tartatni a váróban (például egy bizonyos karakterként csak egy felhasználó játszhat), akkor van egy, és csak egy várótulajdonos, aki eldöntheti ezeket.
  5. A váróhoz vagy társul felhasználói felület, vagy nem; ha van, akkor a váró adatkommunikációs funkciói használhatók csevegésüzenetek küldésére a várótagok között. Hangadatok is küldhetők, de azt a Steam hálózatkezelés API használatával kell elküldeni.
  6. Amikor a játék indításra kész, az összes felhasználó csatlakozik a játékszerverhez vagy a játék házigazdájaként kijelölt felhasználóhoz, majd elhagyják a várót. Miután minden felhasználó elhagyta a várót, az automatikusan megsemmisül.

Várók keresése

Ahhoz, hogy játékod várót keressen, meg kell hívnod az ISteamMatchmaking::RequestLobbyList-et.
Ez aszinkron függvény, ami egy SteamAPICall_t leírót ad vissza, amellyel nyomon követheted a kérés állapotát. A felhasználók és a Steam háttérrendszerek közti kapcsolattól függően ez a hívás 300 ms-tól 5 másodpercig tarthat, és 20 másodperc az időtúllépése.
A visszaadott találatok száma az LobbyMatchList_t hívási eredményben van, amin aztán az ISteamMatchmaking::GetLobbyByIndex használatával végiglépkedhetsz az azonosítóik megkapásához.
Legfeljebb 50 találat kapható vissza, de általában nincs több néhánynál. Az eredmények földrajzi távolság szerint rendezve, és bármilyen beállított közeli szűrő alapján kerülnek visszaadásra. Alapesetben nem adunk vissza már megtelt várókat, a távolságszűrő pedig k_ELobbyDistanceFilterDefault (közeli) értékre van állítva. Szűrők hozzáadásához a RequestLobbyList hívása előtt meg kell hívnod egy vagy több szűrőfüggvényt:

Váró létrehozása

Ha nem találsz létező várót, amelyhez egy felhasználó csatlakozhat, akkor általában létre kell hozni egyet. Csak hívd meg az
ISteamMatchmaking::CreateLobby-t, és várd meg a végrehajtódását. A hívás eredménye jelzi, hogy sikerült-e vagy sem, és ha sikerült, akkor visszaadja a váró SteamID-jét egy LobbyCreated_t struktúrában, amely használatával metaadatok állíthatók be a várón. Az első, amit érdemes megtenni egy váró létrehozása után, hogy olyan adatokat állítasz be rajta, amelyeket más játékkliensek használhatnak a megtalálásához (lásd alább).

Csatlakozás egy váróhoz

Ha találtál egy jó várót, akár keresésből, akár egy baráttól, használhatod az ISteamMatchmaking::JoinLobby-t, és megvárhatod az LobbyEnter_t hívási eredményt. Miután a váróban vagy, érdemes használni a váróadat API-t részletek lekérésére a váróról, hogy kiderítsd, mit kell megjeleníteni (ha van bármi megjelenítendő).

Amikor felhasználó csatlakozik egy váróhoz vagy hagyja el azt, LobbyChatUpdate_t callback kerül elküldésre az adott váró minden tagjának, a tulajdonost is beleértve.

A jelenleg egy váróban levő felhasználók végigléptetéséhez használd az alábbiakat:

További információ szerzéséhez egy másik felhasználóról a váróban a barátok API-t kell használnod. További információkért lásd: Barátok, meghívók és várók.

Váró metaadatok

A váró metaadatok lehetővé teszik tetszőleges váróállapot beállítását, beleértve a váró nevét, a jelenlegi pályát, a játékmódot, a játék jelenlegi állapotát vagy bármi mást, ami eszedbe jut.

A felhasználó automatikusan megkapja a legfrissebb váróadatokat minden váróhoz, amelynek tagja. A keresési eredményeken keresztül visszaküldött váróknál a felhasználónak abból az időpontból lesznek váróadatai, amikor a keresést végezte. Ha ez egy barát várója, akkor az ISteamMatchmaking::RequestLobbyData hívásáig és sikeres befejeződéséig nem lesznek elérhető váróadatok.

Ha egy váró adatai megváltoznak, a váró minden tagja LobbyDataUpdate_t callbacket fog kapni (ez ugyanaz a callback, mind amiből az ISteamMatchmaking::RequestLobbyData hívás végrehajtódását tudhatod).

Az alábbiak azok a függvények, amelyek használatával váróadatokat kérhetsz le és állíthatsz be. Váróadatokat csak a váró tulajdonosa tud törölni vagy beállítani.

Függvények, amelyek lehetővé teszik a végigléptetést a metaadatokon (ez jellemzően csak hibakeresés céljából használt):

A várók az alábbi függvényekkel azt is lehetővé teszik a tagoknak, hogy saját metaadatokat állítsanak be, amelyekről a többi tag frissítéseket kaphat:

Kommunikáció egy váróban

Információ (csevegésüzenetek, játékindítási jelek stb.) körbeküldéséhez egy váróban az ISteamMatchmaking::SendLobbyChatMsg-t kell meghívnod, ami egy egyszerű bináris üzenetet küld minden felhasználóak a váróban. A váró tagjainak az ISteamMatchmaking::LobbyChatMsg_t callbacket kell figyelniük. A callback fogadása után az ISteamMatchmaking::GetLobbyChatEntry használatával lekérheted az üzenet tartalmát.

Barátok, meghívók és várók

A barátok API-val megtudhatod az összes olyan várót, amelyben egy felhasználó barátai tartózkodnak:
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() ) { // a friendGameInfo.m_steamIDLobby érvényes váró, csatlakozhatsz hozzá, vagy a RequestLobbyData() használatával lekérheted a metaadatait } }

Az ISteamMatchmaking::InviteUserToLobby-val meghívhatsz egy barátot egy váróba.
Ez a felhasználó csevegési párbeszédablakot fog kapni egy hivatkozással a játékhoz csatlakozáshoz. Ha a felhasználó a hivatkozásra kattint, és jelenleg nem futtatja a játékot, a hivatkozás a következő parancssori paranccsal elindítja a játékot:
+connect_lobby . Győződj meg róla, hogy az alkalmazásod implementálja az ISteamApps::GetLaunchCommandLine-t, hogy letilthasd a parancssoron keresztüli indításkor megjelenő felugró figyelmeztetést.

Ha a felhasználó már játékban van, egy ISteamFriends::GameLobbyJoinRequested_t callback lesz elküldve, amely tartalmazza annak a várónak a SteamID-jét, amelyhez a felhasználó csatlakozni kíván. A játékod dolga annak eldöntése, hogy engedelmeskedik-e vagy sem.

Ha azt akarod, hogy a felhasználó barátok listájából válasszon a váróba hívandó felhasználót, meghívhatod az ISteamFriends::ActivateGameOverlayInviteDialog-t.
Ez aktiválja a Steam játékon belüli átfedését egy párbeszédpanellel, amellyel barátok hívhatók meg a jelenlegi váróba.

Hitelesítés

Egy Steam váróban levő összes felhasználó már teljesen hitelesítve van a Steam háttérszolgáltatással. A játéknak nem kell több hitelesítési lépést végrehajtania várófelhasználóknál, hacsak nem azt vizsgálja, hogy van-e VAC-kitiltásuk (lásd: Valve Anti-Cheat technológia). Ha egy felhasználó egy második helyről próbál bejelentkezni ugyanazzal a fiókkal, akkor a korábbi bejelentkezése automatikusan eltávolításra kerül minden létező váróból.

Takarítás

Miután a játék elindult, egyszerűen minden felhasználó elhagyhatja a várót az
ISteamMatchmaking::LeaveLobby-val
Miután az összes felhasználó távozott, a várót a háttérszolgáltatás automatikusan megsemmisíti.

Várójavaslatok

  • Általánosságban csak akkor hozz létre várót, amikor szükséges. Például, amikor a felhasználó meghív egy barátot játszani, vagy manuálisan valami olyat aktivál, ami várót igényel.
  • Ne frissítsd nagy gyakorisággal a várók metaadatait. Csak kereséshez használt metaadatokat és értékeket adj hozzá (például játéktípus vagy játékállapot). Játékosszámokat nem kell megadnod, mert a várókeresés eleve szabad hellyel rendelkező várókat fog keresni.
  • Ne csatlakozz várókhoz csupán a metaadataik megismeréséért. A váró-metaadatok külön-külön letölthetők az összes váróhoz, amit aztán a játékod használhat vagy várólista megjelenítésére, hogy a felhasználó válasszon közülük, vagy a játék automatikusan eldöntse, melyik keresési eredményhez csatlakozzon.

További kérdéseid vannak?

Tegyél fel kérdéseket a Steam Matchmaking & Lobbies témafórumban.