Steamworks-Dokumentation
Steam-Matchmaking und Lobbys

Übersicht

Das Peer-to-Peer-Matchmaking von Steam beruht auf dem Konzept einer Lobby. Eine Lobby ist eine Entität, die auf den Steam-Backendservern ausgeführt wird und in vielen Dingen einem Chatraum ähnelt. Spieler können eine neue Lobby erstellen, Daten mit einer Lobby verknüpfen, basierend auf diesen Daten nach Lobbys suchen, Lobbys beitreten und mit anderen Spielern in der Lobby Informationen austauschen. Eine einzige Lobby kann bis zu 250 Spieler aufnehmen, obwohl die meisten Spiele höchstens 2 bis 16 Spieler haben. Auf diesem Fundament wird die auf Fertigkeiten basierende Spielervermittlung aufgebaut.

Die Peer-to-Peer-Matchmaking-API von Steam stellt eine Reihe von Funktionen bereit, mit denen Spieler andere Spieler finden können, mit denen sie ein Spiel spielen können. Die Matchmaking-Funktionen sind in ISteamMatchmaking enthalten, das weitere Details zu den Parametern für jede Funktion enthält. Lobbys werden genau wie Spieler oder Spielserver durch eine Steam-ID eindeutig identifiziert. Das Steamworks-Beispiel enthält eine voll funktionsfähige Implementierung von Lobbys.

Ablauf des Matchmaking-Prozesses

Das übliche Modell zum Zusammenführen von Gruppen zum gemeinsamen Spielen sieht folgendermaßen aus:
  1. Der Spieler wählt im Spiel aus, dass er ein Mehrspielerspiel spielen möchte, und gibt an, welche Art von Mehrspielerspiel er spielen möchte (Regeln, Szenario usw.).
  2. Das Spiel sucht mithilfe der API zur Lobbysuche nach Lobbys mit einem ähnlichen Regelsatz.
  3. Wenn eine Lobby gefunden wird, tritt das Spiel dieser Lobby bei. Wenn keine Lobby gefunden wird, erstellt es eine neue Lobby
  4. Spieler bleiben in einer Lobby, bis genug Spieler bereit sind, das Spiel zu starten. Zwischen den Lobbymitgliedern werden Informationen darüber, welchen Charakter sie übernehmen möchten, oder andere benutzerspezifische Einstellungen ausgetauscht. Wenn Regeln vorhanden sind, die in der Lobby durchgesetzt werden müssen (z. B. dass nur ein einziger Spieler mit einem bestimmten Charakter spielen kann), dann gibt es einen einzigen Lobbybesitzer, mit dessen Hilfe Sie darüber entscheiden können.
  5. Die Lobby kann eine Benutzeroberfläche haben oder auch nicht. Falls eine Benutzeroberfläche vorhanden ist, können die Datenkommunikationsfunktionen der Lobby dazu verwendet werden, Chatnachrichten zwischen Lobbymitgliedern hin und her zu senden. Sprachdaten können ebenfalls gesendet werden, dies muss jedoch mit der API Steam-Netzwerk erfolgen.
  6. Sobald das Spiel startbereit ist, treten alle Spieler dem Spielserver bei oder stellen Verbindung zu dem Spieler her, der zum Host des Spiels ernannt wurde, und verlassen danach die Lobby. Sobald alle Spieler eine Lobby verlassen haben, wird diese automatisch zerstört.

Suchen nach Lobbys

Um Ihr Spiel nach einer Lobby suchen zu lassen, müssen Sie Folgendes aufrufen: ISteamMatchmaking::RequestLobbyList
Diese Funktion ist asynchron und gibt einen SteamAPICall_t-Handle zurück, den Sie dazu verwenden können, den Status der Anfrage zu verfolgen. Abhängig von der Verbindung des Nutzers zum Steam-Backend kann dieser Aufruf 300 ms bis 5 Sekunden benötigen, bis er abgeschlossen ist. Er hat eine Zeitüberschreitungsspanne von 20 Sekunden.
Die Anzahl der zurückgegebenen Ergebnisse befindet sich im LobbyMatchList_t-Aufrufergebnis, das Sie danach mit ISteamMatchmaking::GetLobbyByIndex verwenden können, um über sie zu iterieren und ihre IDs abzurufen.
Bis zu 50 Ergebnisse können zurückgegeben werden, aber in der Regel sind es nicht mehr als zwei Ergebnisse. Diese Ergebnisse werden nach geografischer Distanz geordnet und auf eventuell eingestellten Nähefiltern basierend zurückgegeben. Standardmäßig geben wir keine Lobbys zurück, die bereits voll sind, und der Distanzfilter ist auf k_ELobbyDistanceFilterDefault (in der Nähe) eingestellt. Um Filter hinzuzufügen, bevor Sie RequestLobbyList aufrufen, müssen Sie eine oder mehrere der folgenden Filterfunktionen aufrufen:

