]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/serverlist.qc
Merge branch 'master' into terencehill/lms_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / serverlist.qc
index 33fd2d31f64c6e26048956749632fb0aee938a08..71119adf121be93f98d50f1df273be17f3415c12 100644 (file)
@@ -92,7 +92,7 @@ bool IsServerInList(string list, string srv)
        return false;
 }
 
-int CheckCategoryOverride(int cat)
+int CategoryOverride(int cat)
 {
        entity catent = RetrieveCategoryEnt(cat);
        if(catent)
@@ -103,12 +103,12 @@ int CheckCategoryOverride(int cat)
        }
        else
        {
-               error(sprintf("CheckCategoryOverride(%d): Improper category number!\n", cat));
+               error(sprintf("CategoryOverride(%d): Improper category number!\n", cat));
                return cat;
        }
 }
 
-int CheckCategoryForEntry(int entry)
+int CategoryForEntry(int entry)
 {
        string s, k, v, modtype = "";
        int j, m, impure = 0, freeslots = 0, sflags = 0;
@@ -195,8 +195,6 @@ int CheckCategoryForEntry(int entry)
                        case "minstagib":
                        case "instagib": { return CAT_INSTAGIB; }
                        case "overkill": { return CAT_OVERKILL; }
-                       //case "nix": { return CAT_NIX; }
-                       //case "newtoys": { return CAT_NEWTOYS; }
 
                        // "cts" is allowed as compat, xdf is replacement
                        case "cts":
@@ -255,12 +253,12 @@ void ServerList_Update_favoriteButton(entity btn, entity me)
        entity e = me.favoriteButton;
        if(IsFavorite(me.ipAddressBox.text))
        {
-               e.setText(e, _("Remove favorite"));
+               e.setText(e, ZCTX(_("SERVER^Remove favorite")));
                setZonedTooltip(e, _("Remove the currently highlighted server from bookmarks"), string_null);
        }
        else
        {
-               e.setText(e, _("Favorite"));
+               e.setText(e, ZCTX(_("SERVER^Favorite")));
                setZonedTooltip(e, _("Bookmark the currently highlighted server so that it's faster to find in the future"), string_null);
        }
 }
@@ -343,6 +341,10 @@ void XonoticServerList_refreshServerList(entity me, int mode)
                if(!me.filterShowEmpty)
                        sethostcachemasknumber(++m, SLIST_FIELD_NUMHUMANS, 1, SLIST_TEST_GREATEREQUAL);
 
+               // show laggy button
+               if(!me.filterShowLaggy && autocvar_menu_slist_maxping > 0)
+                       sethostcachemasknumber(++m, SLIST_FIELD_PING, autocvar_menu_slist_maxping, SLIST_TEST_LESSEQUAL);
+
                // gametype filtering
                if(typestr != "")
                        sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, strcat(typestr, ":"), SLIST_TEST_STARTSWITH);
@@ -396,8 +398,7 @@ void XonoticServerList_focusEnter(entity me)
 
 void XonoticServerList_draw(entity me)
 {
-       int i;
-       bool found = false, owned;
+       me.serversHeight = (autocvar_menu_slist_categories > 0 ? 1.0 : me.categoriesHeight);
 
        if(_Nex_ExtResponseSystem_BannedServersNeedsRefresh)
        {
@@ -440,9 +441,9 @@ void XonoticServerList_draw(entity me)
                me.refreshServerList(me, REFRESHSERVERLIST_RESORT);
        }
 
-       owned = ((me.selectedServer == me.ipAddressBox.text) && (me.ipAddressBox.text != ""));
+       bool owned = ((me.selectedServer == me.ipAddressBox.text) && (me.ipAddressBox.text != ""));
 
-       for(i = 0; i < category_draw_count; ++i) { category_name[i] = -1; category_item[i] = -1; }
+       for(int i = 0; i < category_draw_count; ++i) { category_name[i] = -1; category_item[i] = -1; }
        category_draw_count = 0;
 
        if(autocvar_menu_slist_categories >= 0) // if less than 0, don't even draw a category heading for favorites
@@ -533,11 +534,12 @@ void XonoticServerList_draw(entity me)
        }
        else { me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT); }
 
-       me.connectButton.disabled = (me.lockedSelectedItem || (me.nItems == 0 && me.ipAddressBox.text == ""));
+       me.connectButton.disabled = (me.ipAddressBox.text == "");
        //me.disconnectButton.disabled = (!(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)));
