if(t != "")
return strzone(t);
}
- if(prvm_language == "en" || prvm_language == "")
+ if(prvm_language == "en")
{
t = cvar_description(s);
if(t != "" && t != "custom cvar")
float _Nex_ExtResponseSystem_Queried;
string _Nex_ExtResponseSystem_UpdateTo;
string _Nex_ExtResponseSystem_UpdateToURL;
+string _Nex_ExtResponseSystem_Packs;
+float _Nex_ExtResponseSystem_PacksStep;
void URI_Get_Callback(float id, float status, string data)
{
- if (id == URI_GET_DISCARD)
+ if(url_URI_Get_Callback(id, status, data))
{
- // discard
+ // handled
}
- else if(id == URI_GET_UPDATENOTIFICATION)
+ else if (id == URI_GET_DISCARD)
{
- UpdateNotification_URI_Get_Callback(id, status, data);
+ // discard
}
- else if(id >= URI_GET_CURL && id <= URI_GET_CURL_END)
+ else if (id >= URI_GET_CURL && id <= URI_GET_CURL_END)
{
+ // sv_cmd curl
Curl_URI_Get_Callback(id, status, data);
}
+ else if (id == URI_GET_UPDATENOTIFICATION)
+ {
+ UpdateNotification_URI_Get_Callback(id, status, data);
+ }
else
{
- print(sprintf(_("Received HTTP request data for an invalid id %d.\n"), id));
+ print(sprintf("Received HTTP request data for an invalid id %d.\n", id));
}
}
+void DisableServerBackwardsCompatibility()
+{
+ cvar_set("gameversion_min", ftos(100 * floor(cvar("gameversion") / 100)));
+}
+
void UpdateNotification_URI_Get_Callback(float id, float status, string data)
{
float n;
n = 0;
else
n = tokenizebyseparator(data, "\n");
+
+ float i;
+ string s;
+
+ string un_version = "";
+ string un_download = "";
+ string un_url = "";
+ string un_bannedservers = "";
+ string un_emergency_pk3s = "";
+ string un_promoted = "";
+ string un_recommended = "";
+ string un_compatexpire = "";
- if(n >= 1)
+ for(i = 0; i < n; ++i)
{
- _Nex_ExtResponseSystem_UpdateTo = argv(0);
-
- if(vercmp(cvar_string("g_xonoticversion"), _Nex_ExtResponseSystem_UpdateTo) >= 0)
+ s = substring(argv(i), 2, -1);
+ if(s == "") { continue; } // ignore empty lines
+
+ switch(substring(argv(i), 0, 1))
{
- _Nex_ExtResponseSystem_UpdateTo = ""; // no update needed
+ #define APPEND_TO_STRING(list,sep,add) ((list) = (((list) != "") ? strcat(list, sep, add) : (add)))
+ case "V":
+ {
+ un_version = s;
+ break;
+ }
+ case "C":
+ {
+ un_compatexpire = s;
+ break;
+ }
+ case "D":
+ {
+ un_download = s;
+ break;
+ }
+ case "U":
+ {
+ un_url = s;
+ break;
+ }
+ case "B":
+ {
+ APPEND_TO_STRING(un_bannedservers, " ", s);
+ break;
+ }
+ case "E":
+ {
+ if(cvar("menu_updatecheck_getpacks"))
+ APPEND_TO_STRING(un_emergency_pk3s, " ", s);
+ break;
+ }
+ case "P":
+ {
+ APPEND_TO_STRING(un_promoted, " ", s);
+ break;
+ }
+ case "R":
+ {
+ APPEND_TO_STRING(un_recommended, " ", s);
+ break;
+ }
}
- else
+ }
+
+ if(un_version != "")
+ {
+ if(vercmp(cvar_string("g_xonoticversion"), un_version) < 0)
{
// update needed
- if(n >= 2)
- print(sprintf(_("Update can be downloaded at:\n%s\n"), argv(1)));
- if(n >= 3)
- _Nex_ExtResponseSystem_UpdateToURL = strzone(argv(2));
+ _Nex_ExtResponseSystem_UpdateTo = strzone(un_version);
+ if(un_download) { print(sprintf(_("Update can be downloaded at:\n%s\n"), un_download)); }
+ if(un_url) { _Nex_ExtResponseSystem_UpdateToURL = strzone(un_url); }
+ DisableServerBackwardsCompatibility();
}
-
- _Nex_ExtResponseSystem_UpdateTo = strzone(_Nex_ExtResponseSystem_UpdateTo);
-
- if(n >= 4)
+ else if(cvar_string("g_xonoticversion") == un_version)
{
- _Nex_ExtResponseSystem_BannedServers = strzone(argv(3));
- _Nex_ExtResponseSystem_BannedServersNeedsRefresh = 1;
+ if(un_compatexpire != "")
+ {
+ string curdate = strftime(FALSE, "%Y%m%d%H%M%S");
+ if (strcmp(curdate, un_compatexpire) >= 0)
+ DisableServerBackwardsCompatibility();
+ }
}
}
-}
-
-// END OF URI SYSTEM ////////////////////////////////////////////////////////
-
-float preMenuInit()
-{
- vector sz;
- vector boxA, boxB;
-
- MapInfo_Cache_Create();
- MapInfo_Enumerate();
- if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
+
+ if(un_emergency_pk3s != "")
{
- draw_reset_cropped();
-
- sz = eX * 0.025 + eY * 0.025 * (draw_scale_x / draw_scale_y);
- draw_CenterText('0.5 0.5 0' - 1.25 * sz_y * eY, _("Autogenerating mapinfo for newly added maps..."), sz, '1 1 1', 1, 0);
-
- boxA = '0.05 0.5 0' + 0.25 * sz_y * eY;
- boxB = '0.95 0.5 0' + 1.25 * sz_y * eY;
- draw_Fill(boxA, boxB - boxA, '1 1 1', 1);
-
- boxA += sz * 0.1;
- boxB -= sz * 0.1;
- draw_Fill(boxA, boxB - boxA, '0.1 0.1 0.1', 1);
-
- boxB_x = boxA_x * (1 - MapInfo_progress) + boxB_x * MapInfo_progress;
- draw_Fill(boxA, boxB - boxA, '0 0 1', 1);
+ _Nex_ExtResponseSystem_Packs = strzone(un_emergency_pk3s);
+ _Nex_ExtResponseSystem_PacksStep = 1;
+ }
- return FALSE;
+ if(un_promoted != "")
+ {
+ _Nex_ExtResponseSystem_PromotedServers = strzone(un_promoted);
+ _Nex_ExtResponseSystem_PromotedServersNeedsRefresh = 1;
}
- return TRUE;
-}
-string campaign_name_previous;
-float campaign_won_previous;
-#ifdef WATERMARK
-var string autocvar_menu_watermark = WATERMARK();
-#else
-var string autocvar_menu_watermark = "";
-#endif
-void postMenuDraw()
-{
- if(autocvar_menu_watermark != "")
+ if(un_recommended != "")
{
- vector fs = '48 48 0';
- draw_CenterText('0.5 0.1 0', sprintf(_("^1%s TEST BUILD"), autocvar_menu_watermark), globalToBoxSize('32 32 0', draw_scale), '1 1 1', 0.05, 1);
+ _Nex_ExtResponseSystem_RecommendedServers = strzone(un_recommended);
+ _Nex_ExtResponseSystem_RecommendedServersNeedsRefresh = 1;
}
}
-void preMenuDraw()
-{
- vector fs, sz, line, mid;
+// END OF URI SYSTEM ////////////////////////////////////////////////////////
+
+void updateCheck()
+{
if(cvar("menu_updatecheck"))
{
if(!_Nex_ExtResponseSystem_Queried)
// for privacy, munge the start count a little
startcnt = floor((floor(startcnt / 10) + random()) * 10);
- uri = sprintf("http://www.xonotic.org/dl/checkupdate.txt?version=%s&cnt=%d", uri_escape(cvar_string("g_xonoticversion")), startcnt);
+ uri = sprintf("http://www.xonotic.org/dl/checkupdate.txt?format=keys&version=%s&cnt=%d", uri_escape(cvar_string("g_xonoticversion")), startcnt);
#ifdef CVAR_POPCON
float cvar_handle, popcon_handle;
}
}
+ if(_Nex_ExtResponseSystem_PacksStep > 0)
+ {
+ float n, i;
+ float allgood;
+ n = tokenize_console(_Nex_ExtResponseSystem_Packs);
+ allgood = TRUE;
+ for(i = 0; i+1 < n; i += 2)
+ {
+ if(fexists(argv(i+1)))
+ continue;
+ allgood = FALSE;
+ if(_Nex_ExtResponseSystem_PacksStep == 1) // first run
+ localcmd("\ncurl --pak \"", argv(i), "\"\n");
+ }
+ if(allgood)
+ {
+ if(_Nex_ExtResponseSystem_PacksStep == 2)
+ {
+ if(!Menu_Active)
+ cvar_set("_menu_initialized", "0");
+ // HACK: cause m_hide call on next start
+ localcmd("\nmenu_restart\n");
+ }
+ _Nex_ExtResponseSystem_PacksStep = 0;
+ }
+ else
+ _Nex_ExtResponseSystem_PacksStep = 2;
+ }
+
+}
+
+float preMenuInit()
+{
+ vector sz;
+ vector boxA, boxB;
+
+ updateCheck();
+
+ MapInfo_Cache_Create();
+ MapInfo_Enumerate();
+ if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))
+ {
+ draw_reset_cropped();
+
+ sz = eX * 0.025 + eY * 0.025 * (draw_scale_x / draw_scale_y);
+ draw_CenterText('0.5 0.5 0' - 1.25 * sz_y * eY, _("Autogenerating mapinfo for newly added maps..."), sz, '1 1 1', 1, 0);
+
+ boxA = '0.05 0.5 0' + 0.25 * sz_y * eY;
+ boxB = '0.95 0.5 0' + 1.25 * sz_y * eY;
+ draw_Fill(boxA, boxB - boxA, '1 1 1', 1);
+
+ boxA += sz * 0.1;
+ boxB -= sz * 0.1;
+ draw_Fill(boxA, boxB - boxA, '0.1 0.1 0.1', 1);
+
+ boxB_x = boxA_x * (1 - MapInfo_progress) + boxB_x * MapInfo_progress;
+ draw_Fill(boxA, boxB - boxA, '0 0 1', 1);
+
+ return FALSE;
+ }
+ return TRUE;
+}
+
+string campaign_name_previous;
+float campaign_won_previous;
+#ifdef WATERMARK
+var string autocvar_menu_watermark = WATERMARK;
+#else
+var string autocvar_menu_watermark = "";
+#endif
+void postMenuDraw()
+{
+ if(autocvar_menu_watermark != "")
+ {
+ draw_CenterText('0.5 0.1 0', sprintf(_("^1%s TEST BUILD"), autocvar_menu_watermark), globalToBoxSize('32 32 0', draw_scale), '1 1 1', 0.05, 1);
+ }
+}
+void preMenuDraw()
+{
+ vector fs, sz = '0 0 0', line, mid;
+
+ updateCheck();
+
if(_Nex_ExtResponseSystem_UpdateTo != "")
{
// TODO rather turn this into a dialog
GAMETYPE(MAPINFO_TYPE_ONSLAUGHT) \
GAMETYPE(MAPINFO_TYPE_RACE) \
GAMETYPE(MAPINFO_TYPE_CTS) \
- GAMETYPE(MAPINFO_TYPE_RUNEMATCH) \
GAMETYPE(MAPINFO_TYPE_TEAM_DEATHMATCH) \
/* nothing */
#define GAMETYPE(id) if(i++ == cnt) return id;
GAMETYPES
#undef GAMETYPE
+
+ unused_float = i;
return 0;
}