API to Determine if Server is console locked (CrossPlay Disabled)

As a Roblox developer, it is currently too hard to make a game where server specific data is saved to a specific place when Console access is enabled due to the inability to ensure a one-to-one relationship between a “custom server” and a Roblox server when CrossPlay is disabled. This limitation leads to scenarios where multiple Roblox servers are unintentionally created for the same custom server, causing data overlap and inconsistency.

As it is today, if we made a custom server list with predefined server names, say Red Server and Blue Server and in a game, we allow players to build bases in either Red Server or Blue Server. We need to guarantee that we only have, at most, one Roblox Server per Custom Server. This is not currently possible due to how “CrossPlay Disabled” cannot play with players from other platforms.

Scenario 1:

  • Red Server has 0 players in it, Player 1 joins via PC. Server list asks Roblox to start a new Roblox server - Roblox Server 1.
  • Roblox Server 1 is now mapped to Red Server.
  • Player 2 attempts to join Red Server via Xbox, with CrossPlay Disabled.
  • Server list asks Roblox to teleport player into Roblox Server 1.
  • Roblox starts a new server Roblox Server 2 since Player 2 cannot play with Player 1.
  • Roblox Server 2 is now mapped to Red Server.

In this scenario, we have two Roblox servers mapped to our custom server. Why is this a problem? Both servers are saving data to the Red Server Id, thus overwriting each other.

  • Inability to maintain server-specific data integrity.
  • Forced segregation of players based on their gaming platform.
  • Complexity in providing a unified gaming experience across platforms.

Scenario 2:

  • Blue Server has 0 players in it, Player 3 joins via Xbox with CrossPlay Disabled. Server list asks Roblox to start a new Roblox server - Roblox Server 3.
  • Roblox Server 3 is now mapped to Blue Server.
  • Player 4 attempts to join Blue Server via PlayStation, with CrossPlay Disabled.
  • Server list asks Roblox to teleport player into Roblox Server 3.
  • Roblox starts a new server Roblox Server 4 since Player 4 cannot play with Player 3.
  • Roblox Server 4 is now mapped to Blue Server.
  • Player 5 attempts to join Blue Server via PC.
  • Server list asks Roblox to teleport player into Roblox Server 3.
  • Roblox starts a new server Roblox Server 5 since Player 5 cannot play with Player 3.
  • Player 6 attempts to join Blue Server via PlayStation.
  • Server list asks Roblox to teleport player into Roblox Server 3.
  • Roblox starts a new server Roblox Server 6 since Player 6 cannot play with Player 3.
  • Use can repeat infinitely. Only players who get the same server must be on the same platform as Player 3.

In this scenario, we have a problem where only Xbox players can play with each other, and we have at least 4 servers all mapped back to Blue Server, all overwriting each other.

There are plenty more obvious issues with this system. As it is today, since we now have Xbox and PlayStation the problem is significantly worse since we can’t just send our Console players into their own game anymore, CrossPlay disabled Xbox players cannot join PlayStation players, etc.

There are numerous past requests for something like this as well:

Currently the lack of API to determine that a server was started by a player with CrossPlay disabled is pushing many developers away from allowing Console access.

If this issue is addressed, it would improve my development experience because it solves a very complex problem for developers, that I don’t believe can be solved today.

Addressing this issue could significantly enhance the development process by enabling developers to direct players with CrossPlay disabled to appropriate servers. This would not only simplify data management but also improve the gaming experience for console players by providing them with tailored server options. Implementing a feature to identify servers with CrossPlay disabled could resolve these challenges with minimal effort from Roblox’s side, benefiting both developers and players alike.

57 Likes

An alternative point to the same issue above, adding an ability for us to check if a user is a cross-play disabled user would allow us to better handle what to do with them when they try to join our games. As it is right now we cannot create a static server-list for our games that also are open to console players to join. The question by Roblox might be asked then about why this is necessary when Roblox’s mission is to create a unified gaming experience for everyone. I think this is an exception, because it limits a very critical design choice for our game and prevents us from creating the type of experience we want to make on the platform.

With an API to see who has disabled crossplay, we can better serve a user a server-list with only options he is able to join, which then improves not only his experience playing our game, but all players.

18 Likes

I replied in the third linked thread but we’re currently looking into solutions for this

5 Likes

This is very much needed for us. And as soon as possible. In our game Aftermath we maintain a static serverlist, depicting which servers are able to be joined. This creates many problems, but for the type of game we are making, this is necessary.

The problem is the same as above in the OP. We have a workaround, but it is not perfect, and causes headaches for some players.

We need to maintain 3 serverlists:

  1. Crossplay enabled
  2. XBOX only
  3. Playstation only

