]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/world.qc
Fix #2850 "xonotic crashes when pressing restart level after match end in campaign"
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / world.qc
index cfaec58e38cd5dc17413cfa28b1d5d497d5c2d34..977f235715a90a90064d4a8f332f3dbd36595af1 100644 (file)
@@ -166,10 +166,14 @@ void cvar_changes_init()
        {
                k = bufstr_get(h, i);
 
-#define BADPREFIX(p) if(substring(k, 0, strlen(p)) == p) continue
-#define BADPRESUFFIX(p,s) if(substring(k, 0, strlen(p)) == p && substring(k, -strlen(s), -1) == s) continue
+#define BADPREFIX_COND(p) (substring(k, 0, strlen(p)) == p)
+#define BADSUFFIX_COND(s) (substring(k, -strlen(s), -1) == s)
+
+#define BADPREFIX(p) if(BADPREFIX_COND(p)) continue
+#define BADPRESUFFIX(p, s) if(BADPREFIX_COND(p) && BADSUFFIX_COND(s)) continue
 #define BADCVAR(p) if(k == p) continue
 #define BADVALUE(p, val) if (k == p && v == val) continue
+#define BADPRESUFFIXVALUE(p, s, val) if(BADPREFIX_COND(p) && BADSUFFIX_COND(s) && v == val) continue
 
                // general excludes and namespaces for server admin used cvars
                BADPREFIX("help_"); // PN's server has this listed as changed, let's not rat him out for THAT
@@ -232,6 +236,10 @@ void cvar_changes_init()
                BADCVAR("timeformat");
                BADCVAR("timestamps");
                BADCVAR("g_require_stats");
+               BADCVAR("g_chatban_list");
+               BADCVAR("g_playban_list");
+               BADCVAR("g_playban_minigames");
+               BADCVAR("g_voteban_list");
                BADPREFIX("developer_");
                BADPREFIX("g_ban_");
                BADPREFIX("g_banned_list");
@@ -255,8 +263,6 @@ void cvar_changes_init()
 
                // these can contain player IDs, so better hide
                BADPREFIX("g_forced_team_");
-               BADCVAR("sv_muteban_list");
-               BADCVAR("sv_voteban_list");
                BADCVAR("sv_allow_customplayermodels_idlist");
                BADCVAR("sv_allow_customplayermodels_speciallist");
 
@@ -285,6 +291,7 @@ void cvar_changes_init()
                BADCVAR("g_keyhunt");
                BADCVAR("g_keyhunt_teams");
                BADCVAR("g_lms");
+               BADCVAR("g_mayhem");
                BADCVAR("g_nexball");
                BADCVAR("g_onslaught");
                BADCVAR("g_race");
@@ -299,6 +306,12 @@ void cvar_changes_init()
                BADCVAR("g_tdm");
                BADCVAR("g_tdm_on_dm_maps");
                BADCVAR("g_tdm_teams");
+               BADCVAR("g_tka");
+               BADCVAR("g_tka_on_ka_maps");
+               BADCVAR("g_tka_on_tdm_maps");
+               BADCVAR("g_tka_teams");
+               BADCVAR("g_tmayhem");
+               BADCVAR("g_tmayhem_teams");
                BADCVAR("g_vip");
                BADCVAR("leadlimit");
                BADCVAR("nextmap");
@@ -376,10 +389,15 @@ void cvar_changes_init()
                BADCVAR("g_spawn_alloweffects");
                BADCVAR("g_tdm_point_leadlimit");
                BADCVAR("g_tdm_point_limit");
+               BADCVAR("g_mayhem_point_limit");
+               BADCVAR("g_mayhem_point_leadlimit");
+               BADCVAR("g_tmayhem_point_limit");
+               BADCVAR("g_tmayhem_point_leadlimit");
                BADCVAR("leadlimit_and_fraglimit");
                BADCVAR("leadlimit_override");
                BADCVAR("pausable");
                BADCVAR("sv_announcer");
+               BADCVAR("sv_autopause");
                BADCVAR("sv_checkforpacketsduringsleep");
                BADCVAR("sv_damagetext");
                BADCVAR("sv_db_saveasdump");
@@ -396,7 +414,6 @@ void cvar_changes_init()
                BADCVAR("w_prop_interval");
                BADPREFIX("chat_");
                BADPREFIX("crypto_");
-               BADPREFIX("gameversion");
                BADPREFIX("g_chat_");
                BADPREFIX("g_ctf_captimerecord_");
                BADPREFIX("g_hats_");
@@ -440,6 +457,7 @@ void cvar_changes_init()
                BADCVAR("g_ban_sync_uri");
                BADCVAR("g_buffs");
                BADCVAR("g_ca_teams_override");
+               BADCVAR("g_ca_prevent_stalemate");
                BADCVAR("g_ctf_fullbrightflags");
                BADCVAR("g_ctf_ignore_frags");
                BADCVAR("g_ctf_leaderboard");
@@ -453,6 +471,7 @@ void cvar_changes_init()
                BADCVAR("g_keyhunt_point_limit");
                BADCVAR("g_keyhunt_teams_override");
                BADCVAR("g_lms_lives_override");
+               BADCVAR("g_mayhem_powerups");
                BADCVAR("g_maplist");
                BADCVAR("g_maxplayers");
                BADCVAR("g_mirrordamage");
@@ -469,6 +488,8 @@ void cvar_changes_init()
                BADCVAR("g_start_delay");
                BADCVAR("g_superspectate");
                BADCVAR("g_tdm_teams_override");
+               BADCVAR("g_tmayhem_teams_override");
+               BADCVAR("g_tmayhem_powerups");
                BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
                BADCVAR("hostname");
                BADCVAR("log_file");
@@ -512,6 +533,9 @@ void cvar_changes_init()
                BADPREFIX("sv_info_");
                BADPREFIX("sv_ready_restart_");
 
+               BADPRESUFFIXVALUE("g_", "_weaponarena", "most");
+               BADPRESUFFIXVALUE("g_", "_weaponarena", "most_available");
+
                // mutators that announce themselves properly to the server browser
                BADCVAR("g_instagib");
                BADCVAR("g_new_toys");
@@ -523,6 +547,7 @@ void cvar_changes_init()
 #undef BADPREFIX
 #undef BADCVAR
 #undef BADVALUE
+#undef BADPRESUFFIXVALUE
 
                if(pureadding)
                {
@@ -660,15 +685,14 @@ void GameplayMode_DelayedInit(entity this)
                        int u = AVAILABLE_TEAMS - d;
                        map_minplayers += (u < d && u + map_minplayers <= m) ? u : -d;
                }
-               warmup_limit = -1;
        }
        else
