Best way to jump between levels in one ds?

Hi, guys.

We’re currently developing a multi-player online game. Basically, we start a new dedicated server for each match, and destory the ds when match is over. Now we’re gonna develop a new, round-based gameplay. Each round might use the same level or a different level. I’m not pretty sure what’s the right way to go. :frowning:

The simplest way

is to just start a new ds for each round, then compute the score and other stuffs by a global service. It would work, but it’s a huge waste and kind of stupid. There must be a way to do it within one ds.

Seamless Travel

seems to be the right way to go. But I got lots of troubles with it, I can’t make the game runs correctly. In short, our client needs a hard-reset when changing levels(because we’ve customized some part of the Engine, so we need a LoadMap call on client to reset everything thoroughly).

The current solution for me is:

  1. Changing level with a non-seamless ServerTravel. A hard-reset, destroy and recreate all these stuffs including World, GameMode, GameState, PlayerController, net connection, etc.
  2. Creating a customized GameInstance class to persist all global data, like player infos, score, etc.

It seems to be promising, but I’m not so sure. Am I missing something?

Any help would be greatly appreciated! Thanks.

You could simply have a base level loaded that holds all the levels in it (As sub-streaming levels). Depending on the round are the streaming levels that get loaded and unloaded. If your level design (detail and concentration wise) has a similar flux to games like Overwatch, you should be fine.

Using this approach may increase the initial loading time but would suffice. Just keep in mind that this method would materialize in added ram usage at the beginning of every match.

Really appreciate your advice, thanks a million!

I also came up with a similar solution at the very beginning. But some coworkers argued that the client need a thorough reset, including PlayerController. So I decided to try the Travel mechanism to totally reset the World and Level.

That’s why it’s a sub-streaming level; so the loading and unloading of assets only happens at a local level (since all “arenas” were built at the level’s startup).

Let me know if this answers your question

Sorry, I think I didn’t make it clear enough.

What we expect is, to reset the whole World, GameMode, GameState, PlayerController, etc, but also keep the client-server connection and some other global data when changing the map.

Are talking about an implementation scale of Overwatch/Rainbow Six Siege /CS Go or something like Battlefield 5’s Grand Operations?

Yep, pretty like Rainbow Six actually.

My idea still applies.

In your Consistent Level, you keep all the required Data; Scores, etc. You need not to replace. PlayerControllers nor GameState nor any of that; You can create an additional actor to handle and store that data. At the end of the round, this actor exports the important data to the GameMode/Gamestate and then the next one is respawned. If you Load and Unload a streaming level, all the data specific to the level is reset (so like Siege’s destructible walls and what not would be reloaded). That way you always stay within the same consistent level.

Thanks a million :slight_smile: