]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_world.qc
Further cleanup of defs.qh
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_world.qc
index 650c249139596cc69df943e447000214f9293d84..9f78b6750431dee07f31e161a69eb4dac954774c 100644 (file)
 #include "command/sv_cmd.qh"
 #include "command/vote.qh"
 #include "g_hook.qh"
+#include <server/gamelog.qh>
+#include <server/g_damage.qh>
 #include "ipban.qh"
 #include "mapvoting.qh"
 #include <server/mutators/_mod.qh>
 #include "race.qh"
 #include "scores.qh"
 #include "scores_rules.qh"
+#include "spawnpoints.qh"
 #include "teamplay.qh"
 #include "weapons/weaponstats.qh"
 #include "../common/constants.qh"
 #include <common/net_linked.qh>
 #include "../common/deathtypes/all.qh"
+#include <common/gamemodes/_mod.qh>
 #include "../common/gamemodes/sv_rules.qh"
 #include "../common/mapinfo.qh"
 #include "../common/monsters/_mod.qh"
@@ -32,6 +36,7 @@
 #include "../common/playerstats.qh"
 #include "../common/stats.qh"
 #include "../common/teams.qh"
+#include <common/mapobjects/triggers.qh>
 #include "../common/mapobjects/trigger/secret.qh"
 #include "../common/mapobjects/target/music.qh"
 #include "../common/util.qh"
@@ -259,6 +264,7 @@ void cvar_changes_init()
                BADCVAR("g_ca");
                BADCVAR("g_ca_teams");
                BADCVAR("g_conquest");
+               BADCVAR("g_conquest_teams");
                BADCVAR("g_ctf");
                BADCVAR("g_cts");
                BADCVAR("g_dotc");
@@ -286,6 +292,8 @@ void cvar_changes_init()
                BADCVAR("g_runematch");
                BADCVAR("g_shootfromeye");
                BADCVAR("g_snafu");
+               BADCVAR("g_survival");
+               BADCVAR("g_survival_not_dm_maps");
                BADCVAR("g_tdm");
                BADCVAR("g_tdm_on_dm_maps");
                BADCVAR("g_tdm_teams");
@@ -294,6 +302,7 @@ void cvar_changes_init()
                BADCVAR("nextmap");
                BADCVAR("teamplay");
                BADCVAR("timelimit");
+               BADCVAR("g_mapinfo_settemp_acl");
                BADCVAR("g_mapinfo_ignore_warnings");
                BADCVAR("g_maplist_ignore_sizes");
                BADCVAR("g_maplist_sizes_count_bots");
@@ -332,19 +341,26 @@ void cvar_changes_init()
                BADCVAR("g_buffs_randomize");
                BADCVAR("g_buffs_randomize_teamplay");
                BADCVAR("g_campcheck_distance");
+               BADCVAR("g_chatsounds");
                BADCVAR("g_ca_point_leadlimit");
                BADCVAR("g_ca_point_limit");
                BADCVAR("g_ctf_captimerecord_always");
                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");
                BADCVAR("g_freezetag_point_limit");
+               BADCVAR("g_glowtrails");
                BADCVAR("g_hats");
+               BADCVAR("g_casings");
                BADCVAR("g_invasion_point_limit");
                BADCVAR("g_jump_grunt");
+               BADCVAR("g_keepaway_ballcarrier_effects");
+               BADCVAR("g_keepawayball_effects");
                BADCVAR("g_keyhunt_point_leadlimit");
                BADCVAR("g_nexball_goalleadlimit");
                BADCVAR("g_new_toys_autoreplace");
@@ -358,6 +374,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");
@@ -366,10 +383,12 @@ void cvar_changes_init()
                BADCVAR("sv_minigames");
                BADCVAR("sv_namechangetimer");
                BADCVAR("sv_precacheplayermodels");
+               BADCVAR("sv_radio");
                BADCVAR("sv_stepheight");
                BADCVAR("sv_timeout");
                BADCVAR("sv_weapons_modeloverride");
                BADCVAR("w_prop_interval");
+               BADPREFIX("chat_");
                BADPREFIX("crypto_");
                BADPREFIX("gameversion_");
                BADPREFIX("g_chat_");
@@ -398,6 +417,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");
@@ -564,9 +584,6 @@ spawnfunc(__init_dedicated_server)
        // handler for _init/_init map (only for dedicated server initialization)
 
        world_initialized = -1; // don't complain
-       cvar = cvar_normal;
-       cvar_string = cvar_string_normal;
-       cvar_set = cvar_set_normal;
 
        delete_fn = remove_unsafely;
 
@@ -676,8 +693,8 @@ spawnfunc(worldspawn)
                        // localcmd("\nfs_rescan\n"); // FIXME: does more harm than good, has unintended side effects. What we really want is to unload temporary pk3s only
                        // restore csqc_progname too
                        string expect = "csprogs.dat";
