]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/nexuiz/serverlist.c
add somehow broken server list, far from done yet
[divverent/nexuiz.git] / data / qcsrc / menu-div0test / nexuiz / serverlist.c
1 #ifdef INTERFACE
2 CLASS(NexuizServerList) EXTENDS(NexuizListBox)
3         METHOD(NexuizServerList, configureNexuizServerList, void(entity))
4         ATTRIB(NexuizServerList, rowsPerItem, float, 1)
5         METHOD(NexuizServerList, draw, void(entity))
6         METHOD(NexuizServerList, drawListBoxItem, void(entity, float, vector, float))
7         METHOD(NexuizServerList, resizeNotify, void(entity, vector, vector, vector, vector))
8
9         ATTRIB(NexuizServerList, realFontSize, vector, '0 0 0')
10         ATTRIB(NexuizServerList, realUpperMargin, float, 0)
11         ATTRIB(NexuizServerList, columnPingOrigin, float, 0)
12         ATTRIB(NexuizServerList, columnPingSize, float, 0)
13         ATTRIB(NexuizServerList, columnNameOrigin, float, 0)
14         ATTRIB(NexuizServerList, columnNameSize, float, 0)
15         ATTRIB(NexuizServerList, columnMapOrigin, float, 0)
16         ATTRIB(NexuizServerList, columnMapSize, float, 0)
17         ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
18         ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
19 ENDCLASS(NexuizServerList)
20 entity makeNexuizServerList();
21 #endif
22
23 #ifdef IMPLEMENTATION
24
25 float SLIST_FIELD_CNAME;
26 float SLIST_FIELD_PING;
27 float SLIST_FIELD_GAME;
28 float SLIST_FIELD_MOD;
29 float SLIST_FIELD_MAP;
30 float SLIST_FIELD_NAME;
31 float SLIST_FIELD_MAXPLAYERS;
32 float SLIST_FIELD_NUMPLAYERS;
33 float SLIST_FIELD_NUMHUMANS;
34 float SLIST_FIELD_NUMBOTS;
35 float SLIST_FIELD_PROTOCOL;
36 void ServerList_UpdateFieldIDs()
37 {
38         SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
39         SLIST_FIELD_PING = gethostcacheindexforkey( "ping" );
40         SLIST_FIELD_GAME = gethostcacheindexforkey( "game" );
41         SLIST_FIELD_MOD = gethostcacheindexforkey( "mod" );
42         SLIST_FIELD_MAP = gethostcacheindexforkey( "map" );
43         SLIST_FIELD_NAME = gethostcacheindexforkey( "name" );
44         SLIST_FIELD_MAXPLAYERS = gethostcacheindexforkey( "maxplayers" );
45         SLIST_FIELD_NUMPLAYERS = gethostcacheindexforkey( "numplayers" );
46         SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey( "numhumans" );
47         SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
48         SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
49 }
50
51 entity makeNexuizServerList()
52 {
53         entity me;
54         me = spawnNexuizServerList();
55         me.configureNexuizServerList(me);
56         return me;
57 }
58 void configureNexuizServerListNexuizServerList(entity me)
59 {
60         me.configureNexuizListBox(me);
61
62         ServerList_UpdateFieldIDs();
63         resethostcachemasks();
64         refreshhostcache();
65
66         me.nItems = 0;
67 }
68 void drawNexuizServerList(entity me)
69 {
70         me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
71         drawListBox(me);
72 }
73 void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
74 {
75         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
76
77         me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
78         me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
79         me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
80
81         me.columnPingOrigin = 0;
82         me.columnPingSize = me.realFontSize_x * 4;
83         me.columnMapSize = me.realFontSize_x * 12;
84         me.columnPlayersSize = me.realFontSize_x * 6;
85         me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - 3 * me.realFontSize_x;
86         me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
87         me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
88         me.columnPlayersOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
89 }
90 void drawListBoxItemNexuizServerList(entity me, float i, vector absSize, float isSelected)
91 {
92         // layout: Ping, Server name, Map name, NP, TP, MP
93         string s;
94         float p;
95         vector theColor;
96         float theAlpha;
97
98         if(isSelected)
99                 draw_Fill('0 0 0', '1 1 0', '0 0 1', 0.5);
100
101         if(gethostcachenumber(SLIST_FIELD_NUMPLAYERS, i) >= gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i))
102                 theAlpha = 0.2;
103         else if(!gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
104                 theAlpha = 0.5;
105         else
106                 theAlpha = 1;
107         
108         p = gethostcachenumber(SLIST_FIELD_PING, i);
109         if(p < 50)
110                 theColor = eX * (p / 50) + eY;
111         else if(p < 150)
112                 theColor = eX + eY * ((150 - p) / 100);
113         else if(p < 650)
114         {
115                 theColor = eX;
116                 theAlpha *= (650 - p) / 500;
117         }
118         
119         s = ftos(p);
120         draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha);
121         s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize / me.realFontSize_x);
122         draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha);
123         s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize / me.realFontSize_x);
124         draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
125         s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
126         draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
127 }
128 #endif