X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=c70003153727db151802168d2336775ed3380e97;hb=66685d1e5cdd5b7fb51a938bc4f326be85faa1f8;hp=9406d3c85b726abdf026a832cd08f26fb093aa39;hpb=66bf06d8ca243f8730e4a003f0a367224899796b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 9406d3c85..c70003153 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -89,11 +89,12 @@ void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector the vector HUD_Get_Num_Color (float x, float maxvalue) { + float blinkingamt; vector color; - if(x > maxvalue) { - color_x = 0; + if(x >= maxvalue) { + color_x = sin(2*M_PI*time); color_y = 1; - color_z = 0; + color_z = sin(2*M_PI*time); } else if(x > maxvalue * 0.75) { color_x = 0.4 - (x-150)*0.02 * 0.4; //red value between 0.4 -> 0 @@ -120,6 +121,14 @@ vector HUD_Get_Num_Color (float x, float maxvalue) color_y = 0; color_z = 0; } + + blinkingamt = (1 - x/maxvalue/0.25); + if(blinkingamt > 0) + { + 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); + } return color; } @@ -395,9 +404,9 @@ string MakeRaceString(float cp, float mytime, float histime, float lapdelta, str if(histime < 0) return strcat(col, cpname); else if(hisname == "") - return strcat(col, sprintf(_("%s (%s)")), cpname, timestr); + return strcat(col, sprintf(_("%s (%s)"), cpname, timestr)); else - return strcat(col, sprintf(_("%s (%s %s)")), cpname, timestr, strcat(hisname, col, lapstr)); + return strcat(col, sprintf(_("%s (%s %s)"), cpname, timestr, strcat(hisname, col, lapstr))); } // Check if the given name already exist in race rankings? In that case, where? (otherwise return 0) @@ -699,16 +708,9 @@ void HUD_Weapons(void) } float i, weapid, wpnalpha, weapon_cnt; - weapon_cnt = 0; - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - { - self = get_weaponinfo(i); - if(self.impulse >= 0) - ++weapon_cnt; - } // TODO make this configurable - if(weaponorder_bypriority != autocvar_cl_weaponpriority) + if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0]) { if(weaponorder_bypriority) strunzone(weaponorder_bypriority); @@ -729,6 +731,8 @@ void HUD_Weapons(void) ++weapon_cnt; } } + for(i = weapon_cnt; i < WEP_MAXCOUNT; ++i) + weaponorder[i] = NULL; heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world); weaponorder_cmp_str = string_null; @@ -803,11 +807,13 @@ void HUD_Weapons(void) float weapons_st = getstati(STAT_WEAPONS); - for(i = 0; i < weapon_cnt; ++i) + for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i) { + self = weaponorder[i]; + if (!self || self.impulse < 0) + continue; wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y; - self = weaponorder[i]; weapid = self.impulse; // draw background behind currently selected weapon @@ -837,7 +843,7 @@ void HUD_Weapons(void) } // draw the weapon icon - if((weapid >= 0) && (weapons_st & self.weapons)) + if(weapons_st & self.weapons) { drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL); @@ -902,7 +908,7 @@ void HUD_Weapons(void) string s; if(complain_weapon_type == 0) { - s = "Out of ammo"; + s = _("Out of ammo"); color = stov(autocvar_hud_panel_weapons_complainbubble_color_outofammo); } else if(complain_weapon_type == 1) { @@ -996,7 +1002,7 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); if(a > 0 && autocvar_hud_panel_ammo_progressbar) - HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, 0, 0, a/autocvar_hud_panel_ammo_maxammo, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, a/autocvar_hud_panel_ammo_maxammo, 0, 0, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * alpha, DRAWFLAG_NORMAL); if(autocvar_hud_panel_ammo_text) { @@ -1294,10 +1300,19 @@ void HUD_Powerups(void) // Health/armor (#3) // -float health_time, prev_health; -float armor_time, prev_armor; -var float saved_health = -2; -var float saved_armor = -2; + +// prev_* vars contain the health/armor at the previous FRAME +// set to -1 when player is dead or was not playing +float prev_health, prev_armor; +float health_damagetime, armor_damagetime; +float health_beforedamage, armor_beforedamage; +// old_p_* vars keep track of previous values when smoothing value changes of the progressbar +float old_p_health, old_p_armor; +float old_p_healthtime, old_p_armortime; +// prev_p_* vars contain the health/armor progressbar value at the previous FRAME +// set to -1 to forcedly stop effects when we switch spectated player (e.g. from playerX: 70h to playerY: 50h) +float prev_p_health, prev_p_armor; + void HUD_HealthArmor(void) { float armor, health, fuel; @@ -1309,36 +1324,36 @@ void HUD_HealthArmor(void) health = getstati(STAT_HEALTH); if(health <= 0) { - health_time = -1; + prev_health = -1; return; } - if (autocvar_hud_panel_healtharmor_progressbar_gfx) - { - if ( (prev_spectatee_status == -1 && spectatee_status > 0) //before observing, now spectating - || (prev_spectatee_status > 0 && spectatee_status > 0 && prev_spectatee_status != spectatee_status) //changed spectated player - ) - { - //no effect - saved_health = 0; - saved_armor = 0; - health_time = 0; - armor_time = 0; - } - else if(prev_spectatee_status == -1 || (prev_spectatee_status > 0 && !spectatee_status)) //before spectating/observing, now playing - health_time = -1; + armor = getstati(STAT_ARMOR); - if (health_time == -1) - { - //start the load effect - saved_health = -2; - saved_armor = -2; - health_time = time; - armor_time = time; - prev_health = 0; - prev_armor = 0; - } + // code to check for spectatee_status changes is in Ent_ClientData() + // prev_p_health and prev_health can be set to -1 there + + if (prev_p_health == -1) + { + // no effect + health_beforedamage = 0; + armor_beforedamage = 0; + health_damagetime = 0; + armor_damagetime = 0; + prev_health = health; + prev_armor = armor; + old_p_health = health; + old_p_armor = armor; + prev_p_health = health; + prev_p_armor = armor; + } + else if (prev_health == -1) + { + //start the load effect + health_damagetime = 0; + armor_damagetime = 0; + prev_health = 0; + prev_armor = 0; } - armor = getstati(STAT_ARMOR); fuel = getstati(STAT_FUEL); } else @@ -1461,34 +1476,39 @@ void HUD_HealthArmor(void) pain_health_alpha = 1; if (autocvar_hud_panel_healtharmor_progressbar_gfx) { - if (saved_health == -1) + if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0) { - if (prev_health == 0 || prev_health - health >= 3) + if (fabs(prev_health - health) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth) + { + if (time - old_p_healthtime < 1) + old_p_health = prev_p_health; + else + old_p_health = prev_health; + old_p_healthtime = time; + } + if (time - old_p_healthtime < 1) { - health_time = time; - saved_health = prev_health; + p_health += (old_p_health - health) * (1 - (time - old_p_healthtime)); + prev_p_health = p_health; } } - if (saved_health != -1) + if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0) { - float d = time - health_time; - if (d < 1) + if (prev_health - health >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage) { - if (saved_health == -2) - p_health *= sqrt(d); - else - { - HUD_Panel_DrawProgressBar(pos + health_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_health, saved_health/maxhealth, is_vertical, health_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * (1 - d * d), DRAWFLAG_NORMAL); - if (prev_health - health >= 1) //refresh the effect if repeatedly damaged - health_time = time; - } + if (time - health_damagetime >= 1) + health_beforedamage = prev_health; + health_damagetime = time; + } + if (time - health_damagetime < 1) + { + float health_damagealpha = 1 - (time - health_damagetime)*(time - health_damagetime); + HUD_Panel_DrawProgressBar(pos + health_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_health, health_beforedamage/maxhealth, is_vertical, health_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * health_damagealpha, DRAWFLAG_NORMAL); } - else - saved_health = -1; //damage effect ended } prev_health = health; - if (health <= 40 && saved_health != -2) + if (health <= autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth) { float BLINK_FACTOR = 0.15; float BLINK_BASE = 0.85; @@ -1511,30 +1531,35 @@ void HUD_HealthArmor(void) p_armor = armor; if (autocvar_hud_panel_healtharmor_progressbar_gfx) { - if (saved_armor == -1) + if (autocvar_hud_panel_healtharmor_progressbar_gfx_smooth > 0) { - if (prev_armor == 0 || prev_armor - armor >= 3) + if (fabs(prev_armor - armor) >= autocvar_hud_panel_healtharmor_progressbar_gfx_smooth) { - armor_time = time; - saved_armor = prev_armor; + if (time - old_p_armortime < 1) + old_p_armor = prev_p_armor; + else + old_p_armor = prev_armor; + old_p_armortime = time; + } + if (time - old_p_armortime < 1) + { + p_armor += (old_p_armor - armor) * (1 - (time - old_p_armortime)); + prev_p_armor = p_armor; } } - if (saved_armor != -1) + if (autocvar_hud_panel_healtharmor_progressbar_gfx_damage > 0) { - float d = time - armor_time; - if (d < 1) + if (prev_armor - armor >= autocvar_hud_panel_healtharmor_progressbar_gfx_damage) { - if (saved_armor == -2) - p_armor *= sqrt(d); - else - { - HUD_Panel_DrawProgressBar(pos + armor_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, saved_armor/maxarmor, is_vertical, armor_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * (1 - d * d), DRAWFLAG_NORMAL); - if (prev_armor - armor >= 1) //refresh the effect if repeatedly damaged - armor_time = time; - } + if (time - armor_damagetime >= 1) + armor_beforedamage = prev_armor; + armor_damagetime = time; + } + if (time - armor_damagetime < 1) + { + float armor_damagealpha = 1 - (time - armor_damagetime)*(time - armor_damagetime); + HUD_Panel_DrawProgressBar(pos + armor_offset, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, armor_beforedamage/maxarmor, is_vertical, armor_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * armor_damagealpha, DRAWFLAG_NORMAL); } - else - saved_armor = -1; //damage effect ended } prev_armor = armor; } @@ -1687,7 +1712,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s } } else if(type == KILL_FIRST_BLOOD) - print(sprintf("^1%s^1 drew first blood\n", s1)); + print(sprintf(_("^1%s^1 drew first blood\n"), s1)); else if (type == DEATH_TELEFRAG) { HUD_KillNotify_Push(s1, s2, 1, DEATH_TELEFRAG); if(gentle) @@ -1847,7 +1872,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s } else if (type == DEATH_SLIME) { HUD_KillNotify_Push(s1, "", 0, DEATH_SLIME); if(alsoprint) - print (sprintf("^1%s^1 was slimed\n", s1)); + print (sprintf(_("^1%s^1 was slimed\n"), s1)); } else if (type == DEATH_LAVA) { HUD_KillNotify_Push(s1, "", 0, DEATH_LAVA); if(alsoprint) @@ -1938,7 +1963,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s print(sprintf(_("%s^7 returned the %s\n"), s1, s2)); } else if(type == INFO_CAPTUREFLAG) { HUD_KillNotify_Push(s1, s2, 0, INFO_CAPTUREFLAG); - print(sprintf(_("%1^7 captured the %s%s\n"), s1, s2, s3)); + print(sprintf(_("%s^7 captured the %s%s\n"), s1, s2, s3)); } } else if(msg == MSG_RACE) { if(type == RACE_SERVER_RECORD) { @@ -2082,7 +2107,8 @@ void HUD_Notify (void) height = mySize_y/entries; vector fontsize; - fontsize = '0.5 0.5 0' * height; + float fontheight = height * autocvar_hud_panel_notify_fontsize; + fontsize = '0.5 0.5 0' * fontheight; float a; float when; @@ -2256,7 +2282,7 @@ void HUD_Notify (void) } attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); - pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); + pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight))); weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; if(s != "") @@ -2342,8 +2368,8 @@ void HUD_Notify (void) victim = textShortenToWidth(killnotify_victims[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); :hud_config_notifyprint width_attacker = stringwidth(attacker, TRUE, fontsize); - pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * (0.5 * fontsize_y + i * height); - pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); + pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight))); + pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight))); weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; if(s != "") @@ -2553,6 +2579,126 @@ void HUD_Radar(void) // Score (#7) // void HUD_UpdatePlayerTeams(); +void HUD_Score_Rankings(vector pos, vector mySize, entity me, float team_count) +{ + float score; + entity tm, pl; +#define SCOREPANEL_MAX_ENTRIES 6 +#define SCOREPANEL_ASPECTRATIO 2 + const float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES); + const float height = mySize_y/entries; + const vector fontsize = '0.9 0.9 0' * height; + pos_y += height * (1 - 0.9) / 2; + + vector rgb, score_color; + rgb = '1 1 1'; + score_color = '1 1 1'; + + const float name_size = mySize_x*0.75; + const float spacing_size = mySize_x*0.04; + const float highlight_alpha = 0.2; + float i, me_printed, first_pl; + string s; + i, first_pl = 0; + if (autocvar__hud_configure) + { + if (team_count) + { + // show team scores in the first line + float score_size = mySize_x / team_count; + for(tm = teams.sort_next; tm; tm = tm.sort_next) { + if(tm.team == COLOR_SPECTATOR) + continue; + if (tm.team == myteam) + HUD_Panel_DrawHighlight(pos - eY * (height * (1 - 0.9) / 2) + eX * score_size * i, eX * score_size + eY * height, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(pos + eX * score_size * i, ftos(123), eX * score_size + eY * fontsize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL); + ++i; + } + first_pl = 1; + pos_y += height; + } + score = 10 + SCOREPANEL_MAX_ENTRIES * 3; + for (i=first_pl; i