]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_world.qc
sv_db_saveasdump and cl_db_saveasdump cvars
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_world.qc
index c815b0815a8539690c0c882f2b0e9b5a7663e6f5..73ae5605f0c713955d4e5e2760b12f20d41c5507 100644 (file)
@@ -236,6 +236,7 @@ void cvar_changes_init()
                BADCVAR("g_configversion");
                BADCVAR("g_maplist_index");
                BADCVAR("halflifebsp");
+               BADPREFIX("sv_world");
 
                // client
                BADPREFIX("cl_");
@@ -279,6 +280,8 @@ void cvar_changes_init()
                BADCVAR("sys_colortranslation");
                BADCVAR("sys_specialcharactertranslation");
                BADCVAR("timestamps");
+               BADCVAR("net_address");
+               BADCVAR("net_address_ipv6");
 
                // mapinfo
                BADCVAR("timelimit");
@@ -437,6 +440,8 @@ void spawnfunc_worldspawn (void)
 
        compressShortVector_init();
 
+       allowed_to_spawn = TRUE;
+
        local entity head;
        head = nextent(world);
        maxclients = 0;
@@ -512,6 +517,8 @@ void spawnfunc_worldspawn (void)
        InitGameplayMode();
        readlevelcvars();
        GrappleHookInit();
+       ElectroInit();
+       LaserInit();
 
        player_count = 0;
        bot_waypoints_for_items = cvar("g_waypoints_for_items");
@@ -635,6 +642,18 @@ void spawnfunc_worldspawn (void)
        addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit);
        addstat(STAT_BULLETS_LOADED, AS_INT, campingrifle_bulletcounter);
 
+       addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
+
+       if(g_ca)
+       {
+               addstat(STAT_REDALIVE, AS_INT, redalive_stat);
+               addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat);
+       }
+       // g_movementspeed hack
+       addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
+       addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw);
+       addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw);
+
        next_pingtime = time + 5;
        InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS);
 
@@ -694,7 +713,22 @@ void spawnfunc_worldspawn (void)
 
        CheatInit();
 
-       localcmd("\n_sv_hook_gamestart ", GetGametype(), ";");
+       localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
+
+       // fill sv_curl_serverpackages from .serverpackage files
+       if(cvar("sv_curl_serverpackages_auto"))
+       {
+               fd = search_begin("*.serverpackage", TRUE, FALSE);
+               s = "";
+               if(fd >= 0)
+               {
+                       j = search_getsize(fd);
+                       for(i = 0; i < j; ++i)
+                               s = strcat(s, " ", search_getfilename(fd, i));
+                       search_end(fd);
+               }
+               cvar_set("sv_curl_serverpackages", substring(s, 1, -1));
+       }
 
        world_initialized = 1;
 }
@@ -1422,7 +1456,7 @@ void NextLevel()
        if(cvar("g_campaign"))
                CampaignPreIntermission();
 
-       localcmd("\nsv_hook_gameend;");
+       localcmd("\nsv_hook_gameend\n");
 }
 
 /*
@@ -1502,16 +1536,23 @@ void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true
 
 float GetWinningCode(float fraglimitreached, float equality)
 {
-       if(equality)
-               if(fraglimitreached)
-                       return WINNING_STARTSUDDENDEATHOVERTIME;
-               else
-                       return WINNING_NEVER;
-       else
+       if(cvar("g_campaign") == 1)
                if(fraglimitreached)
                        return WINNING_YES;
                else
                        return WINNING_NO;
+
+       else
+               if(equality)
+                       if(fraglimitreached)
+                               return WINNING_STARTSUDDENDEATHOVERTIME;
+                       else
+                               return WINNING_NEVER;
+               else
+                       if(fraglimitreached)
+                               return WINNING_YES;
+                       else
+                               return WINNING_NO;
 }
 
 // set the .winning flag for exactly those players with a given field value
@@ -1630,7 +1671,7 @@ float WinningCondition_Assault()
 
                        TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 666 - TeamScore_AddToTeam(assault_attacker_team, ST_ASSAULT_OBJECTIVES, 0));
 
-                       if(ent.cnt == 1) // this was the second round
+                       if(ent.cnt == 1 || cvar("g_campaign")) // this was the second round
                        {
                                status = WINNING_YES;
                        }
@@ -1735,6 +1776,8 @@ void ShuffleMaplist()
 float leaderfrags;
 float WinningCondition_Scores(float limit, float leadlimit)
 {
+       float limitreached;
+
        // TODO make everything use THIS winning condition (except LMS)
        WinningConditionHelper();
 
@@ -1779,13 +1822,22 @@ float WinningCondition_Scores(float limit, float leadlimit)
                }
        }
 
+       limitreached = FALSE;
+       if(limit)
+               if(WinningConditionHelper_topscore >= limit)
+                       limitreached = TRUE;
+       if(leadlimit)
+       {
+               float leadlimitreached;
+               leadlimitreached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
+               if(cvar("leadlimit_and_fraglimit"))
+                       limitreached = (limitreached && leadlimitreached);
+               else
+                       limitreached = (limitreached || leadlimitreached);
+       }
+
        return GetWinningCode(
-               WinningConditionHelper_topscore &&
-               (
-                       (limit && (WinningConditionHelper_topscore >= limit))
-                       ||
-                       (leadlimit && (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit))
-               ),
+               WinningConditionHelper_topscore && limitreached,
                WinningConditionHelper_equality
        );
 }
@@ -2728,9 +2780,19 @@ void SV_Shutdown()
                print("Saving persistent data...\n");
                Ban_SaveBans();
                if(!cheatcount_total)
-                       db_save(ServerProgsDB, "server.db");
+               {
+                       if(cvar("sv_db_saveasdump"))
+                               db_dump(ServerProgsDB, "server.db");
+                       else
+                               db_save(ServerProgsDB, "server.db");
+               }
                if(cvar("developer"))
-                       db_save(TemporaryDB, "server-temp.db");
+               {
+                       if(cvar("sv_db_saveasdump"))
+                               db_dump(TemporaryDB, "server-temp.db");
+                       else
+                               db_save(TemporaryDB, "server-temp.db");
+               }
                CheatShutdown(); // must be after cheatcount check
                db_close(ServerProgsDB);
                db_close(TemporaryDB);