There are 2 problems:

  1. No way to check if you have crossplay enabled or not
  2. No way to check if you are XBOX/Playstation

How do we fix problem #1?

  • When the FIRST PLAYER joins the server, we ask their client if they are on console (IsTenFootInterface)
  • If this is false, we can mark this server as a crossplay enabled server, and no further checks are required.
  • If this is true, we then teleport the player to a junk place instance and examine the teleport error
  • If the error message from teleporting contains the text “cross play”, then we know that this player is on a crossplay disabled server

How do we fix problem #2?

  • Ask the client what the image id is for a gamepad button.
  • If it returns an image that contains the text “PlayStation”, we then know they are a playstation player.
  • If we get an image id that contains the text “Xbox”, we know they are an xbox player.

Why these are terrible?

  • With problem #1, Playstation players are NOT given the same teleport error as XBOX players, so we cannot reliably check if Playstation players have crossplay enabled or not.
  • With problem #2, The image Ids returned are based on the controller that is plugged in. What happens if you use a non playstation controller on a playstation? What happens if you use a non xbox controller on an xbox? How can we know the platform?
4 Likes

Thank you for providing more context on how this issue manifests and how you’ve been working around it. I don’t have much experience with matchmaking or maintaining game servers, so may I ask a few questions to clarify my understanding?

  1. As a developer, when a player joins your experience, are you able to determine which server in your server list to send the player to? This appears to be what you are currently doing.

  2. When a player joins your experience and before they are redirected to a server:

  • Do you have access to their Player object? I would guess this is the case if people have been proposing adding a Player:GetCrossplayEnabled() setting.
  • Do you have access to services from game:GetService()?
  1. Matchmaking has informed me that we can provide an identifier based on a user’s matchmaking context. This id has three options:
    1. Default (PC, Mobile, crossplay-enabled)
    2. Xbox Only
    3. PlayStation Only
  • If you had access to this id, would it solve your problem?
  • Is the Player object the most convenient place to access this information?

Do note that if we are to make a change like this, it has to go through an API review process on top of the work for the change, so it will take some time.

6 Likes
  1. We provide the player with the serverlist. They get to choose which server to join. For examples, look to games like CSGO community serverlist, or TF2 community serverlist, or Dayz serverlist, or Rust Serverlist. This is the type of system we have built out. We have “static” servers, in a list, and let the player join any server from the list. This is so that the state of the server is always the same as they left it.

  2. I do not think simply having a GetCrossplayEnabled function would suffice, because of the issue differentiating between XBOX and Playstation servers. If we only know they have crossplay disabled, then we cannot serve the player a serverlist for only their platform.

  3. This seems like the best approach for us. These three settings would cover all cases for us to adequately serve the players the correct serverlist for them to choose from.

The player object is convenient, yes. Even if it is locked to server-only, as the server is the one serving the player with the serverlist.

4 Likes

In your specific case of the static server list, how would you be using the matchmaking context identifier? Would you filter out servers that the player can’t join, prevent them from teleporting to the server, or something else?

1 Like

When a client wishes to view the serverlist, he makes a request to the server. The server gathers a list of servers that client has access to view, and sends it back.

Today, we use our hacky workaround to try to figure out which players are Xbox/PS5 players, and whether or not crossplay is enabled. These factors are then used when filtering the serverlist.

With the proposed API you mentioned, I would simply replace my hacky detections with the matchmaking context identifier, so that I can serve Xbox (crossplay disabled) players with only their servers, and same with PS5, etc.

4 Likes

After looking into the code some more, it seems that this matchmaking context id lives on the server-side config and isn’t currently a part of the current player config. What do you think of adding the matchmaking context id to the datamodel of the server, gotten with game.MatchmakingContextId instead of the Player object? Does it solve your problem still?

6 Likes

So long as every player in the server is bound to the same matchmaking context, then I think it does not make a difference to me.

If a server is marked as a “Crossplay enabled” server, then I would expect all players to be crossplay enabled players, and as such only able to join crossplay enabled servers. In which case, I can serve everyone in the server the same in-game serverlist.

3 Likes

Hello, some minor changes to the proposed API:

You will see a new Enum called MatchmakingType with three values: Default, XboxOnly, and PlayStationOnly, and the value will exist on the server DataModel via game.MatchmakingType.

More details to come once I am able to get code working, tested, approved, etc.

4 Likes

Sounds fantastic. Do you have a rough timeline to when we can play around with it? This quarter? Next?

I’ve made some changes which seem to work, but I honestly have no idea whether it will work in the larger scope of matchmaking. I need some more feedback from the engine folks that understand how the server & matchmaking logic works before I can be sure of my solution. That said, I really can’t imagine this change being that hard to make, so I’m hoping this’ll be available by the end of this quarter.

4 Likes