-       me.infoButton.disabled = (me.lockedSelectedItem || me.nItems == 0 || !owned);
-       me.favoriteButton.disabled = (me.lockedSelectedItem || (me.nItems == 0 && me.ipAddressBox.text == ""));
+       me.infoButton.disabled = !owned;
+       me.favoriteButton.disabled = (me.ipAddressBox.text == "");
 
+       bool found = false;
        if(me.lockedSelectedItem)
        {
                if(me.nItems > 0)
@@ -551,7 +553,7 @@ void XonoticServerList_draw(entity me)
        }
        else if(me.selectedServer)
        {
-               for(i = 0; i < me.nItems; ++i)
+               for(int i = 0; i < me.nItems; ++i)
                {
                        if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
                        {
@@ -627,7 +629,7 @@ void ServerList_TypeSort_Click(entity btn, entity me)
                // the type was found
                // choose the next one
                flag = true;
-               s = MapInfo_Type_ToString(Gametypes_from(it.m_id + 1));
+               s = MapInfo_Type_ToString(REGISTRY_GET(Gametypes, it.m_id + 1));
                if (s == "") s = MapInfo_Type_ToString(first);
                break;
        });
@@ -683,6 +685,15 @@ void ServerList_ShowFull_Click(entity box, entity me)
        me.ipAddressBox.cursorPos = 0;
        me.ipAddressBoxFocused = -1;
 }
+void ServerList_ShowLaggy_Click(entity box, entity me)
+{
+       box.setChecked(box, me.filterShowLaggy = !me.filterShowLaggy);
+       me.refreshServerList(me, REFRESHSERVERLIST_REFILTER);
+
+       me.ipAddressBox.setText(me.ipAddressBox, "");
+       me.ipAddressBox.cursorPos = 0;
+       me.ipAddressBoxFocused = -1;
+}
 void XonoticServerList_setSortOrder(entity me, int fld, int direction)
 {
        if(me.currentSortField == fld)
@@ -749,10 +760,8 @@ void XonoticServerList_resizeNotify(entity me, vector relOrigin, vector relSize,
 }
 void ServerList_Connect_Click(entity btn, entity me)
 {
-       if (me.lockedSelectedItem)
-               return;
-       string sv = (me.ipAddressBox.text != "") ? me.ipAddressBox.text : me.selectedServer;
-       localcmd(sprintf("connect %s\n", sv));
+       if (me.ipAddressBox.text != "")
+               localcmd(sprintf("connect %s\n", me.ipAddressBox.text));
 }
 void ServerList_Favorite_Click(entity btn, entity this)
 {
@@ -768,8 +777,10 @@ void ServerList_Info_Click(entity btn, entity me)
        if (me.nItems != 0)
                main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
 
-       vector org = boxToGlobal(eY * (me.selectedItem * me.itemHeight - me.scrollPos), me.origin, me.size);
-       vector sz = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), me.size);
+       float thisPos = me.getItemStart(me, me.selectedItem); 
+       float thisHeight = me.getItemHeight(me, me.selectedItem); 
+       vector org = boxToGlobal(eY * (thisPos - me.scrollPos), me.origin, me.size);
+       vector sz = boxToGlobalSize(eY * thisHeight + eX * (1 - me.controlWidth), me.size);
        DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
 }
 void XonoticServerList_doubleClickListBoxItem(entity me, int i, vector where)
@@ -781,8 +792,8 @@ void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool is
        vector oldscale = draw_scale;
        vector oldshift = draw_shift;
 #define SET_YRANGE(start,end) \
-       draw_scale = boxToGlobalSize(eX + eY * (end - start), oldscale); \
-       draw_shift = boxToGlobal(eY * start, oldshift, oldscale);
+       draw_scale = boxToGlobalSize(eX + eY * ((end) - (start)), oldscale); \
+       draw_shift = boxToGlobal(eY * (start), oldshift, oldscale);
 
        int c;
        for (c = 0; c < category_draw_count; ++c) {
@@ -819,6 +830,10 @@ void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool is
                }
        }
 
+       // Now categories are done. Set the Y range in stone.
+       oldscale = draw_scale;
+       oldshift = draw_shift;
+
        if(isSelected && !me.lockedSelectedItem)
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
        else if(isFocused)
@@ -965,7 +980,7 @@ void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool is
        // --------------
        vector iconSize = '0 0 0';
        iconSize_y = me.realFontSize.y * me.iconsSizeFactor;
