Listbox: highlight item under the cursor
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / serverlist.qc
index 50ce594..6eb169d 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticServerList) EXTENDS(XonoticListBox)
        METHOD(XonoticServerList, configureXonoticServerList, void(entity))
        ATTRIB(XonoticServerList, rowsPerItem, float, 1)
        METHOD(XonoticServerList, draw, void(entity))
-       METHOD(XonoticServerList, drawListBoxItem, void(entity, float, vector, float))
+       METHOD(XonoticServerList, drawListBoxItem, void(entity, int, vector, bool, float))
        METHOD(XonoticServerList, doubleClickListBoxItem, void(entity, float, vector))
        METHOD(XonoticServerList, resizeNotify, void(entity, vector, vector, vector, vector))
        METHOD(XonoticServerList, keyDown, float(entity, float, float, float))
@@ -65,14 +65,14 @@ entity makeXonoticServerList();
 
 #ifndef IMPLEMENTATION
 float autocvar_menu_slist_categories;
-float autocvar_menu_slist_categories_onlyifmultiple; 
+float autocvar_menu_slist_categories_onlyifmultiple;
 float autocvar_menu_slist_purethreshold;
 float autocvar_menu_slist_modimpurity;
 float autocvar_menu_slist_recommendations;
 float autocvar_menu_slist_recommendations_maxping;
-float autocvar_menu_slist_recommendations_minfreeslots; 
+float autocvar_menu_slist_recommendations_minfreeslots;
 float autocvar_menu_slist_recommendations_minhumans;
-float autocvar_menu_slist_recommendations_purethreshold; 
+float autocvar_menu_slist_recommendations_purethreshold;
 
 // server cache fields
 #define SLIST_FIELDS \
@@ -111,7 +111,7 @@ float IsServerInList(string list, string srv);
 entity RetrieveCategoryEnt(float catnum);
 
 float CheckCategoryOverride(float cat);
-float CheckCategoryForEntry(float entry); 
+float CheckCategoryForEntry(float entry);
 float m_gethostcachecategory(float entry) { return CheckCategoryOverride(CheckCategoryForEntry(entry)); }
 
 void RegisterSLCategories();
@@ -126,10 +126,10 @@ void ServerList_Info_Click(entity btn, entity me);
 void ServerList_Update_favoriteButton(entity btn, entity me);
 
 // fields for category entities
-const float MAX_CATEGORIES = 9;
-const float CATEGORY_FIRST = 1;
+const int MAX_CATEGORIES = 9;
+const int CATEGORY_FIRST = 1;
 entity categories[MAX_CATEGORIES];
-float category_ent_count;
+int category_ent_count;
 .string cat_name;
 .string cat_string;
 .string cat_enoverride_string;
@@ -138,9 +138,9 @@ float category_ent_count;
 .float cat_dioverride;
 
 // fields for drawing categories
-float category_name[MAX_CATEGORIES];
-float category_item[MAX_CATEGORIES];
-float category_draw_count;
+int category_name[MAX_CATEGORIES];
+int category_item[MAX_CATEGORIES];
+int category_draw_count;
 
 #define SLIST_CATEGORIES \
        SLIST_CATEGORY(CAT_FAVORITED,    "",            "",             ZCTX(_("SLCAT^Favorites"))) \
@@ -155,8 +155,8 @@ float category_draw_count;
 
 #define SLIST_CATEGORY_AUTOCVAR(name) autocvar_menu_slist_categories_##name##_override
 #define SLIST_CATEGORY(name,enoverride,dioverride,str) \
-       float name; \
-       var string SLIST_CATEGORY_AUTOCVAR(name) = enoverride;
+       int name; \
+       string SLIST_CATEGORY_AUTOCVAR(name) = enoverride;
 SLIST_CATEGORIES
 #undef SLIST_CATEGORY
 
@@ -180,7 +180,7 @@ void RegisterSLCategories()
        SLIST_CATEGORIES
        #undef SLIST_CATEGORY
 
-       float i, x, catnum;
+       int i, x, catnum;
        string s;
 
        #define PROCESS_OVERRIDE(override_string,override_field) \
@@ -219,7 +219,7 @@ void RegisterSLCategories()
 }
 
 // Supporting Functions
-entity RetrieveCategoryEnt(float catnum)
+entity RetrieveCategoryEnt(int catnum)
 {
        if((catnum > 0) && (catnum <= category_ent_count))
        {
@@ -232,15 +232,15 @@ entity RetrieveCategoryEnt(float catnum)
        }
 }
 
