Could we have an updating method where it doesn’t kick anyone, but instead locks outdated servers?
With this, joining players would only join new and updated servers, where as the old server can continue until every player has eventually left. This works especially great in experiences that use multiple places.
Alternatively, could we get API that allows us to lock a server with a script and prevent joining? I would actually like this API regardless of the previous question.
This can technically be implemented with MessagingService APIs. You would need to have every server listen to an update message. When you update the game, just send the update message to all servers. When a server relieves the message, you can then just connect an event to auto-kick any new players attempting to join.
Yes, but that’s not ideal. Also, you’d want to use MemoryStoreService as MessagingService is extremely limited (due to having experience wide limits, which appears to be the only service that has such a limitation). The issue with that though is that players can still attempt to connect to a server that’s meant to be closing or locked, and this is especially true if it’s a player trying to join their friend or a specific server.
I’m fully aware that it’s possible to create a custom system, and an even better one using ReservedServers, however I am looking for an official built-in system. This is something I know Roblox would consider as they’re already implementing an official built-in banning system, despite there already being custom ways of doing that.
I think this implementation of prewarming is awesome; Players being able to rejoin the same server with the same people is really cool. Although I do think it would be good to warn players with a coregui that their server is about to be closed.
Thank goodness! I never saw a reason to have both “shut down all servers” and the ability to private your game at the same time. Looks like I don’t have to use a system like SoftShutdown anymore and use the migrate to new update button instead.
@heedicalking Your ideal method sounds like exactly what Migrate (renamed to Restart Servers for Updates) does. Can you read the newly updated docs and let me know what’s different from your ideal method?
@Mimi_Dev You have up to 30 seconds for your BindToClose callbacks to complete before we shut down the server - are there cases where that’s not enough time to save some datastore values before teleporting players or letting them auto-reconnect? For the teleport data - you’d have to do your own teleport to pass it along rather than relying on auto-reconnect. Doing a regular matchmade teleport will be enough to keep players together post-update - we’re keeping them together behind the scenes
@BillB1ox the documentation has already been updated! Take a look and let us know if the difference is still not clear
@KadenBloxYT Privating a game kicks all players. However, can you clarify why you want to do that? It will severely harm your player count on your game compared to just kicking players that are on the old version
@Waccars You don’t need to shutdown servers individually. That’s what Migrate to Latest Update / Restart Servers for Update is for
@heedicalking@KepIar@Redridge@MightyDantheman
Thanks for all the feedback! Looks like the ability to stop allowing joins to an existing server is the most requested improvement. We chatted within the team and added this to our roadmap for 2024!
“Restart servers for updates” doesn’t seem to account for the fact that each server in my game is running a match that may last anywhere from 10-30 minutes. If players are currently fighting, I don’t want to eject them all mid-round. They don’t get end-of-round bonuses or the satisfaction of winning. I don’t want to mass end every server at once, I only want to end/update them once they’re ready. Nothing is more frustrating for a player than getting kicked in the middle of having fun.
How my current system works is that the server ‘shut downs’ only after the match ends. (it doesnt actually shut down just kicks everyone and autokicks new joiners because there is no actual shutdown API). They are then teleported to a ‘waiting zone’ place and then teleported back at the mercy of teleportservice.
Both issues would be easily resolved with being able to shutdown/disable joins (through an API) and reserve a new public server
We aren’t worried about BindToClose not being complete when the server shuts down. The main issue is that when the new server starts up, if we fetch the player’s datastore and it isn’t done being saved (large datastores can take several minutes), we’ll fetch out of date information and then overwrite the datastore with it. We had this issue when teleporting players between servers in our game. We actually had to prevent them from leaving the server until their data was done being saved.
I would love to see an additional option where we can prevent the joining of old servers and have players join the new servers when they press the play button WITHOUT shutting down the servers. This could be useful for bug fixes and small improvements.
It seems like there may be a potential bug with the migration feature? I just launched an update in my multi-place game and used the “Restart servers for updates” button to migrate the whole experience. Upon starting up again, some servers were on the latest version but appeared to be stuck in a “shutting down” state. These servers’ ages all aligned with the time I pressed “Restart servers for updates”.
My best guess is that game:BindToClose() functions may have been run on the brand new servers, but these new servers stayed alive. I have a BindToClose function which marks the server as shutting down and prevents any more new rounds from starting. There were absolutely no errors, so that’s the only explanation I can think of.
When I instead did “Shut Down All Servers” shortly after that, all the servers were back in working order, and the game’s metrics recovered.
Concurrent players for one of the game’s sub-places - after the update launched and I restarted servers for updates, concurrents went way down for an extended time because rounds weren’t starting on these servers, and I was trying to figure out the root cause. After I fully shut down all servers again ~30 minutes later, you can see the player count immediately recover.
Normally there is an intermission timer for the next round, but the server has just ceased to run any more rounds, leading me to believe it’s in the “shutting down” state.
Sorry I don’t have a smaller-scale repro, since this happened just now and I was of course rushing to just get the servers working again.
One question I have is whether or not Experience-wide “Migrate to Latest Update” teleports players back to the places in which they were playing or back to the start place. There are genuine use cases where the former would be undesirable or even game breaking, and would still leave a purpose for the “Shut Down all Servers” option to force people back to the start place.
I too would find this option extremely useful. Sometimes an update is between minor (let servers naturally shut down) and major (migrate players to latest update), in which case this option would be perfect.