Erstellen einer Lobby

Wenn Sie keine existierende Lobby finden können, der ein Spieler beitreten kann, würden Sie in der Regel eine Lobby erstellen. Rufen Sie
ISteamMatchmaking::CreateLobby auf und warten Sie, bis der Vorgang abgeschlossen ist. Das Aufrufergebnis gibt an, ob der Aufruf erfolgreich war oder nicht, und bei Erfolg wird die Steam-ID der Lobby in einer LobbyCreated_t-Struktur abgerufen, die dazu verwendet werden kann, Metadaten für die Lobby einzustellen. Ihr erster Schritt nach dem Erstellen einer Lobby sollte darin bestehen, für die Lobby Daten einzustellen, die andere Spiel-Clients dazu verwenden können, nach ihr zu suchen (siehe unten).

Beitreten einer Lobby

Wenn Sie entweder durch eine Suche oder über einen Freund eine gute Lobby gefunden haben, können Sie ISteamMatchmaking::JoinLobby verwenden und auf das LobbyEnter_t-Aufrufergebnis warten. Sobald Sie in der Lobby sind, sollten Sie die Lobby-Daten-API verwenden, um Details über die Lobby abzurufen und zu bestimmen, was angezeigt werden soll (sofern überhaupt etwas angezeigt werden soll).

Wenn ein Spieler einer Lobby beitritt oder eine Lobby verlässt, wird an alle Mitglieder dieser Lobby einschließlich dem Besitzer eine LobbyChatUpdate_t-Rückruffunktion übermittelt.

Um mittels Iteration zu ermitteln, welche Spieler derzeit in der Lobby sind, verwenden Sie:

Um weitere Informationen über einen anderen Spieler in der Lobby abzurufen, müssen Sie die Freunde-API verwenden. Weitere Informationen finden Sie im Dokumentationsartikel Freunde, Einladungen und Lobbys.

Lobbymetadaten

Lobbymetadaten erlauben Ihnen, den beliebigen Status der Lobby einzustellen, einschließlich des Namens der Lobby, der aktuellen Karte, des Spielmodus, des aktuellen Status des Spiels oder aller sonstigen Angaben, die Ihnen einfallen.

Ein Spieler verfügt automatisch über die neuesten Lobbydaten jeder Lobby, in der er Mitglied ist. Bei Lobbys, die über Suchergebnisse zurückgegeben wurden, verfügt der Spieler über Lobbydaten des Zeitpunkts, zu dem er die Suche durchgeführt hat. Handelt es sich um die Lobby eines Freundes, sind erst dann Lobbydaten zum Anzeigen verfügbar, wenn ISteamMatchmaking::RequestLobbyData aufgerufen und erfolgreich abgeschlossen wurde.

Wenn sich Lobbydaten für eine Lobby geändert haben, erhalten alle Lobbymitglieder eine LobbyDataUpdate_t-Rückruffunktion. (Durch dieselbe Rückruffunktion erfahren Sie auch, dass ein ISteamMatchmaking::RequestLobbyData-Aufruf abgeschlossen wurde.)

Dies ist das Set von Funktionen, die Sie verwenden können, um Lobbydaten abzurufen und einzustellen. Nur der Lobbybesitzer kann die Lobbydaten einstellen oder löschen.

Funktionen, die Ihnen erlauben, über die Metadaten zu iterieren (dies wird in der Regel ausschließlich zum Debuggen verwendet):

Lobbys erlauben Mitgliedern auch, mithilfe der folgenden Funktionen ihre eigenen Metadaten einzustellen, für welche die anderen Mitglieder Aktualisierungen empfangen können.

