From 2b7e1384ed84b8017a3889da9c308fd9a5fa7541 Mon Sep 17 00:00:00 2001 From: JugadorXEI Date: Sun, 26 Oct 2025 01:39:59 +0000 Subject: [PATCH] Fix node 0 being occupied by a bot in dedicated servers for clients --- src/d_clisrv.c | 11 +++++++++++ src/d_clisrv.h | 5 ++++- src/d_main.cpp | 2 ++ src/i_tcp.c | 1 + src/k_bot.cpp | 9 ++------- src/sdl/i_net.c | 1 + src/win32ce/win_main.c | 1 + 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index cb5a11714..1166b3c99 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -105,6 +105,7 @@ boolean server = true; // true or false but !server == client #define client (!server) boolean nodownload = false; boolean serverrunning = false; +boolean connectedtodedicated = false; INT32 serverplayer = 0; char motd[254], server_context[8]; // Message of the Day, Unique Context (even without Mumble support) @@ -1271,6 +1272,7 @@ static boolean SV_SendServerConfig(INT32 node) netbuffer->u.servercfg.gamestate = (UINT8)gamestate; netbuffer->u.servercfg.gametype = (UINT8)gametype; netbuffer->u.servercfg.modifiedgame = (UINT8)modifiedgame; + netbuffer->u.servercfg.dedicated = (boolean)dedicated; netbuffer->u.servercfg.maxplayer = (UINT8)(min((dedicated ? MAXPLAYERS-1 : MAXPLAYERS), cv_maxconnections.value)); netbuffer->u.servercfg.allownewplayer = cv_allownewplayer.value; @@ -2502,6 +2504,7 @@ static void Command_connect(void) // we don't request a restart unless the filelist differs server = false; + connectedtodedicated = false; // Get the server node. if (netgame) @@ -2761,6 +2764,7 @@ void CL_Reset(void) multiplayer = false; servernode = 0; server = true; + connectedtodedicated = false; doomcom->numnodes = 1; doomcom->numslots = 1; SV_StopServer(); @@ -4274,6 +4278,11 @@ boolean Playing(void) return (server && serverrunning) || (client && cl_mode == CL_CONNECTED); } +boolean InADedicatedServer(void) +{ + return Playing() && (dedicated || connectedtodedicated); +} + boolean SV_SpawnServer(void) { #ifdef TESTERS @@ -4376,6 +4385,7 @@ void SV_StartSinglePlayerServer(INT32 dogametype, boolean donetgame) { INT32 lastgametype = gametype; server = true; + connectedtodedicated = false; multiplayer = (modeattacking == ATTACKING_NONE); joinedIP[0] = '\0'; // Make sure to empty this so that we don't save garbage when we start our own game. (because yes we use this for netgames too....) @@ -5002,6 +5012,7 @@ static void HandlePacketFromAwayNode(SINT8 node) G_SetGametype(netbuffer->u.servercfg.gametype); modifiedgame = netbuffer->u.servercfg.modifiedgame; + connectedtodedicated = netbuffer->u.servercfg.dedicated; memcpy(server_context, netbuffer->u.servercfg.server_context, 8); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 4fb07fbb9..0a010f159 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -231,6 +231,7 @@ struct serverconfig_pak UINT8 gametype; UINT8 modifiedgame; + boolean dedicated; char server_context[8]; // Unique context id, generated at server startup. @@ -465,7 +466,7 @@ struct doomdata_t client3cmd_pak client3pak; // 264 bytes(?) client4cmd_pak client4pak; // 324 bytes(?) servertics_pak serverpak; // 132495 bytes (more around 360, no?) - serverconfig_pak servercfg; // 773 bytes + serverconfig_pak servercfg; // 777 bytes UINT8 textcmd[MAXTEXTCMD+2]; // 66049 bytes (wut??? 64k??? More like 258 bytes...) char filetxpak[sizeof (filetx_pak)];// 139 bytes char fileack[sizeof (fileack_pak)]; @@ -558,6 +559,7 @@ extern boolean server; extern boolean serverrunning; #define client (!server) extern boolean dedicated; // For dedicated server +extern boolean connectedtodedicated; // Client that is connected to a dedicated server. extern UINT16 software_MAXPACKETLENGTH; extern boolean acceptnewnode; extern SINT8 servernode; @@ -670,6 +672,7 @@ void CL_UpdateServerList(void); void CL_TimeoutServerList(void); // Is there a game running boolean Playing(void); +boolean InADedicatedServer(void); // Advance client-to-client pubkey verification flow void UpdateChallenges(void); diff --git a/src/d_main.cpp b/src/d_main.cpp index f0edc5a2a..ad77a58cb 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -864,6 +864,7 @@ void D_SRB2Loop(void) if (dedicated) server = true; + connectedtodedicated = dedicated; // Pushing of + parameters is now done back in D_SRB2Main, not here. @@ -1597,6 +1598,7 @@ void D_SRB2Main(void) // for dedicated server dedicated = M_CheckParm("-dedicated") != 0; + connectedtodedicated = dedicated; if (dedicated) { usedTourney = true; diff --git a/src/i_tcp.c b/src/i_tcp.c index 35f071d95..f4c753740 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -1229,6 +1229,7 @@ boolean I_InitTcpNetwork(void) if (M_CheckParm("-server") || dedicated) { server = true; + connectedtodedicated = dedicated; // If a number of clients (i.e. nodes) is specified, the server will wait for the clients // to connect before starting. diff --git a/src/k_bot.cpp b/src/k_bot.cpp index d5359257d..9ebf8777a 100644 --- a/src/k_bot.cpp +++ b/src/k_bot.cpp @@ -227,7 +227,7 @@ void K_UpdateMatchRaceBots(void) { const UINT16 defaultbotskin = R_BotDefaultSkin(); UINT8 difficulty; - UINT8 pmax = (dedicated ? MAXPLAYERS-1 : MAXPLAYERS); + UINT8 pmax = (InADedicatedServer() ? MAXPLAYERS-1 : MAXPLAYERS); UINT8 numplayers = 0; UINT8 numbots = 0; UINT8 numwaiting = 0; @@ -343,12 +343,7 @@ void K_UpdateMatchRaceBots(void) if (numbots < wantedbots) { // We require MORE bots! - UINT8 newplayernum = 0; - - if (dedicated) - { - newplayernum = 1; - } + UINT8 newplayernum = InADedicatedServer() ? 1 : 0; // Rearrange usable bot skins list to prevent gaps for randomised selection if (tutorialchallenge == TUTORIALSKIP_INPROGRESS) diff --git a/src/sdl/i_net.c b/src/sdl/i_net.c index ed8990559..c297f52a4 100644 --- a/src/sdl/i_net.c +++ b/src/sdl/i_net.c @@ -358,6 +358,7 @@ boolean I_InitNetwork(void) if (M_CheckParm("-server") || dedicated) { server = true; + connectedtodedicated = dedicated; // If a number of clients (i.e. nodes) is specified, the server will wait for the clients // to connect before starting. diff --git a/src/win32ce/win_main.c b/src/win32ce/win_main.c index 8a1b4eca3..cd1649400 100644 --- a/src/win32ce/win_main.c +++ b/src/win32ce/win_main.c @@ -260,6 +260,7 @@ static inline VOID OpenTextConsole(void) HANDLE ci, co; const BOOL tco = M_CheckParm("-console") != 0; dedicated = M_CheckParm("-dedicated") != 0; + connectedtodedicated = dedicated; if (!(dedicated || tco)) return; FreeConsole();