-       iconSize_x = me.realFontSize.x * me.iconsSizeFactor;
+       iconSize_x = me.realFontSize.x * me.iconsSizeFactor * me.serversHeight;
 
        vector iconPos = '0 0 0';
        iconPos_x = (me.columnIconsSize - 3 * iconSize.x) * 0.5;
@@ -1034,6 +1049,12 @@ void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool is
        //  RENDER TEXT
        // --------------
 
+       // Center it in the row.
+       SET_YRANGE(
+               0.5 - 0.5 / me.serversHeight,
+               0.5 + 0.5 / me.serversHeight
+       );
+
        // ping
        s = ftos(ping);
        draw_Text(me.realUpperMargin * eY + (me.columnPingOrigin + me.columnPingSize - draw_TextWidth(s, 0, me.realFontSize)) * eX, s, me.realFontSize, theColor, theAlpha, 0);
@@ -1086,8 +1107,10 @@ bool XonoticServerList_keyDown(entity me, int scan, bool ascii, bool shift)
        {
                if(me.nItems != 0)
                {
-                       vector org = boxToGlobal(eY * (me.selectedItem * me.itemHeight - me.scrollPos), me.origin, me.size);
-                       vector sz = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), me.size);
+                       float thisPos = me.getItemStart(me, me.selectedItem); 
+                       float thisHeight = me.getItemHeight(me, me.selectedItem); 
+                       vector org = boxToGlobal(eY * (thisPos - me.scrollPos), me.origin, me.size);
+                       vector sz = boxToGlobalSize(eY * thisHeight + eX * (1 - me.controlWidth), me.size);
                        m_play_click_sound(MENU_SOUND_OPEN);
                        main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
                        DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
@@ -1117,44 +1140,41 @@ float XonoticServerList_getTotalHeight(entity me)
 {
        float num_normal_rows = me.nItems;
        int num_headers = category_draw_count;
-       return me.itemHeight * (num_normal_rows + me.categoriesHeight * num_headers);
+       return me.itemHeight * (me.serversHeight * num_normal_rows + me.categoriesHeight * num_headers);
 }
 int XonoticServerList_getItemAtPos(entity me, float pos)
 {
        pos = pos / me.itemHeight;
-       int i;
-       for (i = category_draw_count - 1; i >= 0; --i) {
+       for (int i = category_draw_count - 1; i >= 0; --i) {
                int itemidx = category_item[i];
-               float itempos = i * me.categoriesHeight + category_item[i];
-               if (pos >= itempos + me.categoriesHeight + 1)
-                       return itemidx + 1 + floor(pos - (itempos + me.categoriesHeight + 1));
+               float itempos = i * me.categoriesHeight + category_item[i] * me.serversHeight;
+               if (pos >= itempos + me.categoriesHeight + me.serversHeight)
+                       return itemidx + 1 + floor((pos - (itempos + me.categoriesHeight + me.serversHeight)) / me.serversHeight);
                if (pos >= itempos)
                        return itemidx;
        }
        // No category matches? Note that category 0 is... 0. Therefore no headings exist at all.
-       return floor(pos);
+       return floor(pos / me.serversHeight);
 }
 float XonoticServerList_getItemStart(entity me, int item)
 {
-       int i;
-       for (i = category_draw_count - 1; i >= 0; --i) {
+       for (int i = category_draw_count - 1; i >= 0; --i) {
                int itemidx = category_item[i];
-               float itempos = i * me.categoriesHeight + category_item[i];
+               float itempos = i * me.categoriesHeight + category_item[i] * me.serversHeight;
                if (item >= itemidx + 1)
-                       return (itempos + me.categoriesHeight + 1 + item - (itemidx + 1)) * me.itemHeight;
+                       return (itempos + me.categoriesHeight + (1 + item - (itemidx + 1)) * me.serversHeight) * me.itemHeight;
                if (item >= itemidx)
                        return itempos * me.itemHeight;
        }
        // No category matches? Note that category 0 is... 0. Therefore no headings exist at all.
-       return item * me.itemHeight;
+       return item * me.serversHeight * me.itemHeight;
 }
 float XonoticServerList_getItemHeight(entity me, int item)
 {
-       int i;
-       for (i = 0; i < category_draw_count; ++i) {
+       for (int i = 0; i < category_draw_count; ++i) {
                // Matches exactly the headings with increased height.
                if (item == category_item[i])
                        return me.itemHeight * (me.categoriesHeight + 1);
        }
-       return me.itemHeight;
+       return me.itemHeight * me.serversHeight;
 }