]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Implement autopause for empty dedicated servers
authorbones_was_here <bones_was_here@xonotic.au>
Tue, 14 Mar 2023 11:48:38 +0000 (21:48 +1000)
committerbones_was_here <bones_was_here@xonotic.au>
Tue, 14 Mar 2023 14:47:13 +0000 (00:47 +1000)
qcsrc/server/client.qc
qcsrc/server/main.qc
qcsrc/server/main.qh
qcsrc/server/world.qc
xonotic-server.cfg

index 5b7509e484d5fecec7e6f49a852de6ea218e39e9..f78d772c5d0f363a377e86c7650b7f071faaf0eb 100644 (file)
@@ -1188,7 +1188,11 @@ void ClientConnect(entity this)
        MUTATOR_CALLHOOK(ClientConnect, this);
 
        if (player_count == 1)
+       {
+               if (autocvar_sv_autopause && server_is_dedicated)
+                       setpause(0);
                localcmd("\nsv_hook_firstjoin\n");
+       }
 }
 /*
 =============
index 2b29422b8969362356b6a552106158c9b881d0e7..bb75f5aa2f39e0acfd22eb55754db159a3b3eb18 100644 (file)
@@ -186,6 +186,12 @@ void CreatureFrame_All()
        });
 }
 
+void Pause_TryPause_Dedicated(entity this)
+{
+       if (player_count == 0)
+               setpause(1);
+}
+
 void Pause_TryPause(bool ispaused)
 {
        int n = 0;
@@ -268,7 +274,6 @@ Called before each frame by the server
 
 bool game_delay_last;
 
-bool autocvar_sv_autopause = false;
 void systems_update();
 void sys_phys_update(entity this, float dt);
 void StartFrame()
index ed095ba485ec56a78b603a59b9919d2e12875adf..30b6864716063cdd5f62c31159ac2e3c71b5c575 100644 (file)
@@ -16,6 +16,9 @@ bool autocvar_g_balance_falldamage_onlyvertical;
 #define autocvar_slowmo cvar("slowmo")
 float autocvar_sys_ticrate;
 
+bool autocvar_sv_autopause;
+void Pause_TryPause_Dedicated(entity this);
+
 bool dropclient_schedule(entity this);
 
 /** print(), but only print if the server is not local */
index c04b188fa4cd6addfb74e65809b6e2522d56c11f..defb079c7c1046176a24aac58ebd50b215cbe34d 100644 (file)
@@ -387,6 +387,7 @@ void cvar_changes_init()
                BADCVAR("leadlimit_override");
                BADCVAR("pausable");
                BADCVAR("sv_announcer");
+               BADCVAR("sv_autopause");
                BADCVAR("sv_checkforpacketsduringsleep");
                BADCVAR("sv_damagetext");
                BADCVAR("sv_db_saveasdump");
@@ -1043,6 +1044,10 @@ spawnfunc(worldspawn)
 
        WinningConditionHelper(this); // set worldstatus
 
+       if (autocvar_sv_autopause && server_is_dedicated && !wantrestart)
+               // INITPRIO_LAST is to soon: bots either didn't join yet or didn't leave yet, see: bot_fixcount()
+               defer(this, 5, Pause_TryPause_Dedicated);
+
        world_initialized = 1;
        __spawnfunc_spawn_all();
 }
index 82cccae0f3b324fdcf0ce8ee999962c54772f483..511887ec14ed8cbff08d500300a3d66f3d8ee5ec 100644 (file)
@@ -51,6 +51,8 @@ set sv_timeout_number 2 "how many timeouts one player is allowed to call (gets r
 set sv_timeout_leadtime 4 "how long the players will be informed that a timeout was called before it starts, in seconds"
 set sv_timeout_resumetime 3 "how long the remaining timeout-time will be after a player called the timein command"
 
+set sv_autopause 0 "Single player: pause while the menu or console is open. Dedicated server: pause after starting a map if the server is empty and unpause when the first player joins the empty server."
+
 set g_telefrags 1 "telefragging, i.e. killing someone who stands in the way of someone who is teleporting"
 set g_telefrags_teamplay 1 "never telefrag team mates"
 set g_telefrags_avoid 1 "when teleporters have a random destination, avoid teleporting to locations where a telefrag would happen"