1#include "playerlist.qh"
2
3.float realUpperMargin2;
4
5const float PLAYERPARM_SCORE = 0;
6const float PLAYERPARM_PING = 1;
7const float PLAYERPARM_TEAM = 2;
8const float PLAYERPARM_NAME = 3;
9const float PLAYERPARM_COUNT = 4;
10
11entity makeXonoticPlayerList()
12{
13	entity me;
14	me = NEW(XonoticPlayerList);
15	me.configureXonoticListBox(me);
16	return me;
17}
18
19void XonoticPlayerList_setPlayerList(entity me, string plist)
20{
21	int buf,i,n;
22	string s;
23
24	buf = buf_create();
25	me.nItems = tokenizebyseparator(plist, "\n");
26	for(i = 0; i < me.nItems; ++i)
27	{
28		bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME, argv(i)); // -666 100 "^4Nex ^2Player"
29	}
30
31	for(i = 0; i < me.nItems; ++i)
32	{
33		s = bufstr_get(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME);
34		n = tokenize_console(s);
35
36		if(n == 4)
37		{
38			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
39			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
40			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_TEAM,  argv(2)); // 0 for spec, else 1, 2, 3, 4
41			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(3)); // ^4Nex ^2Player
42		}
43		else
44		{
45			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
46			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
47			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_TEAM,  "-1");
48			bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(2)); // ^4Nex ^2Player
49		}
50	}
51	me.playerList = buf;
52}
53
54string XonoticPlayerList_getPlayerList(entity me, float i, float key)
55{
56	return bufstr_get(me.playerList, i * PLAYERPARM_COUNT + key);
57}
58
59void XonoticPlayerList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
60{
61	me.itemAbsSize = '0 0 0';
62	SUPER(XonoticPlayerList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
63
64	me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize.y * me.itemHeight));
65	me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize.x * (1 - me.controlWidth)));
66	me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
67
68	// this list does 1 char left and right margin
69	me.columnScoreSize = 5 * me.realFontSize.x;
70	me.columnNameSize = 1 - 3 * me.realFontSize.x - me.columnScoreSize;
71
72	me.columnNameOrigin = me.realFontSize.x;
73	me.columnScoreOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize.x;
74}
75
76void XonoticPlayerList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
77{
78	string s;
79	string score;
80	float t;
81	vector rgb;
82
83	t = stof(me.getPlayerList(me, i, PLAYERPARM_TEAM));
84	if(t == 1)
85		rgb = colormapPaletteColor(4, 0);
86	else if(t == 2)
87		rgb = colormapPaletteColor(13, 0);
88	else if(t == 3)
89		rgb = colormapPaletteColor(12, 0);
90	else if(t == 4)
91		rgb = colormapPaletteColor(9, 0);
92	else
93		rgb = SKINCOLOR_TEXT;
94
95	s = me.getPlayerList(me, i, PLAYERPARM_NAME);
96	score = me.getPlayerList(me, i, PLAYERPARM_SCORE);
97
98	if(substring(score, strlen(score) - 10, 10) == ":spectator")
99	{
100		score = _("spectator");
101	}
102	else
103	{
104		if((t = strstrofs(score, ":", 0)) >= 0)
105			score = substring(score, 0, t);
106		if((t = strstrofs(score, ",", 0)) >= 0)
107			score = substring(score, 0, t);
108
109		if(stof(score) == FRAGS_SPECTATOR)
110			score = _("spectator");
111	}
112
113	s = draw_TextShortenToWidth(s, me.columnNameSize, 1, me.realFontSize);
114	draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 1, me.realFontSize))) * eX, s, me.realFontSize, '1 1 1', 1, 1);
115
116	score = draw_TextShortenToWidth(score, me.columnScoreSize, 0, me.realFontSize);
117	draw_Text(me.realUpperMargin2 * eY + (me.columnScoreOrigin + 1.00 * (me.columnScoreSize - draw_TextWidth(score, 1, me.realFontSize))) * eX, score, me.realFontSize, rgb, 1, 0);
118}
119