]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/playerlist.qc
Rename menu files to be consistent
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / playerlist.qc
diff --git a/qcsrc/menu/xonotic/playerlist.qc b/qcsrc/menu/xonotic/playerlist.qc
new file mode 100644 (file)
index 0000000..c60b34e
--- /dev/null
@@ -0,0 +1,138 @@
+#ifdef INTERFACE
+CLASS(XonoticPlayerList) EXTENDS(XonoticListBox)
+       ATTRIB(XonoticPlayerList, rowsPerItem, float, 1)
+       METHOD(XonoticPlayerList, resizeNotify, void(entity, vector, vector, vector, vector))
+       METHOD(XonoticPlayerList, drawListBoxItem, void(entity, float, vector, float))
+       ATTRIB(XonoticPlayerList, realFontSize, vector, '0 0 0')
+       ATTRIB(XonoticPlayerList, columnNameOrigin, float, 0)
+       ATTRIB(XonoticPlayerList, columnNameSize, float, 0)
+       ATTRIB(XonoticPlayerList, columnScoreOrigin, float, 0)
+       ATTRIB(XonoticPlayerList, columnScoreSize, float, 0)
+       ATTRIB(XonoticPlayerList, realUpperMargin, float, 0)
+       ATTRIB(XonoticPlayerList, origin, vector, '0 0 0')
+       ATTRIB(XonoticPlayerList, itemAbsSize, vector, '0 0 0')
+       METHOD(XonoticPlayerList, setPlayerList, void(entity, string))
+       METHOD(XonoticPlayerList, getPlayerList, string(entity, float, float))
+       ATTRIB(XonoticPlayerList, playerList, float, -1)
+ENDCLASS(XonoticPlayerList)
+entity makeXonoticPlayerList();
+#endif
+
+#ifdef IMPLEMENTATION
+
+const float PLAYERPARM_SCORE = 0;
+const float PLAYERPARM_PING = 1;
+const float PLAYERPARM_TEAM = 2;
+const float PLAYERPARM_NAME = 3;
+const float PLAYERPARM_COUNT = 4;
+
+entity makeXonoticPlayerList()
+{
+       entity me;
+       me = spawnXonoticPlayerList();
+       me.configureXonoticListBox(me);
+       return me;
+}
+
+void XonoticPlayerList_setPlayerList(entity me, string plist)
+{
+       float buf,i,n;
+       string s;
+
+       buf = buf_create();
+       me.nItems = tokenizebyseparator(plist, "\n");
+       for(i = 0; i < me.nItems; ++i)
+       {
+               bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME, argv(i)); // -666 100 "^4Nex ^2Player"
+       }
+
+       for(i = 0; i < me.nItems; ++i)
+       {
+               s = bufstr_get(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME);
+               n = tokenize_console(s);
+
+               if(n == 4)
+               {
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_TEAM,  argv(2)); // 0 for spec, else 1, 2, 3, 4
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(3)); // ^4Nex ^2Player
+               }
+               else
+               {
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_SCORE, argv(0)); // -666
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_PING,  argv(1)); // 100
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_TEAM,  "-1");
+                       bufstr_set(buf, i * PLAYERPARM_COUNT + PLAYERPARM_NAME,  argv(2)); // ^4Nex ^2Player
+               }
+       }
+       me.playerList = buf;
+}
+
+string XonoticPlayerList_getPlayerList(entity me, float i, float key)
+{
+       return bufstr_get(me.playerList, i * PLAYERPARM_COUNT + key);
+}
+
+void XonoticPlayerList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+       me.itemAbsSize = '0 0 0';
+       SUPER(XonoticPlayerList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
+
+       me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));
+       me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));
+       me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+
+       // this list does 1 char left and right margin
+       me.columnScoreSize = 5 * me.realFontSize_x;
+       me.columnNameSize = 1 - 3 * me.realFontSize_x - me.columnScoreSize;
+
+       me.columnNameOrigin = me.realFontSize_x;
+       me.columnScoreOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
+}
+
+void XonoticPlayerList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
+{
+       string s;
+       string score;
+       float t;
+       vector rgb;
+
+       t = stof(me.getPlayerList(me, i, PLAYERPARM_TEAM));
+       if(t == 1)
+               rgb = colormapPaletteColor(4, 0);
+       else if(t == 2)
+               rgb = colormapPaletteColor(13, 0);
+       else if(t == 3)
+               rgb = colormapPaletteColor(12, 0);
+       else if(t == 4)
+               rgb = colormapPaletteColor(9, 0);
+       else
+               rgb = SKINCOLOR_TEXT;
+
+       s = me.getPlayerList(me, i, PLAYERPARM_NAME);
+       score = me.getPlayerList(me, i, PLAYERPARM_SCORE);
+
+       if(substring(score, strlen(score) - 10, 10) == ":spectator")
+       {
+               score = _("spectator");
+       }
+       else
+       {
+               if((t = strstrofs(score, ":", 0)) >= 0)
+                       score = substring(score, 0, t);
+               if((t = strstrofs(score, ",", 0)) >= 0)
+                       score = substring(score, 0, t);
+
+               if(stof(score) == -666)
+                       score = _("spectator");
+       }
+
+       s = draw_TextShortenToWidth(s, me.columnNameSize, 1, me.realFontSize);
+       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);
+
+       score = draw_TextShortenToWidth(score, me.columnScoreSize, 0, me.realFontSize);
+       draw_Text(me.realUpperMargin2 * eY + (me.columnScoreOrigin + 1.00 * (me.columnScoreSize - draw_TextWidth(score, 1, me.realFontSize))) * eX, score, me.realFontSize, rgb, 1, 0);
+}
+
+#endif