From 5cf55b8271fd02c28efb52ed7ec6f2177dd32afe Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Thu, 2 Jan 2025 19:02:26 -0800 Subject: [PATCH] Server: load singleplayer.dat or deathmatch.dat when appropriate in RuleC_Init --- base/src/server/main.qc | 10 ---------- src/server/NSGameRules.h | 3 ++- src/server/NSGameRules.qc | 19 +++++-------------- src/server/entry.qc | 5 +---- src/server/scripts.qc | 13 ++++++++++--- 5 files changed, 18 insertions(+), 32 deletions(-) diff --git a/base/src/server/main.qc b/base/src/server/main.qc index c6d64380..e4bfd9bb 100644 --- a/base/src/server/main.qc +++ b/base/src/server/main.qc @@ -3,13 +3,3 @@ Game_Worldspawn(void) { } - -void -Game_InitRules(void) -{ - if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { - g_grMode = ncGameRules::InitFromProgs("progs/singleplayer.dat"); - } else { - g_grMode = ncGameRules::InitFromProgs("progs/deathmatch.dat"); - } -} diff --git a/src/server/NSGameRules.h b/src/server/NSGameRules.h index baaed4c7..bcd48406 100644 --- a/src/server/NSGameRules.h +++ b/src/server/NSGameRules.h @@ -121,7 +121,7 @@ public: /** Returns the title of the gamemode running. */ virtual string Title(void); - nonvirtual ncGameRules InitFromProgs(string pathToProgs); + nonvirtual ncGameRules CreateRules(void); /* spectator */ /* @@ -139,6 +139,7 @@ private: /* our currently running mode */ ncGameRules g_grMode; var float g_ruleCProgs; +var string g_ruleCName; #define CGameRules ncGameRules #define RULEMAP(x, y, z) x.y = externvalue(g_ruleCProgs, z); if (!x.y) { x.y = ncGameRules::y; } diff --git a/src/server/NSGameRules.qc b/src/server/NSGameRules.qc index eb46c831..e37f3c14 100644 --- a/src/server/NSGameRules.qc +++ b/src/server/NSGameRules.qc @@ -418,27 +418,17 @@ ncGameRules::ChatMessageTeam(ncClient cl, string strMessage) string ncGameRules::Title(void) { - string gameType = cvars.GetString("g_gametype"); - - if (STRING_SET(gameType)) { - return gameType; + if (STRING_SET(g_ruleCName)) { + return g_ruleCName; } return "Default"; } ncGameRules -ncGameRules::InitFromProgs(string pathToProgs) +ncGameRules::CreateRules(void) { - ncGameRules newRule; - - /* No progs .dat, exit out */ - if (fileExists(pathToProgs) == false) { - NSError("Progs at %S does not exist.", pathToProgs); - return (__NULL__); - } - - newRule = spawn(ncGameRules); + ncGameRules newRule = spawn(ncGameRules); if (g_ruleCProgs) { RULEMAP(newRule, ClientCommand, "CodeCallback_ClientCommand") @@ -460,5 +450,6 @@ ncGameRules::InitFromProgs(string pathToProgs) RULEMAP(newRule, Title, "CodeCallback_Title") } + serverinfo.SetString("mode", newRule.Title()); return (newRule); } diff --git a/src/server/entry.qc b/src/server/entry.qc index 4ba1743a..764b7482 100644 --- a/src/server/entry.qc +++ b/src/server/entry.qc @@ -402,10 +402,7 @@ initents(void) BodyQue_Init(); - if (!g_grMode) { - Game_InitRules(); - serverinfo.SetString("mode", g_grMode.Title()); - } + g_grMode = ncGameRules::CreateRules(); Game_Worldspawn(); Decals_Init(); diff --git a/src/server/scripts.qc b/src/server/scripts.qc index 8391b245..ba58b4ab 100644 --- a/src/server/scripts.qc +++ b/src/server/scripts.qc @@ -51,7 +51,15 @@ void RuleC_Init(void) { string gameType = cvars.GetString("g_gametype"); - string pathToProgs = strcat("progs/", gameType, ".dat"); + string pathToProgs; + + if (!STRING_SET(gameType)) { + bool isCoop = cvars.GetBool("coop"); + bool isSingle = (cvars.GetInteger("sv_playerslots") <= 1) ? (true) : (false); + g_ruleCName = gameType = (isSingle || isCoop) == (true) ? "singleplayer" : "deathmatch"; + } + + pathToProgs = strcat("progs/", gameType, ".dat"); /* No progs .dat, exit out */ if (fileExists(pathToProgs) == false) { @@ -72,8 +80,7 @@ RuleC_Init(void) } else { NSError("%S does not have a main function.", pathToProgs); } - } - + } } void