Passer au contenu principal
Toutes les collectionsQuestions générales
Comment implémenter un script de filtrage de lobby pour filtrer les candidats du lobby
Comment implémenter un script de filtrage de lobby pour filtrer les candidats du lobby

configurations du lobby

Jason Liang avatar
Écrit par Jason Liang
Mis à jour il y a plus de 2 semaines

Le Matchmaking en ligne brainCloud consiste à trouver (ou créer) un salon d'accueil adapté à l'utilisateur. Lors de ce processus, les participants potentiels sont placés dans une file d'attente. En dernier recours, si le développeur a spécifié un script de filtrage, les salons candidats lui seront transmis pour approbation finale avant d'être envoyés à l'application cliente. Voir le diagramme suivant: la vérification du script de filtrage est la dernière étape avant que l'utilisateur puisse rejoindre un salon.

Les critères de filtrage du script de filtrage de lobby peuvent être personnalisés selon vos besoins, mais en gros, en comparant simplement les données JSON du filtre lors de l'appel de FindLobby avec les configurations des lobbies candidats, qui peuvent être les métadonnées des lobbies ou les données personnalisées du propriétaire, voir les données suivantes auxquelles le script de filtrage du lobby peut accéder.

{
"step": 1,
"filter": {
"groupName": "group1",
"cheater": false,
"level": 5
},
"matchCandidate": {
"id": "13229:CursorPartyV2:29",
"lobbyType": "CursorPartyV2",
"state": "early",
"rating": 10,
"lobbyTypeDef": {
"roomConfig": {
"roomConfig_key3": false,
"roomConfig_key2": 99,
"roomConfig_key1": "customValue"
},
"lobbyTypeId": "CursorPartyV2",
"teams": {
"all": {
"minUsers": 1,
"maxUsers": 8,
"autoAssign": true,
"code": "all"
}
},
"rules": {
"allowEarlyStartWithoutMax": true,
"forceOnTimeStartWithoutReady": true,
"allowJoinInProgress": true,
"onTimeStartSecs": 300,
"disbandOnStart": false,
"everyReadyMinPercent": 0,
"everyReadyMinNum": 1,
"earliestStartSecs": 1,
"tooLateSecs": 300
},
"desc": "relay protocol version 2"
},
"settings": {
"groupName": "group1",
"cheater": false,
"level": 3
},
"version": 1,
"connectData": {},
"timetable": {
"createdAt": 1650419947323,
"early": 1650419948323,
"onTime": 1650420247323,
"tooLate": 1650420247323
},
"cRegions": [],
"round": 1,
"isRoomReady": false,
"ownerCxId": "13229:35620730-e2f0-468f-bc1d-700942de0b87:pggquikoeiqkj20kepu42175lr",
"legacyLobbyOwnerEnabled": false,
"numMembers": 1,
"members": [
{
"profileId": "35620730-e2f0-468f-bc1d-700942de0b87",
"name": "xx",
"pic": "",
"rating": 10,
"team": "all",
"isReady": false,
"extra": {
"colorIndex": 4
},
"cxId": "13229:35620730-e2f0-468f-bc1d-700942de0b87:pggquikoeiqkj20kepu42175lr"
}
]
},
"pingData": {}
}

L'exemple de script de filtre de lobby simple suivant vous montre comment utiliser les critères de filtre personnalisés pour filtrer les lobbys avec state et les données personnalisées du propriétaire settings lors de la création des lobbys.

"use strict";

function main() {
var response = {};
var is_accept = false;
bridge.logInfoJson("lobby filter data...", data);
var matchCandidate = data.matchCandidate;
var lobbyState = matchCandidate.state;
var lobbyRating = matchCandidate.rating;

// vérifier l'état, ne rejoindra pas si le lobby est déjà en train de démarrer
if (lobbyState != "starting")
{
var lobbySettings = matchCandidate.settings;
var filter = data.filter;

// vérifier si les données de filtre transmises par l'utilisateur correspondent aux données de paramètres du propriétaire
if (filter.groupName == lobbySettings.groupName &&
filter.level >= lobbySettings.level &&
filter.cheater == lobbySettings.cheater )
{
is_accept = true;
}
}

// l'objet retourné doit contenir le mot-clé 'accept' avec une valeur booléenne, le service de lobby vérifiera ce nom avec le code: `boolean isAccept = (Boolean) response.get("accept");`
response.accept = is_accept;
return response;
}

