X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud%2Fhud.qc;h=cfb819efab9c30b5899d022412719d222fcadfcd;hb=c58baab5bd2dc4a77eb7d8e97824621d887c8e75;hp=2b8eed95f7705578fc5ae34a083e8187c0f45a0b;hpb=ec98f5c9d50f267779fed871c9eb094a52064219;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud/hud.qc b/qcsrc/client/hud/hud.qc index 2b8eed95f..cfb819efa 100644 --- a/qcsrc/client/hud/hud.qc +++ b/qcsrc/client/hud/hud.qc @@ -1,25 +1,25 @@ #include "hud.qh" -#include -#include +#include +#include +#include +#include +#include +#include +#include #include -#include "panel/scoreboard.qh" -#include "hud_config.qh" -#include "../mapvoting.qh" -#include "../teamradar.qh" -#include -#include #include #include +#include #include #include -#include -#include +#include #include #include -#include +#include +#include #include -#include +#include /* @@ -28,61 +28,150 @@ Misc HUD functions ================== */ -vector HUD_Get_Num_Color (float hp, float maxvalue) +void draw_cursor(vector pos, vector ofs, string img, vector col, float a) { - float blinkingamt; - vector color; - if(hp >= maxvalue) { - color.x = sin(2*M_PI*time); - color.y = 1; - color.z = sin(2*M_PI*time); - } - else if(hp > maxvalue * 0.75) { - color.x = 0.4 - (hp-150)*0.02 * 0.4; //red value between 0.4 -> 0 - color.y = 0.9 + (hp-150)*0.02 * 0.1; // green value between 0.9 -> 1 - color.z = 0; - } - else if(hp > maxvalue * 0.5) { - color.x = 1 - (hp-100)*0.02 * 0.6; //red value between 1 -> 0.4 - color.y = 1 - (hp-100)*0.02 * 0.1; // green value between 1 -> 0.9 - color.z = 1 - (hp-100)*0.02; // blue value between 1 -> 0 + ofs = vec2(ofs.x * SIZE_CURSOR.x, ofs.y * SIZE_CURSOR.y); + drawpic(pos - ofs, strcat(draw_currentSkin, img), SIZE_CURSOR, col, a, DRAWFLAG_NORMAL); +} + +void draw_cursor_normal(vector pos, vector col, float a) +{ + draw_cursor(pos, OFFSET_CURSOR, "/cursor", col, a); +} + +void LoadMenuSkinValues() +{ + int fh = -1; + if(cvar_string("menu_skin") != "") + { + draw_currentSkin = strcat("gfx/menu/", cvar_string("menu_skin")); + fh = fopen(strcat(draw_currentSkin, "/skinvalues.txt"), FILE_READ); } - else if(hp > maxvalue * 0.25) { - color.x = 1; - color.y = 1; - color.z = 0.2 + (hp-50)*0.02 * 0.8; // blue value between 0.2 -> 1 + if(fh < 0 && cvar_defstring("menu_skin") != "") + { + cvar_set("menu_skin", cvar_defstring("menu_skin")); + draw_currentSkin = strcat("gfx/menu/", cvar_string("menu_skin")); + fh = fopen(strcat(draw_currentSkin, "/skinvalues.txt"), FILE_READ); } - else if(hp > maxvalue * 0.1) { - color.x = 1; - color.y = (hp-20)*90/27/100; // green value between 0 -> 1 - color.z = (hp-20)*90/27/100 * 0.2; // blue value between 0 -> 0.2 + if(fh < 0) + { + draw_currentSkin = "gfx/menu/default"; + fh = fopen(strcat(draw_currentSkin, "/skinvalues.txt"), FILE_READ); } - else { - color.x = 1; - color.y = 0; - color.z = 0; + + draw_currentSkin = strzone(draw_currentSkin); + + if(fh >= 0) + { + string s; + while((s = fgets(fh))) + { + int n = tokenize_console(s); + if (n < 2) + continue; + if(substring(argv(0), 0, 2) == "//") + continue; + if(argv(0) == "SIZE_CURSOR") + SIZE_CURSOR = stov(substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); + else if(argv(0) == "OFFSET_CURSOR") + OFFSET_CURSOR = stov(substring(s, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); + } + fclose(fh); } +} + +void HUD_Scale_Disable() +{ + hud_scale = '1 1 0'; + hud_shift = '0 0 0'; + drawfontscale = hud_scale; +} + +void HUD_Scale_Enable() +{ + hud_scale = hud_scale_current; + hud_shift = hud_shift_current; + drawfontscale = hud_scale; +} + +vector HUD_Scale(vector v) +{ + v.x = HUD_ScaleX(v.x); + v.y = HUD_ScaleY(v.y); + return v; +} + +vector HUD_Shift(vector v) +{ + v.x = HUD_ShiftX(v.x); + v.y = HUD_ShiftY(v.y); + return v; +} + +vector HUD_GetFontsize(string cvarname) +{ + vector v; + v = stov(cvar_string(cvarname)); + if(v.x == 0) + v = '8 8 0'; + if(v.y == 0) + v.y = v.x; + v.z = 0; + return v; +} + +vector HUD_Get_Num_Color(float hp, float maxvalue, bool blink) +{ + const vector COLOR100 = '0 1 0'; // green + const vector COLOR75 = '0.4 0.9 0'; // lightgreen + const vector COLOR50 = '1 1 1'; // white + const vector COLOR25 = '1 1 0.2'; // lightyellow + const vector COLOR10 = '1 0 0'; // red + vector color; + + float hp_percent = hp / maxvalue * 100; + #define CASE_COLOR_BETWEEN(min, max) \ + if(hp_percent > min) \ + color = COLOR##min + (COLOR##max - COLOR##min) * ((hp_percent - min) / (max - min)) + + if(hp_percent > 100) color = COLOR100; + else CASE_COLOR_BETWEEN(75, 100); + else CASE_COLOR_BETWEEN(50, 75); + else CASE_COLOR_BETWEEN(25, 50); + else CASE_COLOR_BETWEEN(10, 25); + else color = COLOR10; + + #undef CASE_COLOR_BETWEEN - blinkingamt = (1 - hp/maxvalue/0.25); - if(blinkingamt > 0) + if (blink) { - color.x = color.x - color.x * blinkingamt * sin(2*M_PI*time); - color.y = color.y - color.y * blinkingamt * sin(2*M_PI*time); - color.z = color.z - color.z * blinkingamt * sin(2*M_PI*time); + if(hp_percent >= 100) + { + float f = sin(2*M_PI*time); + if (color.x == 0) color.x = f; + if (color.y == 0) color.y = f; + if (color.z == 0) color.z = f; + } + else if(hp_percent < 25) + { + float f = (1 - hp_percent / 25) * sin(2*M_PI*time); + color -= color * f; + } } + return color; } float HUD_GetRowCount(int item_count, vector size, float item_aspect) { - TC(int, item_count); + TC(int, item_count); float aspect = size_y / size_x; return bound(1, floor((sqrt(4 * item_aspect * aspect * item_count + aspect * aspect) + aspect + 0.5) / 2), item_count); } vector HUD_GetTableSize_BestItemAR(int item_count, vector psize, float item_aspect) { - TC(int, item_count); + TC(int, item_count); float columns, rows; float ratio, best_ratio = 0; float best_columns = 1, best_rows = 1; @@ -180,7 +269,7 @@ void HUD_Panel_LoadCvars() //basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float length_ratio, bool vertical, float baralign, vector theColor, float theAlpha, int drawflag) { - TC(bool, vertical); TC(int, drawflag); + TC(bool, vertical); TC(int, drawflag); if(!length_ratio || !theAlpha) return; if(length_ratio > 1) @@ -204,11 +293,11 @@ void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, flo pic = "gfx/hud/default/progressbar_vertical"; } - if (baralign == 1) // bottom align + if (baralign == 1) // bottom align theOrigin.y += (1 - length_ratio) * theSize.y; - else if (baralign == 2) // center align - theOrigin.y += 0.5 * (1 - length_ratio) * theSize.y; - else if (baralign == 3) // center align, positive values down, negative up + else if (baralign == 2) // center align + theOrigin.y += 0.5 * (1 - length_ratio) * theSize.y; + else if (baralign == 3) // center align, positive values down, negative up { theSize.y *= 0.5; if (length_ratio > 0) @@ -248,9 +337,9 @@ void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, flo if (baralign == 1) // right align theOrigin.x += (1 - length_ratio) * theSize.x; - else if (baralign == 2) // center align - theOrigin.x += 0.5 * (1 - length_ratio) * theSize.x; - else if (baralign == 3) // center align, positive values on the right, negative on the left + else if (baralign == 2) // center align + theOrigin.x += 0.5 * (1 - length_ratio) * theSize.x; + else if (baralign == 3) // center align, positive values on the right, negative on the left { theSize.x *= 0.5; if (length_ratio > 0) @@ -287,7 +376,7 @@ void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, flo void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float theAlpha, int drawflag) { - TC(int, drawflag); + TC(int, drawflag); if(!theAlpha) return; @@ -306,11 +395,12 @@ void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float theA drawsubpic(pos + eX * mySize.x - eX * min(mySize.x * 0.5, mySize.y), eX * min(mySize.x * 0.5, mySize.y) + eY * mySize.y, pic, '0.75 0 0', '0.25 1 0', color, theAlpha, drawflag); } -void DrawNumIcon_expanding(vector myPos, vector mySize, float theTime, string icon, bool vertical, int icon_right_align, vector color, float theAlpha, float fadelerp) +void DrawNumIcon_expanding(vector myPos, vector mySize, float theTime, string icon, bool vertical, bool isInfinite, int icon_right_align, vector color, float theAlpha, float fadelerp) { - TC(bool, vertical); TC(int, icon_right_align); + TC(bool, vertical); TC(int, icon_right_align); vector newPos = '0 0 0', newSize = '0 0 0'; vector picpos, numpos; + string text = isInfinite ? "\xE2\x88\x9E" : ftos(theTime); // Use infinity symbol (U+221E) if (vertical) { @@ -348,7 +438,7 @@ void DrawNumIcon_expanding(vector myPos, vector mySize, float theTime, string ic // reduce only y to draw numbers with different number of digits with the same y size numpos.y += newSize.y * ((1 - 0.7) / 2); newSize.y *= 0.7; - drawstring_aspect(numpos, ftos(theTime), newSize, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + drawstring_aspect(numpos, text, newSize, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); return; } @@ -382,14 +472,14 @@ void DrawNumIcon_expanding(vector myPos, vector mySize, float theTime, string ic // NOTE: newSize_x is always equal to 3 * mySize_y so we can use // '2 1 0' * newSize_y instead of eX * (2/3) * newSize_x + eY * newSize_y - drawstring_aspect_expanding(numpos, ftos(theTime), '2 1 0' * newSize.y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, fadelerp); + drawstring_aspect_expanding(numpos, text, '2 1 0' * newSize.y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, fadelerp); drawpic_aspect_skin_expanding(picpos, icon, '1 1 0' * newSize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, fadelerp); } -void DrawNumIcon(vector myPos, vector mySize, float theTime, string icon, bool vertical, int icon_right_align, vector color, float theAlpha) +void DrawNumIcon(vector myPos, vector mySize, float theTime, string icon, bool vertical, bool isInfinite, int icon_right_align, vector color, float theAlpha) { - TC(bool, vertical); TC(int, icon_right_align); - DrawNumIcon_expanding(myPos, mySize, theTime, icon, vertical, icon_right_align, color, theAlpha, 0); + TC(bool, vertical); TC(int, icon_right_align); + DrawNumIcon_expanding(myPos, mySize, theTime, icon, vertical, isInfinite, icon_right_align, color, theAlpha, 0); } /* @@ -398,6 +488,8 @@ Main HUD system ================== */ +float lasthud; +float vh_notice_time; void HUD_Vehicle() { if(autocvar__hud_configure) return; @@ -406,9 +498,14 @@ void HUD_Vehicle() if(hud == HUD_BUMBLEBEE_GUN) CSQC_BUMBLE_GUN_HUD(); else { - Vehicle info = Vehicles_from(hud); + Vehicle info = REGISTRY_GET(Vehicles, hud); info.vr_hud(info); } + + if(hud != HUD_NORMAL && lasthud == HUD_NORMAL) + vh_notice_time = time + autocvar_cl_vehicles_notify_time; + + lasthud = hud; } void HUD_Panel_Draw(entity panent) @@ -425,7 +522,11 @@ void HUD_Panel_Draw(entity panent) } bool draw_allowed = false; - if (active_minigame && HUD_MinigameMenu_IsOpened()) + if (scoreboard_fade_alpha && panel.panel_showflags & PANEL_SHOW_WITH_SB) + { + draw_allowed = true; + } + else if (active_minigame && HUD_MinigameMenu_IsOpened()) { if (panel.panel_showflags & PANEL_SHOW_MINIGAME) draw_allowed = true; @@ -441,7 +542,12 @@ void HUD_Panel_Draw(entity panent) if (draw_allowed) { if (panel.panel_showflags & PANEL_SHOW_WITH_SB) - panel_fade_alpha = 1; + { + if (scoreboard_fade_alpha && intermission == 2 && !(panel.panel_showflags & PANEL_SHOW_MAPVOTE)) + panel_fade_alpha = scoreboard_fade_alpha; + else + panel_fade_alpha = 1; + } else { panel_fade_alpha = 1 - scoreboard_fade_alpha; @@ -561,6 +667,25 @@ void Hud_Dynamic_Frame() HUD_Scale_Disable(); } +bool HUD_WouldShowCursor() +{ + if(autocvar__hud_configure) + return true; + if(mv_active) + return true; + //entity local_player = ((csqcplayer) ? csqcplayer : CSQCModel_server2csqc(player_localentnum - 1)); // TODO: doesn't use regular cursor handling + //if(local_player.viewloc && (local_player.viewloc.spawnflags & VIEWLOC_FREEAIM)) + //return true; + if(HUD_Radar_Clickable()) + return true; + if(HUD_MinigameMenu_IsOpened()) + return true; + if(QuickMenu_IsOpened()) + return true; + return false; +} + +float prev_myteam; void HUD_Main() { int i; @@ -569,6 +694,13 @@ void HUD_Main() else hud_fade_alpha = 1 - autocvar__menu_alpha; + if(myteam != prev_myteam) + { + myteamcolors = colormapPaletteColor(myteam, 1); + FOREACH(hud_panels, true, it.update_time = time); + prev_myteam = myteam; + } + HUD_Configure_Frame(); if(scoreboard_fade_alpha == 1) @@ -625,18 +757,18 @@ void HUD_Main() // cache the panel order into the panel_order array if(autocvar__hud_panelorder != hud_panelorder_prev) { - for(i = 0; i < hud_panels_COUNT; ++i) + for(i = 0; i < REGISTRY_COUNT(hud_panels); ++i) panel_order[i] = -1; string s = ""; int p_num; bool warning = false; int argc = tokenize_console(autocvar__hud_panelorder); - if (argc > hud_panels_COUNT) + if (argc > REGISTRY_COUNT(hud_panels)) warning = true; //first detect wrong/missing panel numbers - for(i = 0; i < hud_panels_COUNT; ++i) { + for(i = 0; i < REGISTRY_COUNT(hud_panels); ++i) { p_num = stoi(argv(i)); - if (p_num >= 0 && p_num < hud_panels_COUNT) { //correct panel number? + if (p_num >= 0 && p_num < REGISTRY_COUNT(hud_panels)) { //correct panel number? if (panel_order[p_num] == -1) //found for the first time? s = strcat(s, ftos(p_num), " "); panel_order[p_num] = 1; //mark as found @@ -644,7 +776,7 @@ void HUD_Main() else warning = true; } - for(i = 0; i < hud_panels_COUNT; ++i) { + for(i = 0; i < REGISTRY_COUNT(hud_panels); ++i) { if (panel_order[i] == -1) { warning = true; s = strcat(s, ftos(i), " "); //add missing panel number @@ -658,15 +790,15 @@ void HUD_Main() //now properly set panel_order tokenize_console(s); - for(i = 0; i < hud_panels_COUNT; ++i) { + for(i = 0; i < REGISTRY_COUNT(hud_panels); ++i) { panel_order[i] = stof(argv(i)); } } hud_draw_maximized = 0; // draw panels in the order specified by panel_order array - for(i = hud_panels_COUNT - 1; i >= 0; --i) - HUD_Panel_Draw(hud_panels_from(panel_order[i])); + for(i = REGISTRY_COUNT(hud_panels) - 1; i >= 0; --i) + HUD_Panel_Draw(REGISTRY_GET(hud_panels, panel_order[i])); HUD_Vehicle(); @@ -676,10 +808,20 @@ void HUD_Main() HUD_Panel_Draw(HUD_PANEL(RADAR)); if(autocvar__con_chat_maximized) HUD_Panel_Draw(HUD_PANEL(CHAT)); - if(hud_panel_quickmenu) + if (QuickMenu_IsOpened()) HUD_Panel_Draw(HUD_PANEL(QUICKMENU)); HUD_Panel_Draw(HUD_PANEL(SCOREBOARD)); + int cursor_active_prev = cursor_active; + cursor_active = HUD_WouldShowCursor(); + if (cursor_active_prev != cursor_active && autocvar_hud_cursormode) + { + setcursormode(cursor_active); + // cursor inactive this frame, will be set to 1 the next frame + if (cursor_active) + cursor_active = -1; + } + if (intermission == 2) HUD_Reset();