-                       wantrestart = cvar_string_normal("csqc_progname") != expect;
-                       cvar_set_normal("csqc_progname", expect);
+                       wantrestart = cvar_string("csqc_progname") != expect;
+                       cvar_set("csqc_progname", expect);
                }
                else
                {
@@ -688,9 +705,9 @@ spawnfunc(worldspawn)
                        // This always works; fall back to it if a versioned csprogs.dat is suddenly missing
                        string select = "csprogs.dat";
                        if (fexists(pk3csprogs)) select = pk3csprogs;
-                       if (cvar_string_normal("csqc_progname") != select)
+                       if (cvar_string("csqc_progname") != select)
                        {
-                               cvar_set_normal("csqc_progname", select);
+                               cvar_set("csqc_progname", select);
                                wantrestart = true;
                        }
                        // Check for updates on startup
@@ -709,13 +726,13 @@ spawnfunc(worldspawn)
                                        string newprogs = sprintf("progs-%s.dat", switchversion);
                                        if (fexists(newprogs))
                                        {
-                                               cvar_set_normal("sv_progs", newprogs);
+                                               cvar_set("sv_progs", newprogs);
                                                wantrestart = true;
                                        }
                                        string newcsprogs = sprintf("csprogs-%s.dat", switchversion);
                                        if (fexists(newcsprogs))
                                        {
-                                               cvar_set_normal("csqc_progname", newcsprogs);
+                                               cvar_set("csqc_progname", newcsprogs);
                                                wantrestart = true;
                                        }
                                }
@@ -729,10 +746,6 @@ spawnfunc(worldspawn)
                }
        }
 
-       cvar = cvar_normal;
-       cvar_string = cvar_string_normal;
-       cvar_set = cvar_set_normal;
-
        if(world_already_spawned)
                error("world already spawned - you may have EXACTLY ONE worldspawn!");
        world_already_spawned = true;
@@ -822,7 +835,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));
@@ -925,8 +938,6 @@ spawnfunc(worldspawn)
 
        Nagger_Init();
 
-       next_pingtime = time + 5;
-
        // set up information replies for clients and server to use
        maplist_reply = strzone(getmaplist());
        lsmaps_reply = strzone(getlsmaps());
@@ -1071,7 +1082,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 +1116,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)
@@ -1738,16 +1750,25 @@ float WinningCondition_Scores(float limit, float leadlimit)
 
        if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
        {
-               float fragsleft = FLOAT_MAX, leadingfragsleft = FLOAT_MAX;
-               if (limit)
-                       fragsleft = limit - WinningConditionHelper_topscore;
-               if (leadlimit)
-                       leadingfragsleft = WinningConditionHelper_secondscore + leadlimit - WinningConditionHelper_topscore;
-
-               if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
-                       fragsleft = max(fragsleft, leadingfragsleft);
+               float fragsleft;
+               if (checkrules_suddendeathend && time >= checkrules_suddendeathend)
+               {
+                       fragsleft = 1;
+               }
                else
-                       fragsleft = min(fragsleft, leadingfragsleft);
+               {
+                       fragsleft = FLOAT_MAX;
+                       float leadingfragsleft = FLOAT_MAX;
+                       if (limit)
+                               fragsleft = limit - WinningConditionHelper_topscore;
+                       if (leadlimit)
+                               leadingfragsleft = WinningConditionHelper_secondscore + leadlimit - WinningConditionHelper_topscore;
+
+                       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
                {
@@ -2053,21 +2074,20 @@ void Physics_Frame()
 
        IL_EACH(g_moveables, true,
        {
-               if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS)
+               if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PHYSICS)
                        continue;
 
                //set_movetype(it, it.move_movetype);
                // inline the set_movetype function, since this is called a lot
-               it.movetype = (it.move_qcphysics) ? MOVETYPE_NONE : it.move_movetype;
-
-               if(it.move_movetype == MOVETYPE_NONE)
-                       continue;
+               it.movetype = (it.move_qcphysics) ? MOVETYPE_QCENTITY : it.move_movetype;
 
-               if(it.move_qcphysics)
+               if(it.move_qcphysics && it.move_movetype != MOVETYPE_NONE)
                        Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
 
                if(it.movetype >= MOVETYPE_USER_FIRST && it.movetype <= MOVETYPE_USER_LAST) // these cases have no think handling
                {
+                       if(it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH)
+                               continue; // these movetypes have no regular think function
                        // handle thinking here
                        if (getthink(it) && it.nextthink > 0 && it.nextthink <= time + frametime)
                                RunThink(it);
@@ -2079,7 +2099,7 @@ void Physics_Frame()
 
        IL_EACH(g_moveables, it.move_qcphysics,
        {
-               if(IS_CLIENT(it) || is_pure(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE)
+               if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE)
                        continue;
                Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
        });
@@ -2199,6 +2219,11 @@ void Shutdown()
        if(world_initialized > 0)
        {
                world_initialized = 0;
+
+               // if a timeout is active, reset the slowmo value to normal
+               if(timeout_status == TIMEOUT_ACTIVE)
+                       cvar_set("slowmo", ftos(orig_slowmo));
+
                LOG_TRACE("Saving persistent data...");
                Ban_SaveBans();