Verwenden freigegebener Gruppendaten

Freigegebene Gruppendaten sind eine einfache Möglichkeit für Spieler, einige Informationen mit einer eng eingeschränkten Liste anderer Spieler zu teilen.

Notiz

Freigegebene Gruppendaten wurden ursprünglich so konzipiert, dass sie in den meisten Fällen vom Server autoritativ gesteuert werden, und der vorherige Rat war, Spieler nicht direkt zu den Daten der freigegebenen Gruppe hinzuzufügen, da sie lese-/schreibberechtigungen erhielten (was Betrug ermöglichte). Unsere neue API-Zugriffsrichtlinie ermöglicht jedoch eine viel größere Abweichung von Funktionalität und Sicherheit gegenüber dem ursprünglichen Entwurf. Weitere Informationen finden Sie im Erweiterten Abschnitt dieses Dokuments.

Warnung

Freigegebene Gruppendaten sollten höchstens von Gruppen verwendet werden, die größer als ein Dutzend Spieler sind. Ein Problem besteht darin, dass zu viele Spieler gleichzeitig versuchen, die gleichen Daten zu lesen, zu Verzögerungen beim Lesen der Daten führt (freigegebene Gruppendaten werden nicht shardiert oder zwischengespeichert, so wie die Daten, die von vielen Spielern gleichzeitig gelesen werden sollen, wie Titeldaten). Und es sollte besonders darauf geachtet werden, dass Spieler keine Daten überschreiben. In der instance, dass mehrere Spieler versuchen, gleichzeitig in denselben Schlüssel zu schreiben, wird nur einer dieser Schreibvorgänge "gewonnen", was zum Verlust der Daten des anderen Benutzers führt.

Beispiel: Turnbasierte asynchrone Multiplayer-Spiele

Der ursprüngliche und dennoch beste Anwendungsfall für Daten der freigegebenen Gruppe wird am besten als Speichern des Zustands für ein Online-Brettspiel beschrieben. Spieler ändern die Daten abwechselnd über CloudScript mit einer klaren Turnreihenfolge.

Spieler können sich abmelden und das Spiel später fortsetzen, wobei ihr Spielzustand in der Cloud gespeichert ist.

Das folgende CloudScript-Beispiel ist die rundenbasierte Struktur für alle gängigen Brettspiele. Das Brettspiel selbst wird als Pseudocode gestubbt.

Annahmen

Die freigegebenen Gruppendaten, die das Spiel darstellen, wurden bereits gestartet, und ihre Mitgliedschaft ist bereits definiert.

// CloudScript/Javascript
const MY_GAME_GROUP_KEYS: Array<string> = ["gameState", "currentPlayerTurn"];
interface PlayerTurnArgs {
    sharedGroupId: string;
    nextPlayerTurn: string;
    turnData: any;
}
handlers.TakePlayerTurn = function (args: PlayerTurnArgs) {
    var getRequest: PlayFabServerModels.GetSharedGroupDataRequest = { SharedGroupId: args.sharedGroupId, GetMembers: true, Keys: MY_GAME_GROUP_KEYS };
    var gameData: PlayFabServerModels.GetSharedGroupDataResult = server.GetSharedGroupData(getRequest);
    CheckValidPlayer(currentPlayerId, args.sharedGroupId, gameData.Members, gameData.Data["currentPlayerTurn"].Value, args.nextPlayerTurn);
    var newGameStateJson = UpdateGameState(args.turnData, gameData.Data["gameState"].Value);
    var updateRequest: PlayFabServerModels.UpdateSharedGroupDataRequest = {
        SharedGroupId: args.sharedGroupId,
        Data: {
            "gameState": newGameStateJson,
            "currentPlayerTurn": args.nextPlayerTurn
        }
    };
    server.UpdateSharedGroupData(updateRequest);
}
function CheckValidPlayer(playFabId: string, sharedGroupId: string, members: Array<string>, currentPlayerTurn: string, nextPlayerTurn: string): void {
    var validCurPlayer = false;
    var validNextPlayer = false;
    for (var m = 0; m < members.length; m++) {
        if (members[m] === playFabId)
            validCurPlayer = true;
        if (members[m] === nextPlayerTurn)
            validNextPlayer = true;
    }
    if (!validCurPlayer || !validNextPlayer) // Take extreme action against a player trying to cheat
    {
        server.BanUsers({ Bans: [{ PlayFabId: playFabId, Reason: "Trying to play a game you don't belong to: " + sharedGroupId }] });
        throw "You have been banned";
    }

    if (playFabId !== currentPlayerTurn)
        // May wish to additionally implement a spam-counter here and potentially take more extreme action for high-spam count
        throw "Not your turn";
}
function UpdateGameState(turnData: any, currentState: string): string {
    // PSEUDO-CODE-STUB: Update the turn-based game state according to the rules of this game
    return JSON.stringify({});
}

Auf hoher Ebene können Sie freigegebene Gruppendaten verwenden, um Parteien/Raids oder andere semi-permanente Gruppen von Spielern zu implementieren, solange die Gruppengröße relativ klein ist, wie angegeben.

Es gibt derzeit zwar kein streng erzwungenes Limit, die Nutzung mit vielen Spielern wird jedoch nicht unterstützt, und in extremen Fällen kann dies zu einer Drosselung des Titelfeatures führen, um Auswirkungen auf andere Personen im Dienst zu verhindern.

Wichtige Einschränkungen

  • Freigegebene Gruppendaten:
    • Enthält nur einfache Schlüssel-Wert-Paar-Daten (Zeichenfolgen). Für die Verwendung als beliebiger anderer Datentyp (z. B. Bestandselemente, Statistiken, virtuelle Währungen usw.) muss der Titel alle erforderlichen Konvertierungen enthalten.
    • Ist weder Shards noch zwischengespeichert, sodass es nicht reagiert, wenn mehrere Spieler gleichzeitig darauf zugreifen. Features, die es verwenden, sollten für kleine Spielergruppen konzipiert werden und keine gleichzeitigen Schreibvorgänge zulassen.

Probleme mit Clientberechtigungen

Es gibt kein Rollen-/Rangsystem innerhalb einer Gruppe, d. h. jedes Mitglied in der Gruppe hat absolute Autorität innerhalb der Gruppe (es gibt keinen definierten Leiter).

Dies bedeutet, dass die Clients die vollständige Kontrolle über die Daten haben, wenn Sie nicht die Methoden für freigegebene Gruppendaten des Clients mit unserer API-Zugriffsrichtlinie deaktivieren, was zur Ausnutzung der Daten führen kann.

Es empfiehlt sich, entweder keine freigegebenen Gruppendaten für Spieldaten zu verwenden oder die Methoden für freigegebene Gruppendaten in der Client-API zu deaktivieren.