X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=f8d8a3296e9713dcc99d34b83fc52928558aa557;hp=0711fb677974eec73f48ed96841c73a2170386b5;hb=e3e13a6eac82464c004af16230f1da2b92776636;hpb=6a966ce59127e888e11aa8dded8809e2e0b78f71 diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 0711fb6779..f8d8a3296e 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -423,7 +423,7 @@ float GetAmmoTypeForWep(float i) case WEP_HLAC: return 3; case WEP_MINSTANEX: return 3; case WEP_NEX: return 3; - case WEP_SNIPERRIFLE: return 1; + case WEP_RIFLE: return 1; case WEP_HAGAR: return 2; case WEP_ROCKET_LAUNCHER: return 2; case WEP_SEEKER: return 2; @@ -437,7 +437,7 @@ void HUD_Weapons(void) { float f, screen_ar; float center_x, center_y; - + if(hud != HUD_NORMAL) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_weapons) return; @@ -466,6 +466,7 @@ void HUD_Weapons(void) } HUD_Panel_UpdateCvars(weapons); + HUD_Panel_ApplyFadeAlpha(); if (timeout && time >= weapontime + timeout && !autocvar__hud_configure) { @@ -786,7 +787,7 @@ string GetAmmoPicture(float i) } } -void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected) +void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected, float infinite_ammo) { float a; if(autocvar__hud_configure) @@ -798,7 +799,9 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode? vector color; - if(a < 10) + if(infinite_ammo) + color = '0 0.5 0.75'; + else if(a < 10) color = '0.7 0 0'; else color = '1 1 1'; @@ -829,12 +832,12 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s if(autocvar_hud_panel_ammo_text) { - if(a > 0) + if(a > 0 || infinite_ammo) drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); else // "ghost" ammo count drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); } - if(a > 0) + if(a > 0 || infinite_ammo) drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL); else // "ghost" ammo icon drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); @@ -842,6 +845,7 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s void HUD_Ammo(void) { + if(hud != HUD_NORMAL) return; if(!autocvar__hud_configure) { if(!autocvar_hud_panel_ammo) return; @@ -851,6 +855,7 @@ void HUD_Ammo(void) hud_configure_active_panel = HUD_PANEL_AMMO; HUD_Panel_UpdateCvars(ammo); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -894,20 +899,23 @@ void HUD_Ammo(void) ammo_size_y = newSize; } - float i, stat_items, currently_selected; + float i, stat_items, currently_selected, infinite_ammo; + infinite_ammo = FALSE; if (autocvar_hud_panel_ammo_onlycurrent) { if(autocvar__hud_configure) { - DrawAmmoItem(pos, ammo_size, 2, true); //show rockets + DrawAmmoItem(pos, ammo_size, 2, true, FALSE); //show rockets return; } stat_items = getstati(STAT_ITEMS); + if (stat_items & IT_UNLIMITED_WEAPON_AMMO) + infinite_ammo = TRUE; for (i = 0; i < AMMO_COUNT; ++i) { currently_selected = stat_items & GetAmmoItemCode(i); if (currently_selected) { - DrawAmmoItem(pos, ammo_size, i, true); + DrawAmmoItem(pos, ammo_size, i, true, infinite_ammo); return; } } @@ -915,9 +923,11 @@ void HUD_Ammo(void) } stat_items = getstati(STAT_ITEMS); + if (stat_items & IT_UNLIMITED_WEAPON_AMMO) + infinite_ammo = TRUE; for (i = 0; i < AMMO_COUNT; ++i) { currently_selected = stat_items & GetAmmoItemCode(i); - DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected); + DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected, infinite_ammo); ++row; if(row >= rows) { @@ -1036,6 +1046,7 @@ void HUD_Powerups(void) } HUD_Panel_UpdateCvars(powerups); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -1142,6 +1153,7 @@ void HUD_HealthArmor(void) if(!autocvar__hud_configure) { if(!autocvar_hud_panel_healtharmor) return; + if(hud != HUD_NORMAL) return; if(spectatee_status == -1) return; health = getstati(STAT_HEALTH); @@ -1189,6 +1201,7 @@ void HUD_HealthArmor(void) } HUD_Panel_UpdateCvars(healtharmor); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -1503,7 +1516,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s } else if(msg == MSG_KILL) { w = DEATH_WEAPONOF(type); if(WEP_VALID(w)) { - if((w == WEP_SNIPERRIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here + if((w == WEP_RIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here HUD_KillNotify_Push(s1, s2, 1, DEATH_HEADSHOT); else HUD_KillNotify_Push(s1, s2, 1, type); @@ -1578,7 +1591,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER); if(alsoprint) print(sprintf(_("^1%s^1 was thrown into a world of hurt by %s\n"), s2, s1)); - } else if(type == DEATH_SBCRUSH) { + } else if(type == DEATH_VHCRUSH) { HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) print (sprintf(_("^1%s^1 was crushed by %s\n"), s2, s1)); @@ -1606,6 +1619,18 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) print (sprintf(_("^1%s^1 dies when %s^1's wakizashi dies.\n"), s2, s1)); + } else if(type == DEATH_RAPTOR_CANNON) { + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); + if(alsoprint) + print (sprintf(_("^1%s^1 nailed to hell by %s\n"), s2, s1)); + } else if(type == DEATH_RAPTOR_BOMB) { + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); + if(alsoprint) + print (sprintf(_("^1%s^1 cluster crushed by %s\n"), s2, s1)); + } else if(type == DEATH_RAPTOR_DEATH) { + HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); + if(alsoprint) + print (sprintf(_("^1%s^1 dies when %s^1's raptor dies.\n"), s2, s1)); } else if(type == DEATH_TURRET) { HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC); if(alsoprint) @@ -1815,92 +1840,90 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s } } -#define DAMAGE_CENTERPRINT_SPACER NEWLINES - void HUD_Centerprint(string s1, string s2, float type, float msg) { float gentle; gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages); if(msg == MSG_SUICIDE) { if (type == DEATH_TEAMCHANGE) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You are now on: %s"), s1))); + centerprint(sprintf(_("You are now on: %s"), s1)); } else if (type == DEATH_AUTOTEAMCHANGE) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1))); + centerprint(sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1)); } else if (type == DEATH_CAMP) { if(gentle) - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Reconsider your tactics, camper!"))); + centerprint(_("^1Reconsider your tactics, camper!")); else - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Die camper!"))); + centerprint(_("^1Die camper!")); } else if (type == DEATH_NOAMMO) { if(gentle) - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You are reinserted into the game for running out of ammo..."))); + centerprint(_("^1You are reinserted into the game for running out of ammo...")); else - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You were killed for running out of ammo..."))); + centerprint(_("^1You were killed for running out of ammo...")); } else if (type == DEATH_ROT) { if(gentle) - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to preserve your health"))); + centerprint(_("^1You need to preserve your health")); else - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You grew too old without taking your medicine"))); + centerprint(_("^1You grew too old without taking your medicine")); } else if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) { if(gentle) - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't go against team mates!"))); + centerprint(_("^1Don't go against team mates!")); else - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't shoot your team mates!"))); + centerprint(_("^1Don't shoot your team mates!")); } else if (type == DEATH_QUIET) { // do nothing } else { // generic message if(gentle) - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to be more careful!"))); + centerprint(_("^1You need to be more careful!")); else - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You killed your own dumb self!"))); + centerprint(_("^1You killed your own dumb self!")); } } else if(msg == MSG_KILL) { if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) { if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You went against %s, a team mate!"), s1))); + centerprint(sprintf(_("^1Moron! You went against ^7%s^1, a team mate!"), s1)); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You fragged %s, a team mate!"), s1))); + centerprint(sprintf(_("^1Moron! You fragged ^7%s^1, a team mate!"), s1)); } } else if (type == KILL_FIRST_BLOOD) { if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First score"))); + centerprint(_("^1First score")); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First blood"))); + centerprint(_("^1First blood")); } } else if (type == KILL_FIRST_VICTIM) { if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First casualty"))); + centerprint(_("^1First casualty")); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First victim"))); + centerprint(_("^1First victim")); } } else if (type == KILL_TYPEFRAG) { // s2 contains "advanced kill messages" such as ping, handicap... if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2)); + centerprint(strcat(sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2)); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You typefragged ^7%s"), s1), s2)); + centerprint(strcat(sprintf(_("^1You typefragged ^7%s"), s1), s2)); } } else if (type == KILL_TYPEFRAGGED) { if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2)); + centerprint(strcat(sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2)); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were typefragged by ^7%s"), s1), s2)); + centerprint(strcat(sprintf(_("^1You were typefragged by ^7%s"), s1), s2)); } } else if (type == KILL_FRAG) { if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You scored against ^7%s"), s1), s2)); + centerprint(strcat(sprintf(_("^4You scored against ^7%s"), s1), s2)); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You fragged ^7%s"), s1), s2)); + centerprint(strcat(sprintf(_("^4You fragged ^7%s"), s1), s2)); } } else { // generic message if(gentle) { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s"), s1), s2)); + centerprint(strcat(sprintf(_("^1You were scored against by ^7%s"), s1), s2)); } else { - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were fragged by ^7%s"), s1), s2)); + centerprint(strcat(sprintf(_("^1You were fragged by ^7%s"), s1), s2)); } } } else if(msg == MSG_KILL_ACTION) { // TODO: invent more centerprints here? - centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Watch your step!"))); + centerprint(_("^1Watch your step!")); } } @@ -1914,6 +1937,7 @@ void HUD_Notify (void) hud_configure_active_panel = HUD_PANEL_NOTIFY; HUD_Panel_UpdateCvars(notify); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -2227,6 +2251,7 @@ void HUD_Timer(void) hud_configure_active_panel = HUD_PANEL_TIMER; HUD_Panel_UpdateCvars(timer); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -2284,6 +2309,7 @@ void HUD_Radar(void) hud_configure_active_panel = HUD_PANEL_RADAR; HUD_Panel_UpdateCvars(radar); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -2535,6 +2561,7 @@ void HUD_Score(void) hud_configure_active_panel = HUD_PANEL_SCORE; HUD_Panel_UpdateCvars(score); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -2719,6 +2746,7 @@ void HUD_RaceTimer (void) hud_configure_active_panel = HUD_PANEL_RACETIMER; HUD_Panel_UpdateCvars(racetimer); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -2914,6 +2942,7 @@ void HUD_VoteWindow(void) return; HUD_Panel_UpdateCvars(vote); + HUD_Panel_ApplyFadeAlpha(); if(uid2name_dialog) { @@ -2926,7 +2955,7 @@ void HUD_VoteWindow(void) pos = panel_pos; mySize = panel_size; - a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); + a = vote_alpha * (vote_highlighted ? autocvar_hud_panel_vote_alreadyvoted_alpha : 1); HUD_Panel_DrawBg(a); a = panel_fg_alpha * a; @@ -2977,7 +3006,7 @@ void HUD_VoteWindow(void) drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y); drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); } - else if(vote_highlighted == 2) { + else if(vote_highlighted == -1) { drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y); drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); } @@ -2996,10 +3025,6 @@ void HUD_VoteWindow(void) } drawresetcliparea(); - - if(!vote_active) { - vote_highlighted = 0; - } } // Mod icons panel (#10) @@ -3669,6 +3694,7 @@ void HUD_ModIcons(void) hud_configure_active_panel = HUD_PANEL_MODICONS; HUD_Panel_UpdateCvars(modicons); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -3723,6 +3749,7 @@ void HUD_DrawPressedKeys(void) HUD_Panel_UpdateCvars(pressedkeys); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -3787,6 +3814,7 @@ void HUD_Chat(void) hud_configure_active_panel = HUD_PANEL_CHAT; HUD_Panel_UpdateCvars(chat); + HUD_Panel_ApplyFadeAlpha(); if(autocvar__con_chat_maximized && !autocvar__hud_configure) // draw at full screen height if maximized { @@ -3862,6 +3890,7 @@ void HUD_EngineInfo(void) hud_configure_active_panel = HUD_PANEL_ENGINEINFO; HUD_Panel_UpdateCvars(engineinfo); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -3924,6 +3953,7 @@ void HUD_InfoMessages(void) hud_configure_active_panel = HUD_PANEL_INFOMESSAGES; HUD_Panel_UpdateCvars(infomessages); + HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -4103,12 +4133,14 @@ void HUD_Physics(void) if(!autocvar__hud_configure) { if(!autocvar_hud_panel_physics) return; - if(spectatee_status == -1 && autocvar_hud_panel_physics < 2) return; + if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return; + if(autocvar_hud_panel_physics == 3 && !(gametype == GAME_RACE || gametype == GAME_CTS)) return; } else hud_configure_active_panel = HUD_PANEL_PHYSICS; HUD_Panel_UpdateCvars(physics); + HUD_Panel_ApplyFadeAlpha(); HUD_Panel_DrawBg(1); if(panel_bg_padding) @@ -4319,34 +4351,51 @@ void HUD_Physics(void) drawstring_aspect(panel_pos + acceleration_offset, strcat(ftos_decimals(acceleration, 2), "g"), panel_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } +// CenterPrint (#16) +// #define CENTERPRINT_MAX_MSGS 10 #define CENTERPRINT_MAX_ENTRIES 50 +#define CENTERPRINT_SPACING 0.7 float cpm_index; string centerprint_messages[CENTERPRINT_MAX_MSGS]; float centerprint_msgID[CENTERPRINT_MAX_MSGS]; float centerprint_time[CENTERPRINT_MAX_MSGS]; +float centerprint_expire_time[CENTERPRINT_MAX_MSGS]; +float centerprint_countdown_num[CENTERPRINT_MAX_MSGS]; +float centerprint_fadetime; +float centerprint_showing; -string strip_CPID(string s) -{ - return substring(s, strstrofs(s, " ", 0) + 1, strlen(s)); -} -float get_CPID(string s) -{ - if(substring(s, 0, 1) != "\r") - return 0; - return stof(substring(s, 1, strstrofs(s, " ", 0))); -} -void centerprint(string strMessage) +void centerprint_generic(float new_id, string strMessage, float duration, float countdown_num) { float i, j; - if(autocvar_hud_panel_centerprint_time <= 0) + if(strMessage == "" && new_id == 0) + return; + + // strip trailing newlines + j = strlen(strMessage) - 1; + while(substring(strMessage, j, 1) == "\n" && j >= 0) + --j; + if (j < strlen(strMessage) - 1) + strMessage = substring(strMessage, 0, j + 1); + + if(strMessage == "" && new_id == 0) return; - if(strMessage == "") + // strip leading newlines + j = 0; + while(substring(strMessage, j, 1) == "\n" && j < strlen(strMessage)) + ++j; + if (j > 0) + strMessage = substring(strMessage, j, strlen(strMessage) - j); + + if(strMessage == "" && new_id == 0) return; - float new_id = get_CPID(strMessage); + if (!centerprint_showing) + centerprint_showing = TRUE; + + centerprint_fadetime = bound(0, autocvar_hud_panel_centerprint_fadetime, 1); for (i=0, j=cpm_index; i time + centerprint_fadetime || centerprint_expire_time[j] < time) + centerprint_expire_time[j] = time + centerprint_fadetime; + return; + } + break; // found a msg with the same id, at position j } } - --cpm_index; - if (cpm_index == -1) - cpm_index = CENTERPRINT_MAX_MSGS - 1; - if(centerprint_messages[cpm_index]) - strunzone(centerprint_messages[cpm_index]); - if (new_id) - centerprint_messages[cpm_index] = strzone(strip_CPID(strMessage)); + if (i == CENTERPRINT_MAX_MSGS) + { + // a msg with the same id was not found, add the msg at the next position + --cpm_index; + if (cpm_index == -1) + cpm_index = CENTERPRINT_MAX_MSGS - 1; + j = cpm_index; + } + if(centerprint_messages[j]) + strunzone(centerprint_messages[j]); + centerprint_messages[j] = strzone(strMessage); + centerprint_msgID[j] = new_id; + if (duration < 0) + centerprint_time[j] = -1; else - centerprint_messages[cpm_index] = strzone(strMessage); - centerprint_msgID[cpm_index] = new_id; - centerprint_time[cpm_index] = time; + { + if(duration == 0) + duration = max(1, autocvar_hud_panel_centerprint_time); + centerprint_time[j] = duration; + centerprint_expire_time[j] = time + duration; + } + centerprint_countdown_num[j] = countdown_num; } -// CenterPrint (#16) -// +void centerprint(string strMessage) +{ + centerprint_generic(0, strMessage, autocvar_hud_panel_centerprint_time, 0); +} + +void reset_centerprint_messages(void) +{ + float i; + for (i=0; i hud_configure_cp_generation_time) + { + float r; + r = random(); + if (r > 0.9) + centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: %d"), 1, 10); + else if (r > 0.8) + centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0); + else + centerprint(sprintf("Message at time %s", seconds_tostring(time))); + hud_configure_cp_generation_time = time + 1 + random()*4; + } + } + HUD_Panel_UpdateCvars(centerprint); + // this panel doesn't fade when showing the scoreboard + if(autocvar__menu_alpha) + HUD_Panel_ApplyFadeAlpha(); + + if(scoreboard_fade_alpha) + { + // move the panel below the scoreboard + if (scoreboard_bottom >= 0.96 * vid_conheight) + return; + vector target_pos; + target_pos = eY * scoreboard_bottom + eX * 0.5 * (vid_conwidth - panel_size_x); + panel_pos = panel_pos + (target_pos - panel_pos) * sqrt(scoreboard_fade_alpha); + panel_size_y = min(panel_size_y, vid_conheight - scoreboard_bottom); + } + HUD_Panel_DrawBg(1); + + if (!centerprint_showing) + return; + if(panel_bg_padding) { panel_pos += '1 1 0' * panel_bg_padding; @@ -4406,60 +4520,118 @@ void HUD_CenterPrint (void) // entries = bound(1, floor(CENTERPRINT_MAX_ENTRIES * 4 * panel_size_y/panel_size_x), CENTERPRINT_MAX_ENTRIES); // height = panel_size_y/entries; // fontsize = '1 1 0' * height; - height = vid_conheight/40 * autocvar_hud_panel_centerprint_fontscale; + height = vid_conheight/50 * autocvar_hud_panel_centerprint_fontscale; fontsize = '1 1 0' * height; entries = bound(1, floor(panel_size_y/height), CENTERPRINT_MAX_ENTRIES); float i, j, k, n; + float a, sz, align, current_msg_pos_y, msg_size; vector pos; string ts; - float a, sz, fade; + + n = -1; // if no msg will be displayed, n stays -1 pos = panel_pos; - fade = min(autocvar_hud_panel_centerprint_time/8, 0.25); + if (autocvar_hud_panel_centerprint_flip) + pos_y += panel_size_y; + align = bound(0, autocvar_hud_panel_centerprint_align, 1); for (i=0, j=cpm_index; i time) + if (centerprint_expire_time[j] < time) { - a = 1; - sz = 1; + if (centerprint_countdown_num[j] && centerprint_time[j] > 0) + { + centerprint_countdown_num[j] = centerprint_countdown_num[j] - 1; + if (centerprint_countdown_num[j] == 0) + continue; + centerprint_expire_time[j] = centerprint_expire_time[j] + centerprint_time[j]; + } + else + continue; + } + if (centerprint_time[j] < 0 || centerprint_expire_time[j] - centerprint_fadetime > time) + { + a = bound(0, (time - (centerprint_expire_time[j] - centerprint_time[j])) / centerprint_fadetime, 1); + sz = 0.8 + a * (1 - 0.8); } - else if (centerprint_time[j] + autocvar_hud_panel_centerprint_time > time) + else if (centerprint_expire_time[j] > time) { - a = (centerprint_time[j] + autocvar_hud_panel_centerprint_time - time) / fade; + a = (centerprint_expire_time[j] - time) / centerprint_fadetime; sz = 0.8 + a * (1 - 0.8); } drawfontscale = sz * '1 1 0'; - n = tokenizebyseparator(centerprint_messages[j], "\n"); + if (centerprint_countdown_num[j]) + n = tokenizebyseparator(sprintf(centerprint_messages[j], centerprint_countdown_num[j]), "\n"); + else + n = tokenizebyseparator(centerprint_messages[j], "\n"); + if (autocvar_hud_panel_centerprint_flip) + { + // check if the message can be entirely shown + for(k = 0; k < n; ++k) + { + getWrappedLine_remaining = argv(k); + while(getWrappedLine_remaining) + { + ts = getWrappedLine(panel_size_x * sz, fontsize, stringwidth_colors); + if (ts != "") + pos_y -= fontsize_y; + else + pos_y -= fontsize_y * CENTERPRINT_SPACING/2; + if (pos_y < panel_pos_y) // check if the next line can be shown + { + drawfontscale = '1 1 0'; + return; + } + } + } + current_msg_pos_y = pos_y; // save starting pos (first line) of the current message + } + + msg_size = pos_y; for(k = 0; k < n; ++k) { getWrappedLine_remaining = argv(k); while(getWrappedLine_remaining) { - ts = getWrappedLine(panel_size_x, fontsize, stringwidth_colors); - pos_x = panel_pos_x + (panel_size_x - stringwidth(ts, TRUE, fontsize)) * 0.5; + ts = getWrappedLine(panel_size_x * sz, fontsize, stringwidth_colors); if (ts != "") { - drawcolorcodedstring(pos + '0 1 0' * 1.5 * (1 - sz) * fontsize_y, ts, fontsize, a, DRAWFLAG_NORMAL); - pos_y += fontsize_y * 1.5; + if (align) + pos_x = panel_pos_x + (panel_size_x - stringwidth(ts, TRUE, fontsize)) * align; + drawcolorcodedstring(pos + eY * 0.5 * (1 - sz) * fontsize_y, ts, fontsize, a * panel_fg_alpha, DRAWFLAG_NORMAL); + pos_y += fontsize_y; } else - pos_y += fontsize_y; - if (pos_y > panel_pos_y + panel_size_y - fontsize_y) + pos_y += fontsize_y * CENTERPRINT_SPACING/2; + if (!autocvar_hud_panel_centerprint_flip && pos_y > panel_pos_y + panel_size_y - fontsize_y) // check if the next line can be shown { drawfontscale = '1 1 0'; return; } } } - if (a < 1) - pos_y -= 1.5 * fontsize_y * (1 - a*a); - drawfontscale = '1 1 0'; + msg_size = pos_y - msg_size; + if (autocvar_hud_panel_centerprint_flip) + { + pos_y = current_msg_pos_y - CENTERPRINT_SPACING * fontsize_y; + if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages + pos_y += (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(a)); + } + else + { + pos_y += CENTERPRINT_SPACING * fontsize_y; + if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages + pos_y -= (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(a)); + } + } + drawfontscale = '1 1 0'; + if (n == -1) + { + centerprint_showing = FALSE; + reset_centerprint_messages(); } } @@ -4544,6 +4716,14 @@ void HUD_Main (void) else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0) hud_fade_alpha = 1; + // panels that we want to be active together with the scoreboard + // they must call HUD_Panel_ApplyFadeAlpha(); only when showing the menu + if(scoreboard_fade_alpha == 1) + { + HUD_CenterPrint(); + return; + } + if(!autocvar__hud_configure && !hud_fade_alpha) return; @@ -4662,9 +4842,6 @@ void HUD_Main (void) if(autocvar__con_chat_maximized) HUD_Chat(); // HUD_DrawPanel(HUD_PANEL_CHAT); - if (autocvar__hud_configure && spectatee_status && hud_configure_prev == -1) // try to join if we are in hud_configure mode, but still spectating, and in the first frame (in order to get rid of motd when launching a server via the menu "HUD Setup" button) - localcmd("cmd selectteam auto; cmd join\n"); - if(autocvar__hud_configure && tab_panel != -1) { HUD_Panel_UpdatePosSizeForId(tab_panel)