]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/campaign.qc
Make sure g_campaign is always reset to 0 on disconnection (without relying on the...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / campaign.qc
index e80769cc2783edabcca7b1952aafbb5f9b06a256..5c26da9ed4c7e558c865a93d61368be3c3689723 100644 (file)
@@ -21,9 +21,11 @@ string campaign_index_var;
 
 float CampaignBailout(string s)
 {
+#if 0
        cvar = cvar_normal;
        cvar_string = cvar_string_normal;
        cvar_set = cvar_set_normal;
+#endif
        cvar_set("g_campaign", "0");
        LOG_INFO("^4campaign initialization failed: ", s);
        if(autocvar__campaign_testrun)
@@ -31,6 +33,7 @@ float CampaignBailout(string s)
        return 1;
 }
 
+#if 0
 string cvar_campaignwrapper_list; // string of format ; var value; var value; var value;
 string cvar_string_campaignwrapper(string theCvar)
 {
@@ -52,12 +55,12 @@ void cvar_set_campaignwrapper(string theCvar, string theValue)
 {
        if(cvar_string_campaignwrapper(theCvar) == theValue)
                return;
-       string s;
-       s = cvar_campaignwrapper_list;
+       string s = cvar_campaignwrapper_list;
        cvar_campaignwrapper_list = strzone(strcat("; ", theCvar, " ", theValue, s));
        strunzone(s);
        //print(cvar_campaignwrapper_list, "\n");
 }
+#endif
 
 float Campaign_Invalid()
 {
@@ -95,24 +98,45 @@ void CampaignPreInit()
                return;
        }
 
-       baseskill = autocvar_g_campaign_skill;
-       baseskill = baseskill + campaign_botskill[0];
-       if(baseskill < 0)
-               baseskill = 0;
+       baseskill = max(0, autocvar_g_campaign_skill + campaign_botskill[0]);
+       campaign_forcewin = false;
 
        cvar_set("sv_public", "0");
        cvar_set("pausable", "1");
 
+#if 0
        cvar_campaignwrapper_list = strzone(strcat("; ", campaign_mutators[0], "; "));
+#else
+       string cvar_campaignwrapper_list = strcat("; ", campaign_mutators[0], "; ");
+       int argc = tokenizebyseparator(cvar_campaignwrapper_list, "; ");
+       if(argc > 0)
+       {
+               for(int j = 0; j < argc; ++j)
+               {
+                       string arg = argv(j);
+                       if(arg == "") continue;
+                       _MapInfo_Parse_Settemp(mapname, MAPINFO_SETTEMP_ACL_USER, 0, arg, 0); // no recursion!
+               }
+       }
+#endif
 
+#if 0
        cvar = cvar_campaignwrapper;
        cvar_string = cvar_string_campaignwrapper;
        cvar_set = cvar_set_campaignwrapper;
-
        cvar_set("g_campaign", "1");
        cvar_set("g_dm", "0");
        cvar_set("skill", ftos(baseskill));
        cvar_set("bot_number", ftos(campaign_bots[0]));
+#else
+       // since g_campaign is already set to 1 by the menu when starting a campaign level, we first need
+       // to set it back to 0 before settemping it to 1 so it'll be correctly restored to 0 on disconnection
+       cvar_set("g_campaign", "0");
+       cvar_settemp("g_campaign", "1");
+       cvar_settemp("g_dm", "0");
+       cvar_settemp("skill", ftos(baseskill));
+       cvar_settemp("bot_number", ftos(campaign_bots[0]));
+#endif
        MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0]));
 
        // copy sv_gravity cvar, as the engine needs it too (sorry, this will mess
@@ -207,6 +231,11 @@ void CampaignPreIntermission()
                campaign_won = 1;
                bprint("Campaign test run, advancing level.\n");
        }
+       else if(campaign_forcewin)
+       {
+               campaign_won = 1;
+               bprint("The current level has been WON.\n");
+       }
        else if(won == 1 && lost == 0 && checkrules_equality == 0)
        {
                if(autocvar_timelimit != 0 && autocvar_fraglimit != 0 && time > autocvar_timelimit * 60) // checks if the timelimit has expired.