]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/serverlist.c
Merge remote-tracking branch 'origin/terencehill/reload_binds', closes #1360
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / serverlist.c
index 82fdbfb5eb40d4bcfcefb45cd47c383a5421710c..9e49626023375b96651e5fa13bc4c2e50d0f6c54 100644 (file)
@@ -64,9 +64,7 @@ void ServerList_Filter_Change(entity box, entity me);
 void ServerList_Favorite_Click(entity btn, entity me);
 void ServerList_Info_Click(entity btn, entity me);
 void ServerList_Update_favoriteButton(entity btn, entity me);
-#endif
 
-#ifdef IMPLEMENTATION
 float SLIST_FIELD_CNAME;
 float SLIST_FIELD_PING;
 float SLIST_FIELD_GAME;
@@ -82,6 +80,9 @@ float SLIST_FIELD_FREESLOTS;
 float SLIST_FIELD_PLAYERS;
 float SLIST_FIELD_QCSTATUS;
 float SLIST_FIELD_ISFAVORITE;
+#endif
+
+#ifdef IMPLEMENTATION
 void ServerList_UpdateFieldIDs()
 {
        SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
@@ -600,13 +601,14 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        vector theColor;
        float theAlpha;
        float m, pure, freeslots, j, sflags;
-       string s, typestr, versionstr, k, v;
+       string s, typestr, versionstr, k, v, modname;
 
        if(isSelected)
                draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
 
        s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
        m = tokenizebyseparator(s, ":");
+       typestr = "";
        if(m >= 2)
        {
                typestr = argv(0);
@@ -614,6 +616,8 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        }
        freeslots = -1;
        sflags = -1;
+       modname = "";
+       pure = 0;
        for(j = 2; j < m; ++j)
        {
                if(argv(j) == "")
@@ -626,8 +630,31 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
                        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
+
+       /*
+       SLIST_FIELD_MOD = gethostcacheindexforkey("mod");
+       s = gethostcachestring(SLIST_FIELD_MOD, i);
+       if(s != "data")
+               if(modname == "Xonotic")
+                       modname = s;
+       */
+
+       // list the mods here on which the pure server check actually works
+       if(modname != "Xonotic")
+       if(modname != "MinstaGib")
+       if(modname != "CTS")
+       if(modname != "NIX")
+       if(modname != "NewToys")
+               pure = 0;
+
        if(gethostcachenumber(SLIST_FIELD_FREESLOTS, i) <= 0)
                theAlpha = SKINALPHA_SERVERLIST_FULL;
        else if(freeslots == 0)
@@ -706,37 +733,64 @@ void XonoticServerList_drawListBoxItem(entity me, float i, vector absSize, float
        // 5: AES required
 
        {
-               vector iconSize;
+               vector iconSize = '0 0 0';
                iconSize_y = me.realFontSize_y * me.iconsSizeFactor;
                iconSize_x = me.realFontSize_x * me.iconsSizeFactor;
 
-               vector iconPos;
+               vector iconPos = '0 0 0';
                iconPos_x = (me.columnIconsSize - 3 * iconSize_x) * 0.5;
                iconPos_y = (1 - iconSize_y) * 0.5;
 
+               string n;
+
                if not(me.seenIPv4 && me.seenIPv6)
                {
                        iconPos_x += iconSize_x * 0.5;
                }
                else if(me.seenIPv4 && me.seenIPv6)
                {
+                       n = string_null;
                        if(isv6)
-                               draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_ipv6"), iconSize, '1 1 1', 1);
+                               draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_ipv6"), 0); // PRECACHE_PIC_MIPMAP
                        else if(isv4)
-                               draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_ipv4"), iconSize, '1 1 1', 1);
+                               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;
                }
 
                if(q > 0)
-                       draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), iconSize, '1 1 1', 1);
+               {
+                       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;
 
-               if(pure == 0)
-                       draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_pure1"), iconSize, '1 1 1', 1);
+               if(modname == "Xonotic")
+               {
+                       if(pure == 0)
+                       {
+                               draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_pure1"), PRECACHE_PIC_MIPMAP);
+                               draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
+                       }
+               }
+               else
+               {
+                       draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_mod_", modname), PRECACHE_PIC_MIPMAP);
+                       if(draw_PictureSize(n) == '0 0 0')
+                               draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_mod_"), PRECACHE_PIC_MIPMAP);
+                       if(pure == 0)
+                               draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
+                       else
+                               draw_Picture(iconPos, n, iconSize, '1 1 1', SKINALPHA_SERVERLIST_ICON_NONPURE);
+               }
                iconPos_x += iconSize_x;
 
                if(sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS))
-                               draw_Picture(iconPos, strcat(SKINGFX_SERVERLIST_ICON, "_stats1"), iconSize, '1 1 1', 1);
+               {
+                       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;
        }
 
@@ -771,7 +825,9 @@ float XonoticServerList_keyDown(entity me, float scan, float ascii, float shift)
                {
                        main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
                        DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
+                       return 1;
                }
+               return 0;
        }
        else if(scan == K_INS || scan == K_MOUSE3 || scan == K_KP_INS)
        {
@@ -780,7 +836,9 @@ float XonoticServerList_keyDown(entity me, float scan, float ascii, float shift)
                {
                        ToggleFavorite(me.selectedServer);
                        me.ipAddressBoxFocused = -1;
+                       return 1;
                }
+               return 0;
        }
        else if(SUPER(XonoticServerList).keyDown(me, scan, ascii, shift))
                return 1;