main();

Maintenant, testons ce script de filtre avec notre exemple RelayTestApp, qui peut être trouvé dans la plupart des types de librairies clientes brainCloud sur GitHub, nous utiliserons node.js.

  • Après avoir créé le script ci-dessus à partir de l'éditeur de scripts, accédez à la page Configurer les lobbys, ouvrez un type de lobby et liez le script de filtre de lobby à ce type de lobby à partir de la liste déroulante Filter Script.

  • Modifiez l'exemple d'application RelayTestApp pour créer un lien vers votre application, créez-la et exécutez-la sur votre appareil local, puis connectez-vous à l'application avec un utilisateur xx et cliquez sur le bouton PLAY GAME pour créer un lobby en tant que propriétaire (méthode d'appel de code findOrCreateLobby, car aucune autre instance de lobby en cours d'exécution ne s'exécute sur votre build local, donc le premier utilisateur qui appelle cette méthode créera un lobby).

    (Notez que si aucun candidat au lobby n'est trouvé, le script de filtrage ne sera pas déclenché.)

  • Les arguments passés sont les suivants pour l'appel findOrCreateLobby.

// Rechercher ou créer un lobby
this.bc.lobby.findOrCreateLobby(lobbyType, 10, 3, { strategy: "ranged-absolute", alignment: "center", ranges: [1000] }, {}, null, {"groupName":"group1", "cheater":false, "level":3}, false, {colorIndex:this.state.user.colorIndex}, "all", result =>
{
if (result.status !== 200)
{
this.dieWithMessage("Failed to find lobby")
}
})
  • Exécutez le même localhost à partir d'un autre navigateur, connectez-vous à l'application avec un autre utilisateur et cliquez sur le bouton PLAY GAME WITH FILTER SETTINGS, il appellera FindLobby avec le filtre JSON répondant à la validation du script de filtre du lobby.

  • Les arguments passés sont les suivants pour findLobbyl'appel.

// Trouver le lobby correspondant
this.bc.lobby.findLobby(lobbyType, 10, 3, { strategy: "ranged-absolute", alignment: "center", ranges: [1000] }, {"groupName":"group1", "cheater":false, "level":5}, null, false, {colorIndex:this.state.user.colorIndex}, "all", result =>
{
if (result.status !== 200)
{
this.dieWithMessage("Failed to find lobby")
}
})
  • Nous pouvons voir que le membre utilisateur yy a rejoint le lobby avec succès et nous pouvons savoir que le script de filtrage du lobby a été déclenché en vérifiant les informations du journal de l'application à partir de la page de surveillance.

  • Modifions maintenant l'une des conditions du script de filtrage sur "false", puis définissons-la filter.level <= lobbySettings.level(car le niveau JSON des données de filtrage transmises à l'utilisateur est supérieur de 5 au niveau des paramètres du propriétaire, qui est de 3). L'utilisateur yy quitte le lobby et le rejoint à nouveau. Nous pouvons constater que l'utilisateur ne parvient pas à rejoindre le lobby précédent avec le message JOIN_FAIL -- No lobbies found matching criteria.

PS. Rencontres en ligne (OMM)

Aperçu

Le matchmaking en ligne est le processus de recherche (ou de création) d'un lobby approprié pour l'utilisateur.

Lors du matchmaking, les participants potentiels sont placés dans une file d'attente/d'entrée.

Le système parcourt ensuite périodiquement tous les membres de la file d'attente, du plus ancien (numéro d'étape le plus élevé) au plus bas, à la recherche de lobbies appropriés et en créant un nouveau lobby pour cet utilisateur si nécessaire.

Si le développeur a spécifié un script de filtrage, les lobbies candidats lui seront transmis pour approbation finale avant de l'envoyer à l'application cliente.