-float IsServerInList(string list, string srv)
+bool IsServerInList(string list, string srv)
 {
        string p;
-       float i, n;
+       int i, n;
        if(srv == "")
-               return FALSE;
+               return false;
        srv = netaddress_resolve(srv, 26000);
        if(srv == "")
-               return FALSE;
+               return false;
        p = crypto_getidfp(srv);
        n = tokenize_console(list);
        for(i = 0; i < n; ++i)
@@ -249,23 +249,23 @@ float IsServerInList(string list, string srv)
                {
                        if(p)
                                if(argv(i) == p)
-                                       return TRUE;
+                                       return true;
                }
                else
                {
                        if(srv == netaddress_resolve(argv(i), 26000))
-                               return TRUE;
+                               return true;
                }
        }
-       return FALSE;
+       return false;
 }
 
-float CheckCategoryOverride(float cat)
+int CheckCategoryOverride(int cat)
 {
        entity catent = RetrieveCategoryEnt(cat);
        if(catent)
        {
-               float override = (autocvar_menu_slist_categories ? catent.cat_enoverride : catent.cat_dioverride); 
+               int override = (autocvar_menu_slist_categories ? catent.cat_enoverride : catent.cat_dioverride);
                if(override) { return override; }
                else { return cat; }
        }
@@ -276,10 +276,10 @@ float CheckCategoryOverride(float cat)
        }
 }
 
