diff --git a/src/mpgame/Player.cpp b/src/mpgame/Player.cpp
--- a/src/mpgame/Player.cpp
+++ b/src/mpgame/Player.cpp
@@ -3550,6 +3550,21 @@ bool idPlayer::UserInfoChanged( void ) {
+	if ( IsBot() ) {
+		showWeaponViewModel = cvarSystem->GetCVarBool( "ui_showGun" );
+		// Bots have no join UI. Keep the normal server respawn path armed so
+		// CheckRespawns moves them from their initial spectator spawn into play.
+		initialJoinPending = false;
+		initialJoinSpectateApplied = false;
+		initialJoinMenuPending = false;
+		wantSpectate = false;
+		spectator = this->entityNumber;
+		if ( !gameLocal.isClient && spectating ) {
+			forceRespawn = true;
+		}
+		return false;
+	}
+
 	if ( IsFakeClient() ) {
 		showWeaponViewModel = cvarSystem->GetCVarBool( "ui_showGun" );
 		wantSpectate = true;
 		spectator = this->entityNumber;
 		return false;
 	}
