diff --git a/src/d_main.c b/src/d_main.c
index 2c02565dc0c7e1b1eadadda2a4d2ef6af1550627..d570ae356101688cd29d48657c3f062ef0adfcb0 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -1597,9 +1597,9 @@ void D_SRB2Main(void)
 	{
 		pagename = "TITLESKY";
 		levelstarttic = gametic;
-		G_SetGamestate(GS_LEVEL);
 		if (!P_SetupLevel(false))
 			I_Quit(); // fail so reset game stuff
+		G_SetGamestate(GS_LEVEL);
 	}
 
 #ifdef HAVE_DISCORDRPC
diff --git a/src/g_game.c b/src/g_game.c
index c6cb31b08402bdbab0b8077ca82d5d14cb5b8971..c6c6d63ff2969f61a7ad87832ca15f48380ced54 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1733,14 +1733,12 @@ void G_DoLoadLevel(boolean resetplayer)
 		Y_EndIntermission();
 	if (gamestate == GS_VOTING)
 		Y_EndVote();
-
-	G_SetGamestate(GS_LEVEL);
-
-	for (i = 0; i < MAXPLAYERS; i++)
-	{
-		if (resetplayer || (playeringame[i] && players[i].playerstate == PST_DEAD))
-			players[i].playerstate = PST_REBORN;
-	}
+	// Don't allow people to download a partial/corrupted
+	// save while the server's loading the map/during the wipe.
+	// (this addresses "map" command usage, which means
+	// transitions/different gamestates would be skipped.)
+	if (gamestate == GS_LEVEL)
+		gamestate = GS_WAITINGPLAYERS;
 
 	// Setup the level.
 	if (!P_SetupLevel(false))
@@ -1750,6 +1748,14 @@ void G_DoLoadLevel(boolean resetplayer)
 		return;
 	}
 
+	G_SetGamestate(GS_LEVEL);
+
+	for (i = 0; i < MAXPLAYERS; i++)
+	{
+		if (resetplayer || (playeringame[i] && players[i].playerstate == PST_DEAD))
+			players[i].playerstate = PST_REBORN;
+	}
+
 	if (!resetplayer)
 		P_FindEmerald();