]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_world.qc
Allow admins to change the announcer and CTF flag models without affecting purity
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_world.qc
index b0cd43455a9eee6cfbfb8e10dbd717e97cdc5589..8d1b58629cd7374f47eb304db066e8071c36d2d0 100644 (file)
@@ -338,6 +338,8 @@ void cvar_changes_init()
                BADCVAR("g_ctf_flag_glowtrails");
                BADCVAR("g_ctf_dynamiclights");
                BADCVAR("g_ctf_flag_pickup_verbosename");
+               BADPRESUFFIX("g_ctf_flag_", "_model");
+               BADPRESUFFIX("g_ctf_flag_", "_skin");
                BADCVAR("g_domination_point_leadlimit");
                BADCVAR("g_forced_respawn");
                BADCVAR("g_freezetag_point_leadlimit");
@@ -358,6 +360,7 @@ void cvar_changes_init()
                BADCVAR("leadlimit_and_fraglimit");
                BADCVAR("leadlimit_override");
                BADCVAR("pausable");
+               BADCVAR("sv_announcer");
                BADCVAR("sv_checkforpacketsduringsleep");
                BADCVAR("sv_damagetext");
                BADCVAR("sv_db_saveasdump");
@@ -398,6 +401,7 @@ void cvar_changes_init()
                //   :%s,//\([^ ]*\).*,BADCVAR("\1");,
                //   :%!sort
                // yes, this does contain some redundant stuff, don't really care
+               BADPREFIX("bot_ai_");
                BADCVAR("bot_config_file");
                BADCVAR("bot_number");
                BADCVAR("bot_prefix");
@@ -822,7 +826,7 @@ spawnfunc(worldspawn)
        // character set: ASCII 33-126 without the following characters: : ; ' " \ $
        if(autocvar_sv_eventlog)
        {
-               string s = sprintf("%d.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
+               string s = sprintf("%s.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
                matchid = strzone(s);
 
                GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
@@ -1071,7 +1075,8 @@ bool MapHasRightSize(string map)
        // open map size restriction file
        string opensize_msg = strcat("opensize ", map);
        float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
-       int pcount = player_count;
+       int player_limit = ((autocvar_g_maplist_sizes_count_maxplayers) ? GetPlayerLimit() : 0);
+       int pcount = ((player_limit > 0) ? min(player_count, player_limit) : player_count); // bind it to the player limit so that forced spectators don't influence the limits
        if(!autocvar_g_maplist_sizes_count_bots)
                pcount -= currentbots;
        if(fh >= 0)
@@ -1104,7 +1109,7 @@ string Map_Filename(float position)
 
 void Map_MarkAsRecent(string m)
 {
-       cvar_set("g_maplist_mostrecent", strwords(strcat(m, " ", autocvar_g_maplist_mostrecent), max(0, autocvar_g_maplist_mostrecent_count)));
+       cvar_set("g_maplist_mostrecent", strwords(cons(m, autocvar_g_maplist_mostrecent), max(0, autocvar_g_maplist_mostrecent_count)));
 }
 
 float Map_IsRecent(string m)
@@ -1705,8 +1710,6 @@ void ShuffleMaplist()
        cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
 }
 
-float leaderscore;
-float secondscore;
 int fragsleft_last;
 float WinningCondition_Scores(float limit, float leadlimit)
 {
@@ -1735,61 +1738,41 @@ float WinningCondition_Scores(float limit, float leadlimit)
                limit = -limit;
        }
 
-       if(WinningConditionHelper_zeroisworst
-               || (!autocvar_leadlimit_and_fraglimit && limit && leadlimit >= fabs(limit)))
+       if(WinningConditionHelper_zeroisworst)
                leadlimit = 0; // not supported in this mode
 
        if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
-       // these modes always score in increments of 1, thus this makes sense
        {
-               if (leaderscore != WinningConditionHelper_topscore ||
-                       secondscore != WinningConditionHelper_secondscore)
-               {
-                       int fragsleft = 0;
-
-                       leaderscore = WinningConditionHelper_topscore;
-                       secondscore = WinningConditionHelper_secondscore;
+               float fragsleft = FLOAT_MAX, leadingfragsleft = FLOAT_MAX;
+               if (limit)
+                       fragsleft = limit - WinningConditionHelper_topscore;
+               if (leadlimit)
+                       leadingfragsleft = WinningConditionHelper_secondscore + leadlimit - WinningConditionHelper_topscore;
 
-                       if (limit)
-                       {
-                               if (leaderscore == limit - 1)
-                                       fragsleft |= BIT(1);
-                               else if (leaderscore == limit - 2)
-                                       fragsleft |= BIT(2);
-                               else if (leaderscore == limit - 3)
-                                       fragsleft |= BIT(3);
-                       }
-                       if (leadlimit)
-                       {
-                               if (leaderscore == leadlimit + secondscore - 1)
-                                       fragsleft |= BIT(1);
-                               else if (leaderscore == leadlimit + secondscore - 2)
-                                       fragsleft |= BIT(2);
-                               else if (leaderscore == leadlimit + secondscore - 3)
-                                       fragsleft |= BIT(3);
-                       }
-
-                       fragsleft = fragsleft & -fragsleft; // least significant bit where 1 is set
+               if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
+                       fragsleft = max(fragsleft, leadingfragsleft);
+               else
+                       fragsleft = min(fragsleft, leadingfragsleft);
 
-                       if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
-                       {
-                               if (fragsleft & BIT(1))
-                                       Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
-                               else if (fragsleft & BIT(2))
-                                       Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
-                               else if (fragsleft & BIT(3))
-                                       Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
-
-                               fragsleft_last = fragsleft;
-                       }
+               if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
+               {
+                       if (fragsleft == 1)
+                               Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
+                       else if (fragsleft == 2)
+                               Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
+                       else if (fragsleft == 3)
+                               Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
+
+                       fragsleft_last = fragsleft;
                }
        }
 
        bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit);
-       bool leadlimit_reached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
+       bool leadlimit_reached = (leadlimit && WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
 
        bool limit_reached;
-       if(autocvar_leadlimit_and_fraglimit)
+       // only respect leadlimit_and_fraglimit when both limits are set or the game will never end
+       if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
                limit_reached = (fraglimit_reached && leadlimit_reached);
        else
                limit_reached = (fraglimit_reached || leadlimit_reached);