-float CheckCategoryForEntry(float entry)
+int CheckCategoryForEntry(int entry)
 {
        string s, k, v, modtype = "";
-       float j, m, impure = 0, freeslots = 0, sflags = 0;
+       int j, m, impure = 0, freeslots = 0, sflags = 0;
        s = gethostcachestring(SLIST_FIELD_QCSTATUS, entry);
        m = tokenizebyseparator(s, ":");
 
@@ -306,7 +306,7 @@ float CheckCategoryForEntry(float entry)
        if(autocvar_menu_slist_recommendations)
        {
                string cname = gethostcachestring(SLIST_FIELD_CNAME, entry);
-               
+
                if(IsPromoted(cname)) { return CAT_RECOMMENDED; }
                else
                {
@@ -321,21 +321,21 @@ float CheckCategoryForEntry(float entry)
                                if(
                                        ///// check for minimum free slots
                                        (freeslots >= autocvar_menu_slist_recommendations_minfreeslots)
-                                       
+
                                        && // check for purity requirement
                                        (
                                                (autocvar_menu_slist_recommendations_purethreshold < 0)
                                                ||
                                                (impure <= autocvar_menu_slist_recommendations_purethreshold)
                                        )
-                                       
+
                                        && // check for minimum amount of humans
                                        (
                                                gethostcachenumber(SLIST_FIELD_NUMHUMANS, entry)
                                                >=
                                                autocvar_menu_slist_recommendations_minhumans
                                        )
-                                       
+
                                        && // check for maximum latency
                                        (
                                                gethostcachenumber(SLIST_FIELD_PING, entry)
@@ -358,7 +358,7 @@ float CheckCategoryForEntry(float entry)
                {
                        // old servers which don't report their mod name are considered modified now
                        case "": { return CAT_MODIFIED; }
-                       
+
                        case "xpm": { return CAT_XPM; }
                        case "minstagib":
                        case "instagib": { return CAT_INSTAGIB; }
@@ -367,9 +367,9 @@ float CheckCategoryForEntry(float entry)
                        //case "newtoys": { return CAT_NEWTOYS; }
 
                        // "cts" is allowed as compat, xdf is replacement
-                       case "cts": 
+                       case "cts":
                        case "xdf": { return CAT_DEFRAG; }
-                       
+
                        default: { dprintf("Found strange mod type: %s\n", modtype); return CAT_MODIFIED; }
                }
        }
@@ -381,12 +381,12 @@ float CheckCategoryForEntry(float entry)
 void XonoticServerList_toggleFavorite(entity me, string srv)
 {
        string s, s0, s1, s2, srv_resolved, p;
-       float i, n, f;
+       int i, n;
+       bool f = false;
        srv_resolved = netaddress_resolve(srv, 26000);
        p = crypto_getidfp(srv_resolved);
        s = cvar_string("net_slist_favorites");
        n = tokenize_console(s);
-       f = 0;
        for(i = 0; i < n; ++i)
        {
                if(substring(argv(i), 0, 1) != "[" && strlen(argv(i)) == 44 && strstrofs(argv(i), ".", 0) < 0)
@@ -410,7 +410,7 @@ void XonoticServerList_toggleFavorite(entity me, string srv)
                cvar_set("net_slist_favorites", strcat(s0, s1, s2));
                s = cvar_string("net_slist_favorites");
                n = tokenize_console(s);
-               f = 1;
+               f = true;
                --i;
        }
 
@@ -456,10 +456,9 @@ void XonoticServerList_configureXonoticServerList(entity me)
        // clear list
        me.nItems = 0;
 }
-void XonoticServerList_setSelected(entity me, float i)
+void XonoticServerList_setSelected(entity me, int i)
 {
-       float save;
-       save = me.selectedItem;
+       //int save = me.selectedItem;
        SUPER(XonoticServerList).setSelected(me, i);
        /*
        if(me.selectedItem == save)
@@ -478,14 +477,15 @@ void XonoticServerList_setSelected(entity me, float i)
        me.ipAddressBox.cursorPos = strlen(me.selectedServer);
        me.ipAddressBoxFocused = -1;
 }
-void XonoticServerList_refreshServerList(entity me, float mode)
+void XonoticServerList_refreshServerList(entity me, int mode)
 {
        //print("refresh of type ", ftos(mode), "\n");
 
        if(mode >= REFRESHSERVERLIST_REFILTER)
        {
-               float m, i, n;
-               float listflags = 0;
+               float m;
+               int i, n;
+               int listflags = 0;
                string s, typestr, modstr;
 
                s = me.filterString;
@@ -554,13 +554,14 @@ void XonoticServerList_refreshServerList(entity me, float mode)
                if(me.currentSortOrder < 0) { listflags |= SLSF_DESCENDING; }
                sethostcachesort(me.currentSortField, listflags);
        }
-       
+
        resorthostcache();
        if(mode >= REFRESHSERVERLIST_ASK)
                refreshhostcache(mode >= REFRESHSERVERLIST_RESET);
 }
 void XonoticServerList_focusEnter(entity me)
 {
+       SUPER(XonoticServerList).focusEnter(me);
        if(time < me.nextRefreshTime)
        {
                //print("sorry, no refresh yet\n");
@@ -572,7 +573,8 @@ void XonoticServerList_focusEnter(entity me)
 
 void XonoticServerList_draw(entity me)
 {
-       float i, found, owned;
+       int i;
+       bool found = false, owned;
 
        if(_Nex_ExtResponseSystem_BannedServersNeedsRefresh)
        {
@@ -624,7 +626,7 @@ void XonoticServerList_draw(entity me)
        {
                float itemcount = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
                me.nItems = itemcount;
-               
+
                //float visible = floor(me.scrollPos / me.itemHeight);
                // ^ unfortunately no such optimization can be made-- we must process through the
                // entire list, otherwise there is no way to know which item is first in its category.
@@ -713,7 +715,6 @@ void XonoticServerList_draw(entity me)
        me.infoButton.disabled = ((me.nItems == 0) || !owned);
        me.favoriteButton.disabled = ((me.nItems == 0) && (me.ipAddressBox.text == ""));
 
-       found = 0;
        if(me.selectedServer)
        {
                for(i = 0; i < me.nItems; ++i)
@@ -721,7 +722,7 @@ void XonoticServerList_draw(entity me)
                        if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
                        {
                                me.selectedItem = i;
-                               found = 1;
+                               found = true;
                                break;
                        }
                }
@@ -737,7 +738,7 @@ void XonoticServerList_draw(entity me)
                        me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
                }
        }
-       
+
        if(owned)
        {
                if(me.selectedServer != me.ipAddressBox.text)
@@ -860,7 +861,7 @@ void ServerList_ShowFull_Click(entity box, entity me)
        me.ipAddressBox.cursorPos = 0;
        me.ipAddressBoxFocused = -1;
 }
-void XonoticServerList_setSortOrder(entity me, float fld, float direction)
+void XonoticServerList_setSortOrder(entity me, int fld, int direction)
 {
        if(me.currentSortField == fld)
                direction = -me.currentSortOrder;
@@ -887,8 +888,8 @@ void XonoticServerList_positionSortButton(entity me, entity btn, float theOrigin
        originInDialogSpace = boxToGlobal(originInLBSpace, me.Container_origin, me.Container_size);
        sizeInDialogSpace = boxToGlobalSize(sizeInLBSpace, me.Container_size);
 
-       btn.Container_origin_x = originInDialogSpace_x + sizeInDialogSpace_x * theOrigin;
-       btn.Container_size_x   =                         sizeInDialogSpace_x * theSize;
+       btn.Container_origin_x = originInDialogSpace.x + sizeInDialogSpace.x * theOrigin;
+       btn.Container_size_x   =                         sizeInDialogSpace.x * theSize;
        btn.setText(btn, theTitle);
        btn.onClick = theFunc;
        btn.onClickEntity = me;
@@ -898,22 +899,22 @@ void XonoticServerList_resizeNotify(entity me, vector relOrigin, vector relSize,
 {
        SUPER(XonoticServerList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
 
-       me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
-       me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
-       me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+       me.realFontSize_y = me.fontSize / (absSize.y * me.itemHeight);
+       me.realFontSize_x = me.fontSize / (absSize.x * (1 - me.controlWidth));
+       me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
 
        me.columnIconsOrigin = 0;
-       me.columnIconsSize = me.realFontSize_x * 4 * me.iconsSizeFactor;
-       me.columnPingSize = me.realFontSize_x * 3;
-       me.columnMapSize = me.realFontSize_x * 10;
-       me.columnTypeSize = me.realFontSize_x * 4;
-       me.columnPlayersSize = me.realFontSize_x * 5;
-       me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - me.columnIconsSize - me.columnTypeSize - 5 * me.realFontSize_x;
-       me.columnPingOrigin = me.columnIconsOrigin + me.columnIconsSize + me.realFontSize_x;
-       me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
-       me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
-       me.columnTypeOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
-       me.columnPlayersOrigin = me.columnTypeOrigin + me.columnTypeSize + me.realFontSize_x;
+       me.columnIconsSize = me.realFontSize.x * 4 * me.iconsSizeFactor;
+       me.columnPingSize = me.realFontSize.x * 3;
+       me.columnMapSize = me.realFontSize.x * 10;
+       me.columnTypeSize = me.realFontSize.x * 4;
+       me.columnPlayersSize = me.realFontSize.x * 5;
+       me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - me.columnIconsSize - me.columnTypeSize - 5 * me.realFontSize.x;
+       me.columnPingOrigin = me.columnIconsOrigin + me.columnIconsSize + me.realFontSize.x;
+       me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize.x;
+       me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize.x;
+       me.columnTypeOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize.x;
+       me.columnPlayersOrigin = me.columnTypeOrigin + me.columnTypeSize + me.realFontSize.x;
 
        me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, _("Ping"), ServerList_PingSort_Click);
        me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, _("Host name"), ServerList_NameSort_Click);
@@ -921,8 +922,7 @@ void XonoticServerList_resizeNotify(entity me, vector relOrigin, vector relSize,
        me.positionSortButton(me, me.sortButton4, me.columnTypeOrigin, me.columnTypeSize, _("Type"), ServerList_TypeSort_Click);
        me.positionSortButton(me, me.sortButton5, me.columnPlayersOrigin, me.columnPlayersSize, _("Players"), ServerList_PlayerSort_Click);
 
-       float f;
-       f = me.currentSortField;
+       int f = me.currentSortField;
        if(f >= 0)
        {
                me.currentSortField = -1;
@@ -943,6 +943,7 @@ void ServerList_Favorite_Click(entity btn, entity me)
        ipstr = netaddress_resolve(me.ipAddressBox.text, 26000);
        if(ipstr != "")
        {
+               m_play_click_sound(MENU_SOUND_SELECT);
                me.toggleFavorite(me, me.ipAddressBox.text);
                me.ipAddressBoxFocused = -1;
        }
@@ -956,18 +957,20 @@ void ServerList_Info_Click(entity btn, entity me)
        vector sz = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), me.size);
        DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
 }
-void XonoticServerList_doubleClickListBoxItem(entity me, float i, vector where)
+void XonoticServerList_doubleClickListBoxItem(entity me, int i, vector where)
 {
        ServerList_Connect_Click(NULL, me);
 }
-void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
+void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, float highlightedTime)
 {
        // layout: Ping, Server name, Map name, NP, TP, MP
-       float p, q;
-       float isv4, isv6;
+       float p;
+       int q;
+       bool isv4, isv6;
        vector theColor;
        float theAlpha;
-       float m, pure, freeslots, j, sflags;
+       bool pure = false;
+       int freeslots = -1, sflags = -1, j, m;
        string s, typestr, versionstr, k, v, modname;
 
        //printf("time: %f, i: %d, item: %d, nitems: %d\n", time, i, item, me.nItems);
@@ -1011,9 +1014,11 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                        SET_YRANGE(me.categoriesHeight / (me.categoriesHeight + 1), 1);
                }
        }
-       
+
        if(isSelected)
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+       else if(highlightedTime)
+               draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, getHighlightAlpha(SKINALPHA_LISTBOX_SELECTED * 0.1, highlightedTime));
 
        s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
        m = tokenizebyseparator(s, ":");
@@ -1024,9 +1029,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                versionstr = argv(1);
        }
        freeslots = -1;
-       sflags = -1;
        modname = "";
-       pure = 0;
        for(j = 2; j < m; ++j)
        {
                if(argv(j) == "")
@@ -1034,11 +1037,11 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                k = substring(argv(j), 0, 1);
                v = substring(argv(j), 1, -1);
                if(k == "P")
-                       pure = stof(v);
+                       pure = stob(v);
                else if(k == "S")
                        freeslots = stof(v);
                else if(k == "F")
-                       sflags = stof(v);
+                       sflags = stoi(v);
                else if(k == "M")
                        modname = v;
        }
@@ -1062,7 +1065,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        if(modname != "CTS")
        if(modname != "NIX")
        if(modname != "NewToys")
-               pure = 0;
+               pure = false;
 
        if(gethostcachenumber(SLIST_FIELD_FREESLOTS, i) <= 0)
                theAlpha = SKINALPHA_SERVERLIST_FULL;
@@ -1074,9 +1077,9 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                theAlpha = 1;
 
        p = gethostcachenumber(SLIST_FIELD_PING, i);
-       const float PING_LOW = 75;
-       const float PING_MED = 200;
-       const float PING_HIGH = 500;
+       const int PING_LOW = 75;
+       const int PING_MED = 200;
+       const int PING_HIGH = 500;
        if(p < PING_LOW)
                theColor = SKINCOLOR_SERVERLIST_LOWPING + (SKINCOLOR_SERVERLIST_MEDPING - SKINCOLOR_SERVERLIST_LOWPING) * (p / PING_LOW);
        else if(p < PING_MED)
@@ -1100,15 +1103,15 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
 
        s = gethostcachestring(SLIST_FIELD_CNAME, i);
 
-       isv4 = isv6 = 0;
+       isv4 = isv6 = false;
        if(substring(s, 0, 1) == "[")
        {
-               isv6 = 1;
+               isv6 = true;
                me.seenIPv6 += 1;
        }
        else if(strstrofs("0123456789", substring(s, 0, 1), 0) >= 0)
        {
-               isv4 = 1;
+               isv4 = true;
                me.seenIPv4 += 1;
        }
 
@@ -1145,18 +1148,18 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        //  RENDER ICONS
        // --------------
        vector iconSize = '0 0 0';
-       iconSize_y = me.realFontSize_y * me.iconsSizeFactor;
-       iconSize_x = me.realFontSize_x * me.iconsSizeFactor;
+       iconSize_y = me.realFontSize.y * me.iconsSizeFactor;
+       iconSize_x = me.realFontSize.x * me.iconsSizeFactor;
 
        vector iconPos = '0 0 0';
-       iconPos_x = (me.columnIconsSize - 3 * iconSize_x) * 0.5;
-       iconPos_y = (1 - iconSize_y) * 0.5;
+       iconPos_x = (me.columnIconsSize - 3 * iconSize.x) * 0.5;
+       iconPos_y = (1 - iconSize.y) * 0.5;
 
        string n;
 
        if (!(me.seenIPv4 && me.seenIPv6))
        {
-               iconPos_x += iconSize_x * 0.5;
+               iconPos.x += iconSize.x * 0.5;
        }
        else if(me.seenIPv4 && me.seenIPv6)
        {
@@ -1167,7 +1170,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                        draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_ipv4"), 0); // PRECACHE_PIC_MIPMAP
                if(n)
                        draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
-               iconPos_x += iconSize_x;
+               iconPos.x += iconSize.x;
        }
 
        if(q > 0)
@@ -1175,7 +1178,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), 0); // PRECACHE_PIC_MIPMAP
                draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
        }
-       iconPos_x += iconSize_x;
+       iconPos.x += iconSize.x;
 
        if(modname == "Xonotic")
        {
@@ -1195,19 +1198,19 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                else
                        draw_Picture(iconPos, n, iconSize, '1 1 1', SKINALPHA_SERVERLIST_ICON_NONPURE);
        }
-       iconPos_x += iconSize_x;
+       iconPos.x += iconSize.x;
 
        if(sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS))
        {
                draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_stats1"), 0); // PRECACHE_PIC_MIPMAP
                draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
        }
-       iconPos_x += iconSize_x;
-       
+       iconPos.x += iconSize.x;
+
        // --------------
        //  RENDER TEXT
        // --------------
-       
+
        // ping
        s = ftos(p);
        draw_Text(me.realUpperMargin * eY + (me.columnPingOrigin + me.columnPingSize - draw_TextWidth(s, 0, me.realFontSize)) * eX, s, me.realFontSize, theColor, theAlpha, 0);
@@ -1229,7 +1232,7 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 }
 
-float XonoticServerList_keyDown(entity me, float scan, float ascii, float shift)
+bool XonoticServerList_keyDown(entity me, int scan, bool ascii, bool shift)
 {
        vector org, sz;
 
@@ -1239,17 +1242,18 @@ float XonoticServerList_keyDown(entity me, float scan, float ascii, float shift)
        if(scan == K_ENTER || scan == K_KP_ENTER)
        {
                ServerList_Connect_Click(NULL, me);
-               return 1;
+               return true;
        }
        else if(scan == K_MOUSE2 || scan == K_SPACE)
        {
                if(me.nItems != 0)
                {
+                       m_play_click_sound(MENU_SOUND_OPEN);
                        main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
                        DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
-                       return 1;
+                       return true;
                }
-               return 0;
+               return false;
        }
        else if(scan == K_INS || scan == K_MOUSE3 || scan == K_KP_INS)
        {
@@ -1257,28 +1261,30 @@ float XonoticServerList_keyDown(entity me, float scan, float ascii, float shift)
                {
                        me.toggleFavorite(me, me.selectedServer);
                        me.ipAddressBoxFocused = -1;
-                       return 1;
+                       return true;
                }
-               return 0;
+               return false;
        }
        else if(SUPER(XonoticServerList).keyDown(me, scan, ascii, shift))
-               return 1;
+               return true;
        else if(!me.controlledTextbox)
-               return 0;
+               return false;
        else
                return me.controlledTextbox.keyDown(me.controlledTextbox, scan, ascii, shift);
 }
 
-float XonoticServerList_getTotalHeight(entity me) {
+float XonoticServerList_getTotalHeight(entity me)
+{
        float num_normal_rows = me.nItems;
-       float num_headers = category_draw_count;
+       int num_headers = category_draw_count;
        return me.itemHeight * (num_normal_rows + me.categoriesHeight * num_headers);
 }
-float XonoticServerList_getItemAtPos(entity me, float pos) {
+int XonoticServerList_getItemAtPos(entity me, float pos)
+{
        pos = pos / me.itemHeight;
-       float i;
+       int i;
        for (i = category_draw_count - 1; i >= 0; --i) {
-               float itemidx = category_item[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));
@@ -1288,10 +1294,11 @@ float XonoticServerList_getItemAtPos(entity me, float pos) {
        // No category matches? Note that category 0 is... 0. Therefore no headings exist at all.
        return floor(pos);
 }
-float XonoticServerList_getItemStart(entity me, float item) {
-       float i;
+float XonoticServerList_getItemStart(entity me, int item)
+{
+       int i;
        for (i = category_draw_count - 1; i >= 0; --i) {
-               float itemidx = category_item[i];
+               int itemidx = category_item[i];
                float itempos = i * me.categoriesHeight + category_item[i];
                if (item >= itemidx + 1)
                        return (itempos + me.categoriesHeight + 1 + item - (itemidx + 1)) * me.itemHeight;
@@ -1301,8 +1308,9 @@ float XonoticServerList_getItemStart(entity me, float item) {
        // No category matches? Note that category 0 is... 0. Therefore no headings exist at all.
        return item * me.itemHeight;
 }
-float XonoticServerList_getItemHeight(entity me, float item) {
-       float i;
+float XonoticServerList_getItemHeight(entity me, int item)
+{
+       int i;
        for (i = 0; i < category_draw_count; ++i) {
                // Matches exactly the headings with increased height.
                if (item == category_item[i])