-               map_minplayers = 0; // don't display a minimum if it's not used
+               map_minplayers = 0; // don't display a minimum if it's not used (g_maxplayers < 0 && g_warmup >= 0)
 }
 
 void InitGameplayMode()
 {
-       VoteReset();
+       VoteReset(false);
 
        // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds
        get_mi_min_max(1);
@@ -735,8 +759,7 @@ spawnfunc(worldspawn)
        {
                if (!server_is_dedicated)
                {
-                       // force unloading of server pk3 files when starting a listen server
-                       // localcmd("\nfs_rescan\n"); // FIXME: does more harm than good, has unintended side effects. What we really want is to unload temporary pk3s only
+                       // DP unloads dlcache pk3s before starting a listen server since https://gitlab.com/xonotic/darkplaces/-/merge_requests/134
                        // restore csqc_progname too
                        string expect = "csprogs.dat";
                        wantrestart = cvar_string("csqc_progname") != expect;
@@ -865,9 +888,6 @@ spawnfunc(worldspawn)
 
        GameRules_limit_fallbacks();
 
-       if(warmup_limit == 0)
-               warmup_limit = autocvar_timelimit * 60;
-
        player_count = 0;
        bot_waypoints_for_items = autocvar_g_waypoints_for_items;
        if(bot_waypoints_for_items == 1)
@@ -1038,6 +1058,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();
 }
@@ -1318,7 +1342,7 @@ void NextLevel()
 
        //pos = FindIntermission ();
 
-       VoteReset();
+       VoteReset(true);
 
        DumpStats(true);
 
@@ -2106,11 +2130,21 @@ void readlevelcvars()
 
        sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown");
 
-       warmup_stage = cvar("g_warmup");
-       warmup_limit = cvar("g_warmup_limit");
-
        if(cvar("g_campaign"))
                warmup_stage = 0; // no warmup during campaign
+       else
+       {
+               warmup_stage = autocvar_g_warmup;
+               if (warmup_stage < 0 || warmup_stage > 1)
+                       warmup_limit = -1; // don't start until there's enough players
+               else if (warmup_stage == 1)
+               {
+                       // this code is duplicated in ReadyCount()
+                       warmup_limit = cvar("g_warmup_limit");
+                       if(warmup_limit == 0)
+                               warmup_limit = autocvar_timelimit * 60;
+               }
+       }
 
        g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon");
        g_pickup_respawntime_superweapon = cvar("g_pickup_respawntime_superweapon");