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, clickListBoxItem, void(entity, float, vector))
8 METHOD(NexuizServerList, resizeNotify, void(entity, vector, vector, vector, vector))
10 ATTRIB(NexuizServerList, realFontSize, vector, '0 0 0')
11 ATTRIB(NexuizServerList, realUpperMargin, float, 0)
12 ATTRIB(NexuizServerList, columnPingOrigin, float, 0)
13 ATTRIB(NexuizServerList, columnPingSize, float, 0)
14 ATTRIB(NexuizServerList, columnNameOrigin, float, 0)
15 ATTRIB(NexuizServerList, columnNameSize, float, 0)
16 ATTRIB(NexuizServerList, columnMapOrigin, float, 0)
17 ATTRIB(NexuizServerList, columnMapSize, float, 0)
18 ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
19 ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
21 ATTRIB(NexuizServerList, selectedServer, string, string_null) // to restore selected server when needed
22 METHOD(NexuizServerList, setSelected, void(entity, float))
23 METHOD(NexuizServerList, setSortOrder, void(entity, float, float))
24 ATTRIB(NexuizServerList, nextRefreshTime, float, 0)
25 METHOD(NexuizServerList, refreshServerList, void(entity, float)) // refresh mode: 0 = just reparametrize, 1 = send new requests, 2 = clear
26 ATTRIB(NexuizServerList, needsRefresh, float, 1)
27 METHOD(NexuizServerList, focusEnter, void(entity))
28 METHOD(NexuizServerList, positionSortButton, void(entity, entity, float, float, string, void(entity, entity)))
29 ATTRIB(NexuizServerList, sortButton1, entity, NULL)
30 ATTRIB(NexuizServerList, sortButton2, entity, NULL)
31 ATTRIB(NexuizServerList, sortButton3, entity, NULL)
32 ATTRIB(NexuizServerList, sortButton4, entity, NULL)
33 ATTRIB(NexuizServerList, connectButton, entity, NULL)
34 ATTRIB(NexuizServerList, currentSortOrder, float, 0)
35 ATTRIB(NexuizServerList, currentSortField, float, -1)
36 ATTRIB(NexuizServerList, lastClickedServer, float, -1)
37 ATTRIB(NexuizServerList, lastClickedTime, float, 0)
38 ENDCLASS(NexuizServerList)
39 entity makeNexuizServerList();
40 void ServerList_Connect_Click(entity btn, entity me);
41 void ServerList_Refresh_Click(entity btn, entity me);
45 float SLIST_FIELD_CNAME;
46 float SLIST_FIELD_PING;
47 float SLIST_FIELD_GAME;
48 float SLIST_FIELD_MOD;
49 float SLIST_FIELD_MAP;
50 float SLIST_FIELD_NAME;
51 float SLIST_FIELD_MAXPLAYERS;
52 float SLIST_FIELD_NUMPLAYERS;
53 float SLIST_FIELD_NUMHUMANS;
54 float SLIST_FIELD_NUMBOTS;
55 float SLIST_FIELD_PROTOCOL;
56 float SLIST_FIELD_FREESLOTS;
57 void ServerList_UpdateFieldIDs()
59 SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
60 SLIST_FIELD_PING = gethostcacheindexforkey( "ping" );
61 SLIST_FIELD_GAME = gethostcacheindexforkey( "game" );
62 SLIST_FIELD_MOD = gethostcacheindexforkey( "mod" );
63 SLIST_FIELD_MAP = gethostcacheindexforkey( "map" );
64 SLIST_FIELD_NAME = gethostcacheindexforkey( "name" );
65 SLIST_FIELD_MAXPLAYERS = gethostcacheindexforkey( "maxplayers" );
66 SLIST_FIELD_NUMPLAYERS = gethostcacheindexforkey( "numplayers" );
67 SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey( "numhumans" );
68 SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
69 SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
70 SLIST_FIELD_FREESLOTS = gethostcacheindexforkey( "freeslots" );
73 entity makeNexuizServerList()
76 me = spawnNexuizServerList();
77 me.configureNexuizServerList(me);
80 void configureNexuizServerListNexuizServerList(entity me)
82 me.configureNexuizListBox(me);
84 ServerList_UpdateFieldIDs();
88 void setSelectedNexuizServerList(entity me, float i)
91 save = me.selectedItem;
92 setSelectedListBox(me, i);
94 if(me.selectedItem == save)
99 if(gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT) != me.nItems)
100 return; // sorry, it would be wrong
101 if(me.selectedServer)
102 strunzone(me.selectedServer);
103 me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
105 void refreshServerListNexuizServerList(entity me, float mode)
107 // 0: just reparametrize
108 // 1: also ask for new servers
110 print("refresh of type ", ftos(mode), "\n");
111 /* if(mode == 2) // borken
114 localcmd("net_slist\n");
115 me.needsRefresh = 1; // net_slist kills sort order, so we need to restore it later
119 resethostcachemasks();
120 sethostcachesort(me.currentSortField, me.currentSortOrder < 0);
126 void focusEnterNexuizServerList(entity me)
128 if(time < me.nextRefreshTime)
130 print("sorry, no refresh yet\n");
133 me.nextRefreshTime = time + 60;
134 me.refreshServerList(me, 1);
136 void drawNexuizServerList(entity me)
140 if(me.currentSortField == -1)
142 me.setSortOrder(me, SLIST_FIELD_PING, +1);
143 me.refreshServerList(me, 2);
145 else if(me.needsRefresh == 1)
147 me.needsRefresh = 2; // delay by one frame to make sure "slist" has been executed
149 else if(me.needsRefresh == 2)
152 me.refreshServerList(me, 0);
155 me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
156 me.connectButton.disabled = (me.nItems == 0);
157 for(i = 0; i < me.nItems; ++i)
158 if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
160 if(i != me.selectedItem)
162 me.lastClickedServer = -1;
169 void ServerList_PingSort_Click(entity btn, entity me)
171 me.setSortOrder(me, SLIST_FIELD_PING, +1);
173 void ServerList_NameSort_Click(entity btn, entity me)
175 me.setSortOrder(me, SLIST_FIELD_NAME, -1); // why?
177 void ServerList_MapSort_Click(entity btn, entity me)
179 me.setSortOrder(me, SLIST_FIELD_MAP, -1); // why?
181 void ServerList_PlayerSort_Click(entity btn, entity me)
183 me.setSortOrder(me, SLIST_FIELD_NUMHUMANS, -1);
185 void setSortOrderNexuizServerList(entity me, float field, float direction)
187 if(me.currentSortField == field)
188 direction = -me.currentSortOrder;
189 me.currentSortOrder = direction;
190 me.currentSortField = field;
192 me.sortButton1.forcePressed = (field == SLIST_FIELD_PING);
193 me.sortButton2.forcePressed = (field == SLIST_FIELD_NAME);
194 me.sortButton3.forcePressed = (field == SLIST_FIELD_MAP);
195 me.sortButton4.forcePressed = (field == SLIST_FIELD_NUMHUMANS);
197 if(me.selectedServer)
198 strunzone(me.selectedServer);
199 me.selectedServer = string_null;
201 void positionSortButtonNexuizServerList(entity me, entity btn, float theOrigin, float theSize, string theTitle, void(entity, entity) theFunc)
203 vector originInLBSpace, sizeInLBSpace;
204 originInLBSpace = eY * (-me.itemHeight);
205 sizeInLBSpace = eY * me.itemHeight + eX * (1 - me.controlWidth);
207 vector originInDialogSpace, sizeInDialogSpace;
208 originInDialogSpace = boxToGlobal(originInLBSpace, me.Container_origin, me.Container_size);
209 sizeInDialogSpace = boxToGlobalSize(sizeInLBSpace, me.Container_size);
211 btn.Container_origin_x = originInDialogSpace_x + sizeInDialogSpace_x * theOrigin;
212 btn.Container_size_x = sizeInDialogSpace_x * theSize;
213 btn.setText(btn, theTitle);
214 btn.onClick = theFunc;
215 btn.onClickEntity = me;
218 void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
220 resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
222 me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
223 me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
224 me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
226 me.columnPingOrigin = 0;
227 me.columnPingSize = me.realFontSize_x * 4;
228 me.columnMapSize = me.realFontSize_x * 12;
229 me.columnPlayersSize = me.realFontSize_x * 6;
230 me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - 3 * me.realFontSize_x;
231 me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
232 me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
233 me.columnPlayersOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
235 me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, "Ping", ServerList_PingSort_Click);
236 me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, "Host name", ServerList_NameSort_Click);
237 me.positionSortButton(me, me.sortButton3, me.columnMapOrigin, me.columnMapSize, "Map", ServerList_MapSort_Click);
238 me.positionSortButton(me, me.sortButton4, me.columnPlayersOrigin, me.columnPlayersSize, "Players", ServerList_PlayerSort_Click);
241 f = me.currentSortField;
242 me.currentSortField = -1;
243 me.setSortOrder(me, f, me.currentSortOrder); // force resetting the sort order
245 void ServerList_Connect_Click(entity btn, entity me)
248 localcmd("connect ", me.selectedServer, "\n");
250 void ServerList_Refresh_Click(entity btn, entity me)
254 void clickListBoxItemNexuizServerList(entity me, float i, vector where)
256 if(i == me.lastClickedServer)
257 if(time < me.lastClickedTime + 0.3)
260 ServerList_Connect_Click(NULL, me);
262 me.lastClickedServer = i;
263 me.lastClickedTime = time;
265 void drawListBoxItemNexuizServerList(entity me, float i, vector absSize, float isSelected)
267 // layout: Ping, Server name, Map name, NP, TP, MP
274 draw_Fill('0 0 0', '1 1 0', '0 0 1', 0.5);
276 if(gethostcachenumber(SLIST_FIELD_NUMPLAYERS, i) >= gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i))
278 else if not(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
283 p = gethostcachenumber(SLIST_FIELD_PING, i);
285 theColor = eX * (p / 50) + eY;
287 theColor = eX + eY * ((150 - p) / 100);
291 theAlpha *= 0.1 + 0.9 * (650 - p) / 500;
300 draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha);
301 s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize / me.realFontSize_x);
302 draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha);
303 s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize / me.realFontSize_x);
304 draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
305 s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
306 draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);