Le processus lobbyQueue doit:

  • exécuter toutes les <x> secondes

  • quitter immédiatement s'il n'y a aucun participant dans la file d'attente

Données

Les informations suivantes sont également stockées sur le candidat dans la file d'attente:

  • cx- l'identifiant de connexion de l'utilisateur

  • profileId- l'identifiant du profil de l'utilisateur (séparé pour chaque utilisation dans le filtre de matchmaking)

  • lobbyType- le type de file d'attente dans laquelle l'utilisateur attend

  • rating- la note de compétence du candidat

  • step- l'étape/le stade/l'itération actuel de l'utilisateur dans le matchmaking

  • maxSteps- le nombre maximal d'étapes à attendre lors de la recherche. Les étapes se produisent environ toutes les 2 secondes.

  • algo- l'algorithme d'étape de notation à utiliser

  • filter- les critères de filtrage personnalisés

  • ready- booléen pour indiquer si le participant doit être prêt lorsqu'il est ajouté au lobby

  • extraJson- données supplémentaires sur le participant (à utiliser lors de l'ajout du participant au lobby)

  • team- l'équipe à laquelle ajouter le joueur. Peut-être"".

  • create- créer un lobby si nous atteignons maxSteps?

  • settings- si create == true, alors ces paramètres seront utilisés comme paramètres du propriétaire pour le lobby...

Algorithmes par étapes

Le système de matchmaking peut être programmé en complétant une structure algorithmique pour le pas à pas. Cette structure se présente comme suit: si maxSteps est supérieur aux plages incluses, la dernière plage spécifiée est utilisée.

{
"strategy": "ranged-percent",
"alignment": "center",
"ranges": [ 5, 5, 7.5, 7.5, 10, 10, 12.5, 12.5, 15, 15 ]
}

Les valeurs d’algorithme suivantes sont actuellement prises en charge:

  • strategy- permet de sélectionner l'algorithme de notation global. Les variantes suivantes sont prises en charge:

    • ranged-percent- les plages fournies sont interprétées comme des pourcentages à appliquer à la note de l'utilisateur pour le matchmaking.

    • ranged-absolute- les plages fournies sont interprétées comme des valeurs absolues à ajouter/soustraire de la note de l'utilisateur lors du calcul de la plage pour le matchmaking

    • compound- une forme particulière de stratégie prenant en charge les algorithmes imbriqués. Voir l'exemple.

  • alignment- détermine comment la plage est alignée avec la note de l'utilisateur

  • plages: un tableau de valeurs de plages à appliquer à l'algorithme. Remarque: si l'étape actuelle est supérieure à la valeur fournie dans la plage, la dernière valeur de la plage est utilisée.

Exemple utilisant l'algorithme compound - sélectionner le lobby en fonction du ping puis de la note

{
"strategy": "compound",
"algos" [
{ "criteria": "ping", "strategy": "ranged-percent", "alignment": "center" },
{ "criteria": "rating", "strategy": "ranged-percent", "alignment": "center" }
],
"compound-ranges": [
[ 30, [ 5, 7.5 ]],
[ 60, [ 5, 5, 7.5, 7.5, 10, 10 ]],
[ 130, [ 5, 7.5, 10, 12.5, 15]]
]
}

Les options suivantes d'alignment sont disponibles et montrent comment elles affecteraient une plage de +/- 10 pour un classement de 80.

alignment

min

max

description

high

80

100

Garantit que les salons doivent avoir un niveau de skill >= à celui du candidat. La valeur minimale est égale à la valeur du joueur et la valeur maximale est ajoutée à 200% de la portée.

mid-high

75

95

Soustrait 50% de la plage pour le min et ajoute 150% de la plage au max.

center

70

90

Centre la plage autour du rating du candidat.

mid-low

65

85

Soustrait 150% de la plage pour le minimum et ajoute 50% de la plage au maximum.

low

60

80

Garantit que les salons auront un skill rating <= à celui du candidat. Soustrait 200% de la plage de niveaux pour calculer le minimum, et conserve le maximum comme niveau du joueur.



Avez-vous trouvé la réponse à votre question ?