Multiplayer: MMO using dedicated servers without online subsystems (EOS or Steam)

Hello there

I am on the way to make an mmo-like game. The server-client infrastructure I have in mind is as shown in the picture below .

The idea is that clients connect to a login server to a map called “start_map” and then retrieve player data like “characters” and its inventory from the database, which is managed by a node.js server. Each server (login server and world servers) shall be setup as dedicates servers.

Once the player has selected its character, the client will then travel with that character to a game world server (the server to connect to depends of whether its a new character or if the character has logged out on a world previously).

To connect to a game world server, the client uses ClientTravel and with it along, the character data such as inventory items, etc.

I have already setup the mongo db and the node.js server as well as the start_map in the editor successfully. Two clients can make HTTP (json) requests via the server to get data from the db.

Now I am struggling with the theory to going further on this. I have a few questions about this setup, if I try to build the server and clients, which I have not yet done or experimented with it:

  1. Is it possible to have the starter_map local for each player, but so that the clients can still communicate with the server to interact with the db (via server) to get player data? I would like to do it in this way, so that the player can’t see each other.

  2. Can I use ClientTravel on the clients to switch servers, if they are setup as dedicated server?

  3. Do I have to use an online subsystem here, or can this be achieved without a subsystem? The reason why I want to avoid a subsystem here is because I belive there is a player limit for the “lobby” or starter_map.

EDIT:
4) After studying the topic more in detail: What is difference “behind the scenes” betweens these three types of “servers”:

  • 4.1) I select “play as client” the editor sets up a server
  • 4.2) run a cmd and run a game instance with -server -log
  • 4.3) actually build a dedicated server and run it

I have found many answers regarding the standard cases such as creating sessions and then use server travel to switch to a different map. But since players should be able to travel between servers independently, I can not use server travel (I belive so).

I am thankful for any hints, links or experiences about this topic :slight_smile:

Take a look at Nakama for the player management part and Agones for the game server deployment.

Thanks for the inputs, I will have a look on them :slight_smile:

The idea is that clients connect to a login server to a map called “start_map” and then retrieve player data like “characters” and its inventory from the database, which is managed by a node.js server. Each server (login server and world servers) shall be setup as dedicates servers.

Once the player has selected its character, the client will then travel with that character to a game world server (the server to connect to depends of whether its a new character or if the character has logged out on a world previously).

To connect to a game world server, the client uses ClientTravel and with it along, the character data such as inventory items, etc.

Characters are not persistent. They will be destroyed along with the starter map. Only controllers are persistent.

Besides you don’t need a starter map to handle any of that. The game mode and game state can handle all of it.


The only limit to the number of players you have on any map is going to be based on the hardware of the server and the performance of the game on clients.

You definitely need to hit the docs.

Yes you’re right. I implemented it with the player controller, since they are presistent.

My intention with a separate map was, that player have a dedicated map which only displays the UI to handle character selection.

If I dont need a separate map, on which map would you handle the character selection? For a game mode, there needs to be a map. What I forgot to mention is that players can logout on any “World Server” map and when they log in back, they should spawn on the last logged out “World Server” map.

Thats why I think I need a “Login Server” map.

When a player joins a server the map isn’t instantaneously loaded. Map loading on a client takes time. Especially MMO sized maps. That’s the reason there are loading screens.

So on join, during the map loading process have character selection loaded. OR force character selection prior to join.

Yes, it’s likely you’ll want one or two client-only maps for “main menu/game loading” and perhaps “server selection” and “character creation/selection.”

Also, even if you “select” a server, that doesn’t mean you need to actually allocate a session on that server. What the player thinks of as a “server” isn’t the same thing as an Unreal Engine service process; if anything, it’s largely the database that stores the persistent data that’s the important part :slight_smile:

This is also important because the character you’re playing will come from the database that’s attached to your unreal engine server, and should hopefully match what the client sees in the character select screen :slight_smile: So there’s very likely some non-real-time networking going on before you get to the gameplay part. This could be traditional web services, or it could be some other kind of low-level networking that you build or buy.