Kommunikation innerhalb einer Lobby

Um Informationen innerhalb einer Lobby zu senden (Chatnachrichten, Spielstartsignale usw.), müssen Sie ISteamMatchmaking::SendLobbyChatMsg aufrufen. Dadurch wird eine einfache binäre Nachricht an alle Spieler in der Lobby gesendet. Lobbymitglieder müssen auf die ISteamMatchmaking::LobbyChatMsg_t-Rückruffunktion warten. Nach dem Empfang der Rückruffunktion können Sie ISteamMatchmaking::GetLobbyChatEntry verwenden, um den Inhalt der Nachricht abzurufen.

Freunde, Einladungen und Lobbys

Mit der Freunde-API können Sie alle Lobbys ermitteln, in denen sich die Freunde eines Nutzers befinden:
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 stellt eine gültige Lobby dar, Sie können ihr beitreten oder RequestLobbyData() verwenden, um ihre Metadaten abzurufen. } }

Mit ISteamMatchmaking::InviteUserToLobby können Sie einen Freund in eine Lobby einladen.
Der Freund erhält einen Chatdialog mit einem Link, über welchen er dem Spiel beitreten kann. Wenn der Freund auf den Link klickt und derzeit nicht das Spiel ausführt, wird das Spiel mit der folgenden Befehlszeile gestartet:
+connect_lobby <Lobby-ID (64 Bit)>

Wenn sich der Benutzer bereits in einem Spiel befindet, wird eine ISteamFriends::GameLobbyJoinRequested_t-Rückruffunktion übermittelt, in der die Steam-ID der Lobby enthalten ist, der dieser Spieler beitreten möchte. Es ist Ihrem Spiel überlassen, zu entscheiden, ob dem Wunsch Folge geleistet werden soll oder nicht.

Wenn Sie möchten, dass der Spieler Freunde aus einer Liste auswählt, um diese in eine Lobby einzuladen, können Sie ISteamFriends::ActivateGameOverlayInviteDialog aufrufen.
Hierdurch wird das spielinterne Steam-Overlay in einem Dialogfeld aktiviert, das zum Einladen von Freunden in die aktuelle Lobby erstellt wurde.

Authentifizierung

Jeder Benutzer in einer Steam-Lobby ist bereits vollständig mit dem Steam-Backend authentifiziert. Das Spiel braucht mit Lobbybenutzern keine weiteren Authentifizierungsschritte durchzuführen, es sei denn, um nachzusehen, ob sie von VAC ausgeschlossen sind (siehe Valve Anti-Cheat-Technologie). Wenn ein Spieler versucht, sich von einem zweiten Ort aus mit demselben Account anzumelden, wird seine vorherige Anmeldung automatisch aus allen existierenden Lobbys entfernt.

Bereinigung

Sobald das Spiel gestartet wurde, kann jeder Spieler mit der folgenden Funktion die Lobby verlassen:
ISteamMatchmaking::LeaveLobby
Sobald alle Spieler eine Lobby verlassen haben, wird sie automatisch auf dem Backend zerstört.

Tipps zur Lobby

  • Grundsätzlich gilt: erstellen Sie Lobbys nur bei Bedarf. Zum Beispiel dann, wenn ein Spieler einen Freund zum Spielen einlädt oder eine manuelle Aktion auslöst, die eine Lobby erfordert.
  • Aktualisieren Sie die Metadaten auf Lobbys nicht allzu häufig. Fügen Sie Metadaten und Werte nur hinzu, wenn sie für die Suche (z. B. Spieltyp oder Spielzustand) verwendet werden. Sie müssen die Anzahl der Spieler nicht angeben, solange die Lobby-Suche bereits nach Lobbys mit offenen Slots sucht.
  • Treten Sie keiner Lobby bei, nur um ihre Metadaten herauszufinden. Lobby-Metadaten können separat für alle Lobbys heruntergeladen werden. Diese kann Ihr Spiel dann verwenden, um entweder dem Nutzer eine Liste auswählbarer Lobbys anzuzeigen oder das Spiel kann automatisch entscheiden, welchen Suchergebnissen es beitritt.

Noch Fragen?

Stellen Sie Fragen im Diskussionsforum zu Steam-Matchmaking und Lobbys.