2 CLASS(XonoticCrosshairPicker) EXTENDS(Item)
3 METHOD(XonoticCrosshairPicker, configureXonoticCrosshairPicker, void(entity))
4 METHOD(XonoticCrosshairPicker, mousePress, float(entity, vector))
5 METHOD(XonoticCrosshairPicker, mouseRelease, float(entity, vector))
6 METHOD(XonoticCrosshairPicker, mouseMove, float(entity, vector))
7 METHOD(XonoticCrosshairPicker, mouseDrag, float(entity, vector))
8 METHOD(XonoticCrosshairPicker, keyDown, float(entity, float, float, float))
9 METHOD(XonoticCrosshairPicker, draw, void(entity))
10 ATTRIB(XonoticCrosshairPicker, focusable, float, 1)
11 ATTRIB(XonoticCrosshairPicker, disabled, float, 0)
12 ATTRIB(XonoticCrosshairPicker, alpha, float, 1)
13 ATTRIB(XonoticCrosshairPicker, disabledAlpha, float, SKINALPHA_DISABLED)
15 METHOD(XonoticCrosshairPicker, moveFocus, void(entity, vector, vector))
16 METHOD(XonoticCrosshairPicker, setCrosshair, void(entity))
17 ATTRIB(XonoticCrosshairPicker, realCellSize, vector, '0 0 0')
18 ATTRIB(XonoticCrosshairPicker, focusedCell, vector, '-1 -1 0')
19 ATTRIB(XonoticCrosshairPicker, focusedCellTime, float, 0)
20 ATTRIB(XonoticCrosshairPicker, pressedCell, vector, '-1 -1 0')
21 ENDCLASS(XonoticCrosshairPicker)
22 entity makeXonoticCrosshairPicker();
27 const float CROSSHAIRPICKER_COLS = 12;
28 const float CROSSHAIRPICKER_ROWS = 3;
30 string crosshairpicker_cellToCrosshair(vector cell)
32 float crosshair = 31 + cell.y * CROSSHAIRPICKER_COLS + cell.x;
34 if (crosshair >= 31 && crosshair < 31 + CROSSHAIRPICKER_COLS * CROSSHAIRPICKER_ROWS)
35 return ftos(crosshair);
40 entity makeXonoticCrosshairPicker()
43 me = spawnXonoticCrosshairPicker();
44 me.configureXonoticCrosshairPicker(me);
48 void XonoticCrosshairPicker_configureXonoticCrosshairPicker(entity me)
50 me.realCellSize = eX / CROSSHAIRPICKER_COLS + eY / CROSSHAIRPICKER_ROWS;
53 float XonoticCrosshairPicker_mouseMove(entity me, vector coords)
55 vector prevFocusedCell = me.focusedCell;
56 me.focusedCell_x = floor(coords.x * CROSSHAIRPICKER_COLS);
57 me.focusedCell_y = floor(coords.y * CROSSHAIRPICKER_ROWS);
59 if(me.focusedCell.x < 0 || me.focusedCell.y < 0 ||
60 me.focusedCell.x >= CROSSHAIRPICKER_COLS || me.focusedCell.y >= CROSSHAIRPICKER_ROWS)
62 me.focusedCell = '-1 -1 0';
66 if(me.focusedCell != prevFocusedCell)
67 me.focusedCellTime = time;
72 float XonoticCrosshairPicker_mouseDrag(entity me, vector coords)
74 return me.mouseMove(me, coords);
77 float XonoticCrosshairPicker_mousePress(entity me, vector coords)
79 me.mouseMove(me, coords);
81 if(me.focusedCell.x >= 0)
84 me.pressedCell = me.focusedCell;
90 float XonoticCrosshairPicker_mouseRelease(entity me, vector coords)
95 me.mouseMove(me, coords);
97 if(me.focusedCell == me.pressedCell)
104 float XonoticCrosshairPicker_keyDown(entity me, float key, float ascii, float shift)
110 me.moveFocus(me, me.focusedCell, '-1 0 0');
113 case K_KP_RIGHTARROW:
114 me.moveFocus(me, me.focusedCell, '1 0 0');
118 me.moveFocus(me, me.focusedCell, '0 -1 0');
122 me.moveFocus(me, me.focusedCell, '0 1 0');
126 me.focusedCell = '0 0 0';
130 me.focusedCell_x = CROSSHAIRPICKER_COLS - 1;
131 me.focusedCell_y = CROSSHAIRPICKER_ROWS - 1;
143 void XonoticCrosshairPicker_moveFocus(entity me, vector initialCell, vector step)
145 me.focusedCell_x = mod(me.focusedCell.x + step.x + CROSSHAIRPICKER_COLS, CROSSHAIRPICKER_COLS);
146 me.focusedCell_y = mod(me.focusedCell.y + step.y + CROSSHAIRPICKER_ROWS, CROSSHAIRPICKER_ROWS);
148 if(me.focusedCell != initialCell) // Recursion break
149 if(crosshairpicker_cellToCrosshair(me.focusedCell) == "")
150 me.moveFocus(me, initialCell, step);
153 void XonoticCrosshairPicker_setCrosshair(entity me)
155 cvar_set("crosshair", crosshairpicker_cellToCrosshair(me.focusedCell));
158 void XonoticCrosshairPicker_draw(entity me)
163 me.focusable = !me.disabled;
167 draw_alpha *= me.disabledAlpha;
170 vector cell, cellPos, crosshairPos;
173 crosshairPos = '0 0 0';
176 for(cell_y = 0; cell.y < CROSSHAIRPICKER_ROWS; ++cell.y)
178 crosshairPos_y = cell.y / CROSSHAIRPICKER_ROWS + 0.5 * me.realCellSize.y;
179 for(cell_x = 0; cell.x < CROSSHAIRPICKER_COLS; ++cell.x)
181 crosshair = crosshairpicker_cellToCrosshair(cell);
187 if(cell == me.focusedCell && me.focused)
189 if(!me.pressed || me.focusedCell == me.pressedCell)
191 cellPos_x = mod(me.focusedCell.x, CROSSHAIRPICKER_COLS) / CROSSHAIRPICKER_COLS;
192 cellPos_y = mod(me.focusedCell.y, CROSSHAIRPICKER_ROWS) / CROSSHAIRPICKER_ROWS;
193 draw_Fill(cellPos, me.realCellSize, SKINCOLOR_LISTBOX_FOCUSED, getHighlightAlpha(SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED, me.focusedCellTime));
198 crosshairPos_x = cell.x / CROSSHAIRPICKER_COLS + 0.5 * me.realCellSize.x;
199 string cross = strcat("/gfx/crosshair", crosshairpicker_cellToCrosshair(cell));
200 sz = draw_PictureSize(cross);
201 sz = globalToBoxSize(sz, me.size);
203 float ar = sz.x / sz.y;
204 sz.x = me.realCellSize.x;
210 draw_Picture(crosshairPos - 0.5 * sz, cross, sz, rgb, me.alpha);
211 if(cvar("crosshair_dot"))
213 if(cvar("crosshair_dot_color_custom") && (cvar_string("crosshair_dot_color") != "0"))
214 rgb = stov(cvar_string("crosshair_dot_color"));
216 draw_Picture(crosshairPos - 0.5 * sz * cvar("crosshair_dot_size"), "/gfx/crosshairdot", sz * cvar("crosshair_dot_size"), rgb, me.alpha);
223 SUPER(XonoticCrosshairPicker).draw(me);