From 4d89d35a6deff3ec1c9f3edd2310af86ab2a94a3 Mon Sep 17 00:00:00 2001 From: serge_shubin Date: Mon, 23 Mar 2026 06:15:31 +0800 Subject: [PATCH] Send gamestate resend on map_restart (matches real server behavior) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A real map_restart sends SV_SendClientGameState to all clients, which triggers CL_ParseGamestate → CL_ClearState on the client, wiping all snapshot and entity history. Previously we only forced non-delta snapshots which doesn't clear cgame's entity state. Now we call SV_SendClientGameState for all active clients on the restart frame, exactly matching real server behavior. Co-Authored-By: Claude Opus 4.6 (1M context) --- code/server/server.h | 1 + code/server/sv_netdemo.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/server/server.h b/code/server/server.h index 3fd1106..6cfbc24 100644 --- a/code/server/server.h +++ b/code/server/server.h @@ -289,6 +289,7 @@ void SV_AuthorizeIpPacket( netadr_t from ); void SV_ExecuteClientMessage( client_t *cl, msg_t *msg ); void SV_UserinfoChanged( client_t *cl ); +void SV_SendClientGameState( client_t *client ); void SV_ClientEnterWorld( client_t *client, usercmd_t *cmd ); void SV_DropClient( client_t *drop, const char *reason ); diff --git a/code/server/sv_netdemo.c b/code/server/sv_netdemo.c index a34486b..a6d0371 100644 --- a/code/server/sv_netdemo.c +++ b/code/server/sv_netdemo.c @@ -667,9 +667,12 @@ static qboolean SVD_ReadFrame( fileHandle_t f ) { Com_Memset( demo.playPrevEntities, 0, sizeof(demo.playPrevEntities) ); Com_Memset( demo.playPrevPlayers, 0, sizeof(demo.playPrevPlayers) ); svs.snapFlagServerBit ^= SNAPFLAG_SERVERCOUNT; + // send a full gamestate to all active clients — this makes + // CL_ParseGamestate → CL_ClearState wipe all snapshot/entity + // history, exactly like a real map_restart does. for ( j = 0; j < sv_maxclients->integer; j++ ) { if ( svs.clients[j].state >= CS_PRIMED ) { - svs.clients[j].deltaMessage = -1; + SV_SendClientGameState( &svs.clients[j] ); } } }