From 39ec079902c9e6e9bf710de32807a128132520d9 Mon Sep 17 00:00:00 2001 From: Freddy Date: Tue, 31 Dec 2019 20:20:43 +0100 Subject: [PATCH] Make ToS tab functional --- .../xonotic/dialog_multiplayer_join_ToS.qc | 43 +++- .../xonotic/dialog_multiplayer_join_ToS.qh | 5 +- .../dialog_multiplayer_join_serverinfo.qc | 198 +++++++++++++++++- .../dialog_multiplayer_join_serverinfo.qh | 16 ++ .../dialog_multiplayer_join_serverinfotab.qc | 168 --------------- .../dialog_multiplayer_join_serverinfotab.qh | 17 -- qcsrc/server/autocvars.qh | 1 + qcsrc/server/scores.qc | 9 + 8 files changed, 260 insertions(+), 197 deletions(-) diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qc b/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qc index a340ed2f2..17fad1317 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qc @@ -1,6 +1,6 @@ #include "dialog_multiplayer_join_ToS.qh" -#include "textlabel.qh" +#include "textbox.qh" #include @@ -12,21 +12,48 @@ entity makeXonoticServerToSTab() return me; } -void XonoticServerToSTab_loadToS(entity me, float i) +void XonoticServerToSTab_loadToS(entity me, string downloadurl) { - //TODO: download ToS from server - localcmd("echo test1"); + url_single_fopen(downloadurl, FILE_READ, AdditionalServerInfo_OnGet, me); } void XonoticServerToSTab_fill(entity me) { entity e; me.TR(me); - me.TD(me, 1, 6.2, e = makeXonoticTextLabel(0, _("ToS"))); - me.nameLabel = e; + me.TD(me, me.rows, me.columns, e = makeXonoticTextBox()); + me.textBox = e; } -void AdditionalServerInfo_OnGet(entity fh, entity pass, int status) +void AdditionalServerInfo_OnGet(entity fh, entity me, int status) { - localcmd("echo test2"); + switch (status) { + case URL_READY_CLOSED: + { + break; + } + case URL_READY_ERROR: + { + me.text = strzone("Error reading ToS"); + me.textBox.setText(me.textBox, me.text); + break; + } + case URL_READY_CANREAD: + { + strfree(me.text); + string temp = ""; + for (string s; (s = url_fgets(fh)); ) + { + temp = strcat(temp, "\n", s); + } + url_fclose(fh); + me.text = strzone(temp); + me.textBox.setText(me.textBox, me.text); + break; + } + default: + { + break; + } + } } diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qh b/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qh index 2f8d11bf1..aa2d19fe9 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qh +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join_ToS.qh @@ -3,14 +3,15 @@ #include "tab.qh" CLASS(XonoticServerToSTab, XonoticTab) METHOD(XonoticServerToSTab, fill, void(entity)); - METHOD(XonoticServerToSTab, loadToS, void(entity, float)); + METHOD(XonoticServerToSTab, loadToS, void(entity, string)); ATTRIB(XonoticServerToSTab, title, string, _("Terms of Service")); ATTRIB(XonoticServerToSTab, color, vector, SKINCOLOR_DIALOG_SERVERINFO); ATTRIB(XonoticServerToSTab, intendedWidth, float, 0.8); ATTRIB(XonoticServerToSTab, rows, float, 17); ATTRIB(XonoticServerToSTab, columns, float, 6.2); - ATTRIB(XonoticServerToSTab, nameLabel, entity); + ATTRIB(XonoticServerToSTab, text, string); + ATTRIB(XonoticServerToSTab, textBox, entity); ENDCLASS(XonoticServerToSTab) entity makeXonoticServerToSTab(); diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc index 79021d946..8ad716773 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc @@ -12,7 +12,201 @@ void XonoticServerInfoDialog_loadServerInfo(entity me, float i) { - me.infoTab.loadServerInfo(me.infoTab, i); + bool pure_available; + float m, pure_violations, freeslots, numh, maxp, numb, sflags; + string s, typestr, versionstr, k, v, modname; + + // ==================================== + // First clear and unzone the strings + // ==================================== + strfree(me.currentServerName); + strfree(me.currentServerCName); + strfree(me.currentServerType); + strfree(me.currentServerMap); + strfree(me.currentServerPlayers); + strfree(me.currentServerNumPlayers); + strfree(me.currentServerNumBots); + strfree(me.currentServerNumFreeSlots); + strfree(me.currentServerMod); + strfree(me.currentServerVersion); + // not zoned! + // strfree(me.currentServerEncrypt); + strfree(me.currentServerPure); + strfree(me.currentServerKey); + strfree(me.currentServerID); + + // ========================== + // Now, fill in the strings + // ========================== + me.currentServerName = strzone(gethostcachestring(SLIST_FIELD_NAME, i)); + me.infoTab.nameLabel.setText(me.infoTab.nameLabel, me.currentServerName); + + me.currentServerCName = strzone(gethostcachestring(SLIST_FIELD_CNAME, i)); + me.infoTab.cnameLabel.setText(me.infoTab.cnameLabel, me.currentServerCName); + + pure_available = false; + pure_violations = -1; + typestr = _("N/A"); + versionstr = _("N/A"); + + s = gethostcachestring(SLIST_FIELD_QCSTATUS, i); + m = tokenizebyseparator(s, ":"); + if(m >= 2) + { + typestr = argv(0); + versionstr = argv(1); + } + freeslots = -1; + sflags = -1; + modname = ""; + bool ToSSpecified = false; + for(int j = 2; j < m; ++j) + { + if(argv(j) == "") + break; + k = substring(argv(j), 0, 1); + v = substring(argv(j), 1, -1); + if(k == "P") + { + pure_available = true; + pure_violations = stof(v); + } + else if(k == "S") + { + freeslots = stof(v); + } + else if(k == "F") + { + sflags = stof(v); + } + else if(k == "M") + { + modname = v; + } + else if(k == "T") + { + ToSSpecified = true; + string downloadurl = v; + if (downloadurl == "INVALID") + { + me.ToSTab.textBox.setText(me.ToSTab.textBox, "No Terms of Service specified"); + } + else + { + int index = strstrofs(downloadurl, "|", 0); + while (index != -1) + { + downloadurl = strcat(substring(downloadurl, 0, index), ":", substring(downloadurl, index+1, -1)); + index = strstrofs(downloadurl, "|", index); + } + me.ToSTab.loadToS(me.ToSTab, downloadurl); + } + } + } + + if (!ToSSpecified) + { + me.ToSTab.textBox.setText(me.ToSTab.textBox, "No Terms of Service specified"); + } + +#ifdef COMPAT_NO_MOD_IS_XONOTIC + if(modname == "") + modname = "Xonotic"; +#endif + + s = gethostcachestring(SLIST_FIELD_MOD, i); + if(s != "data") + modname = sprintf("%s (%s)", modname, s); + + Gametype j = MapInfo_Type_FromString(typestr); // try and get the real name of the game type + if(j) { typestr = MapInfo_Type_ToText(j); } // only set it if we actually found it + + me.currentServerType = strzone(typestr); + me.infoTab.typeLabel.setText(me.infoTab.typeLabel, me.currentServerType); + + me.currentServerMap = strzone(gethostcachestring(SLIST_FIELD_MAP, i)); + me.infoTab.mapLabel.setText(me.infoTab.mapLabel, me.currentServerMap); + + me.currentServerPlayers = strzone(gethostcachestring(SLIST_FIELD_PLAYERS, i)); + me.infoTab.rawPlayerList.setPlayerList(me.infoTab.rawPlayerList, me.currentServerPlayers); + + numh = gethostcachenumber(SLIST_FIELD_NUMHUMANS, i); + maxp = gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i); + numb = gethostcachenumber(SLIST_FIELD_NUMBOTS, i); + me.currentServerNumPlayers = strzone(sprintf("%d/%d", numh, maxp)); + me.infoTab.numPlayersLabel.setText(me.infoTab.numPlayersLabel, me.currentServerNumPlayers); + + s = ftos(numb); + me.currentServerNumBots = strzone(s); + me.infoTab.numBotsLabel.setText(me.infoTab.numBotsLabel, me.currentServerNumBots); + + if(freeslots < 0) { freeslots = maxp - numh - numb; } + s = ftos(freeslots); + me.currentServerNumFreeSlots = strzone(s); + me.infoTab.numFreeSlotsLabel.setText(me.infoTab.numFreeSlotsLabel, me.currentServerNumFreeSlots); + + me.currentServerMod = ((modname == "Xonotic") ? ZCTX(_("MOD^Default")) : modname); + me.currentServerMod = strzone(me.currentServerMod); + me.infoTab.modLabel.setText(me.infoTab.modLabel, me.currentServerMod); + + me.currentServerVersion = strzone(versionstr); + me.infoTab.versionLabel.setText(me.infoTab.versionLabel, me.currentServerVersion); + + me.currentServerPure = ((!pure_available) ? _("N/A") : (pure_violations == 0) ? _("Official") : sprintf(_("%d modified"), pure_violations)); + me.currentServerPure = strzone(me.currentServerPure); + me.infoTab.pureLabel.setText(me.infoTab.pureLabel, me.currentServerPure); + + s = crypto_getencryptlevel(me.currentServerCName); + if(s == "") + { + if(cvar("crypto_aeslevel") >= 3) + me.currentServerEncrypt = _("N/A (auth library missing, can't connect)"); + else + me.currentServerEncrypt = _("N/A (auth library missing)"); + } + else switch(stof(substring(s, 0, 1))) + { + case 0: + if(cvar("crypto_aeslevel") >= 3) + me.currentServerEncrypt = _("Not supported (can't connect)"); + else + me.currentServerEncrypt = _("Not supported (won't encrypt)"); + break; + case 1: + if(cvar("crypto_aeslevel") >= 2) + me.currentServerEncrypt = _("Supported (will encrypt)"); + else + me.currentServerEncrypt = _("Supported (won't encrypt)"); + break; + case 2: + if(cvar("crypto_aeslevel") >= 1) + me.currentServerEncrypt = _("Requested (will encrypt)"); + else + me.currentServerEncrypt = _("Requested (won't encrypt)"); + break; + case 3: + if(cvar("crypto_aeslevel") <= 0) + me.currentServerEncrypt = _("Required (can't connect)"); + else + me.currentServerEncrypt = _("Required (will encrypt)"); + break; + } + me.infoTab.encryptLabel.setText(me.infoTab.encryptLabel, me.currentServerEncrypt); + setZonedTooltip(me.infoTab.encryptLabel, _("Use the `crypto_aeslevel` cvar to change your preferences"), string_null); + + s = crypto_getidfp(me.currentServerCName); + if (!s) { s = _("N/A"); } + me.currentServerID = strzone(s); + me.infoTab.idLabel.setText(me.infoTab.idLabel, me.currentServerID); + + s = crypto_getkeyfp(me.currentServerCName); + if (!s) { s = _("N/A"); } + me.currentServerKey = strzone(s); + me.infoTab.keyLabel.setText(me.infoTab.keyLabel, me.currentServerKey); + + me.currentServerStatsStatus = ((sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS)) ? ((sflags & SERVERFLAG_PLAYERSTATS_CUSTOM) ? _("custom stats server") : _("stats enabled")) : _("stats disabled")); + me.currentServerStatsStatus = strzone(me.currentServerStatsStatus); + me.infoTab.statsLabel.setText(me.infoTab.statsLabel, me.currentServerStatsStatus); } void XonoticServerInfoDialog_fill(entity me) @@ -21,7 +215,7 @@ void XonoticServerInfoDialog_fill(entity me) mc = makeXonoticTabController(me.rows - 2); me.TR(me); me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Status"), me.infoTab = makeXonoticServerInfoTab())); - me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Terms of Service"), makeXonoticServerToSTab())); + me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Terms of Service"), me.ToSTab = makeXonoticServerToSTab())); me.TR(me); me.TD(me, me.rows - 2, me.columns, mc); diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh index 4147facbd..bcaa00c8d 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh @@ -12,6 +12,22 @@ CLASS(XonoticServerInfoDialog, XonoticDialog) ATTRIB(XonoticServerInfoDialog, infoTab, entity); ATTRIB(XonoticServerInfoDialog, ToSTab, entity); + ATTRIB(XonoticServerInfoTab, currentServerName, string); + ATTRIB(XonoticServerInfoTab, currentServerCName, string); + ATTRIB(XonoticServerInfoTab, currentServerType, string); + ATTRIB(XonoticServerInfoTab, currentServerMap, string); + ATTRIB(XonoticServerInfoTab, currentServerPlayers, string); + ATTRIB(XonoticServerInfoTab, currentServerNumPlayers, string); + ATTRIB(XonoticServerInfoTab, currentServerNumBots, string); + ATTRIB(XonoticServerInfoTab, currentServerNumFreeSlots, string); + ATTRIB(XonoticServerInfoTab, currentServerMod, string); + ATTRIB(XonoticServerInfoTab, currentServerVersion, string); + ATTRIB(XonoticServerInfoTab, currentServerKey, string); + ATTRIB(XonoticServerInfoTab, currentServerID, string); + ATTRIB(XonoticServerInfoTab, currentServerEncrypt, string); + ATTRIB(XonoticServerInfoTab, currentServerPure, string); + ATTRIB(XonoticServerInfoTab, currentServerStatsStatus, string); + ENDCLASS(XonoticServerInfoDialog) void Join_Click(entity btn, entity me); diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qc b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qc index 2d81f7733..8527c260f 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qc @@ -16,174 +16,6 @@ entity makeXonoticServerInfoTab() return me; } -void XonoticServerInfoTab_loadServerInfo(entity me, float i) -{ - bool pure_available; - float m, pure_violations, freeslots, numh, maxp, numb, sflags; - string s, typestr, versionstr, k, v, modname; - - // ==================================== - // First clear and unzone the strings - // ==================================== - strfree(me.currentServerName); - strfree(me.currentServerCName); - strfree(me.currentServerType); - strfree(me.currentServerMap); - strfree(me.currentServerPlayers); - strfree(me.currentServerNumPlayers); - strfree(me.currentServerNumBots); - strfree(me.currentServerNumFreeSlots); - strfree(me.currentServerMod); - strfree(me.currentServerVersion); - // not zoned! - // strfree(me.currentServerEncrypt); - strfree(me.currentServerPure); - strfree(me.currentServerKey); - strfree(me.currentServerID); - - // ========================== - // Now, fill in the strings - // ========================== - me.currentServerName = strzone(gethostcachestring(SLIST_FIELD_NAME, i)); - me.nameLabel.setText(me.nameLabel, me.currentServerName); - - me.currentServerCName = strzone(gethostcachestring(SLIST_FIELD_CNAME, i)); - me.cnameLabel.setText(me.cnameLabel, me.currentServerCName); - - pure_available = false; - pure_violations = -1; - typestr = _("N/A"); - versionstr = _("N/A"); - - s = gethostcachestring(SLIST_FIELD_QCSTATUS, i); - m = tokenizebyseparator(s, ":"); - if(m >= 2) - { - typestr = argv(0); - versionstr = argv(1); - } - freeslots = -1; - sflags = -1; - modname = ""; - for(int j = 2; j < m; ++j) - { - if(argv(j) == "") - break; - k = substring(argv(j), 0, 1); - v = substring(argv(j), 1, -1); - if(k == "P") - { - pure_available = true; - pure_violations = stof(v); - } - else if(k == "S") - freeslots = stof(v); - else if(k == "F") - sflags = stof(v); - else if(k == "M") - modname = v; - } - -#ifdef COMPAT_NO_MOD_IS_XONOTIC - if(modname == "") - modname = "Xonotic"; -#endif - - s = gethostcachestring(SLIST_FIELD_MOD, i); - if(s != "data") - modname = sprintf("%s (%s)", modname, s); - - Gametype j = MapInfo_Type_FromString(typestr); // try and get the real name of the game type - if(j) { typestr = MapInfo_Type_ToText(j); } // only set it if we actually found it - - me.currentServerType = strzone(typestr); - me.typeLabel.setText(me.typeLabel, me.currentServerType); - - me.currentServerMap = strzone(gethostcachestring(SLIST_FIELD_MAP, i)); - me.mapLabel.setText(me.mapLabel, me.currentServerMap); - - me.currentServerPlayers = strzone(gethostcachestring(SLIST_FIELD_PLAYERS, i)); - me.rawPlayerList.setPlayerList(me.rawPlayerList, me.currentServerPlayers); - - numh = gethostcachenumber(SLIST_FIELD_NUMHUMANS, i); - maxp = gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i); - numb = gethostcachenumber(SLIST_FIELD_NUMBOTS, i); - me.currentServerNumPlayers = strzone(sprintf("%d/%d", numh, maxp)); - me.numPlayersLabel.setText(me.numPlayersLabel, me.currentServerNumPlayers); - - s = ftos(numb); - me.currentServerNumBots = strzone(s); - me.numBotsLabel.setText(me.numBotsLabel, me.currentServerNumBots); - - if(freeslots < 0) { freeslots = maxp - numh - numb; } - s = ftos(freeslots); - me.currentServerNumFreeSlots = strzone(s); - me.numFreeSlotsLabel.setText(me.numFreeSlotsLabel, me.currentServerNumFreeSlots); - - me.currentServerMod = ((modname == "Xonotic") ? ZCTX(_("MOD^Default")) : modname); - me.currentServerMod = strzone(me.currentServerMod); - me.modLabel.setText(me.modLabel, me.currentServerMod); - - me.currentServerVersion = strzone(versionstr); - me.versionLabel.setText(me.versionLabel, me.currentServerVersion); - - me.currentServerPure = ((!pure_available) ? _("N/A") : (pure_violations == 0) ? _("Official") : sprintf(_("%d modified"), pure_violations)); - me.currentServerPure = strzone(me.currentServerPure); - me.pureLabel.setText(me.pureLabel, me.currentServerPure); - - s = crypto_getencryptlevel(me.currentServerCName); - if(s == "") - { - if(cvar("crypto_aeslevel") >= 3) - me.currentServerEncrypt = _("N/A (auth library missing, can't connect)"); - else - me.currentServerEncrypt = _("N/A (auth library missing)"); - } - else switch(stof(substring(s, 0, 1))) - { - case 0: - if(cvar("crypto_aeslevel") >= 3) - me.currentServerEncrypt = _("Not supported (can't connect)"); - else - me.currentServerEncrypt = _("Not supported (won't encrypt)"); - break; - case 1: - if(cvar("crypto_aeslevel") >= 2) - me.currentServerEncrypt = _("Supported (will encrypt)"); - else - me.currentServerEncrypt = _("Supported (won't encrypt)"); - break; - case 2: - if(cvar("crypto_aeslevel") >= 1) - me.currentServerEncrypt = _("Requested (will encrypt)"); - else - me.currentServerEncrypt = _("Requested (won't encrypt)"); - break; - case 3: - if(cvar("crypto_aeslevel") <= 0) - me.currentServerEncrypt = _("Required (can't connect)"); - else - me.currentServerEncrypt = _("Required (will encrypt)"); - break; - } - me.encryptLabel.setText(me.encryptLabel, me.currentServerEncrypt); - setZonedTooltip(me.encryptLabel, _("Use the `crypto_aeslevel` cvar to change your preferences"), string_null); - - s = crypto_getidfp(me.currentServerCName); - if (!s) { s = _("N/A"); } - me.currentServerID = strzone(s); - me.idLabel.setText(me.idLabel, me.currentServerID); - - s = crypto_getkeyfp(me.currentServerCName); - if (!s) { s = _("N/A"); } - me.currentServerKey = strzone(s); - me.keyLabel.setText(me.keyLabel, me.currentServerKey); - - me.currentServerStatsStatus = ((sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS)) ? ((sflags & SERVERFLAG_PLAYERSTATS_CUSTOM) ? _("custom stats server") : _("stats enabled")) : _("stats disabled")); - me.currentServerStatsStatus = strzone(me.currentServerStatsStatus); - me.statsLabel.setText(me.statsLabel, me.currentServerStatsStatus); -} - void XonoticServerInfoTab_fill(entity me) { entity e; diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qh b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qh index 8962c35c5..ed3515f99 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qh +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfotab.qh @@ -3,29 +3,12 @@ #include "tab.qh" CLASS(XonoticServerInfoTab, XonoticTab) METHOD(XonoticServerInfoTab, fill, void(entity)); - METHOD(XonoticServerInfoTab, loadServerInfo, void(entity, float)); ATTRIB(XonoticServerInfoTab, title, string, _("Server Information")); ATTRIB(XonoticServerInfoTab, color, vector, SKINCOLOR_DIALOG_SERVERINFO); ATTRIB(XonoticServerInfoTab, intendedWidth, float, 0.8); ATTRIB(XonoticServerInfoTab, rows, float, 17); ATTRIB(XonoticServerInfoTab, columns, float, 6.2); - ATTRIB(XonoticServerInfoTab, currentServerName, string); - ATTRIB(XonoticServerInfoTab, currentServerCName, string); - ATTRIB(XonoticServerInfoTab, currentServerType, string); - ATTRIB(XonoticServerInfoTab, currentServerMap, string); - ATTRIB(XonoticServerInfoTab, currentServerPlayers, string); - ATTRIB(XonoticServerInfoTab, currentServerNumPlayers, string); - ATTRIB(XonoticServerInfoTab, currentServerNumBots, string); - ATTRIB(XonoticServerInfoTab, currentServerNumFreeSlots, string); - ATTRIB(XonoticServerInfoTab, currentServerMod, string); - ATTRIB(XonoticServerInfoTab, currentServerVersion, string); - ATTRIB(XonoticServerInfoTab, currentServerKey, string); - ATTRIB(XonoticServerInfoTab, currentServerID, string); - ATTRIB(XonoticServerInfoTab, currentServerEncrypt, string); - ATTRIB(XonoticServerInfoTab, currentServerPure, string); - ATTRIB(XonoticServerInfoTab, currentServerStatsStatus, string); - ATTRIB(XonoticServerInfoTab, nameLabel, entity); ATTRIB(XonoticServerInfoTab, cnameLabel, entity); ATTRIB(XonoticServerInfoTab, typeLabel, entity); diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 415fedab8..9297859e6 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -273,6 +273,7 @@ int autocvar_spawn_debug; bool autocvar_speedmeter; float autocvar_sv_accuracy_data_share = 1; string autocvar_sv_adminnick; +string autocvar_sv_ToSurl; bool autocvar_sv_autoscreenshot; int autocvar_sv_cheats; float autocvar_sv_clientcommand_antispam_time; diff --git a/qcsrc/server/scores.qc b/qcsrc/server/scores.qc index af2f4b574..a55568cc3 100644 --- a/qcsrc/server/scores.qc +++ b/qcsrc/server/scores.qc @@ -429,6 +429,15 @@ void WinningConditionHelper(entity this) s = strcat(s, ":P", ftos(cvar_purechanges_count)); s = strcat(s, ":S", ftos(nJoinAllowed(this, NULL))); s = strcat(s, ":F", ftos(serverflags)); + string downloadurl = autocvar_sv_ToSurl ? autocvar_sv_ToSurl : "INVALID"; + // replace : by | in downloadurl since : is the separator + int i = strstrofs(downloadurl, ":", 0); + while (i != -1) + { + downloadurl = strcat(substring(downloadurl, 0, i), "|", substring(downloadurl, i+1, -1)); + i = strstrofs(downloadurl, ":", i); + } + s = strcat(s, ":T", downloadurl); s = strcat(s, ":M", modname); s = strcat(s, "::", GetPlayerScoreString(NULL, (fullstatus ? 1 : 2))); -- 2.39.2