seta hud_panel_healtharmor_maxhealth "200" "when you have this much health, the health status bar is full"
seta hud_panel_healtharmor_maxarmor "200" "when you have this much armor, the armor status bar is full"
-seta hud_panel_healtharmor_progressbar_gfx 1 "add graphic effects to the progressbars when spawning and when being damaged"
+seta hud_panel_healtharmor_progressbar_gfx 1 "enable graphic effects on the progressbars"
+seta hud_panel_healtharmor_progressbar_gfx_damage 5 "show damage effect when damaged at least by this amount; 0 disables the effect"
+seta hud_panel_healtharmor_progressbar_gfx_lowhealth 40 "health progressbar blinks when health is lower than this amount"
+seta hud_panel_healtharmor_progressbar_gfx_smooth 2 "smooth changes of the progressbar when health/armor change at least by this amount; 0 disables the effect"
seta hud_panel_notify_time 10 "time that a new entry stays until it fades out"
seta hud_panel_notify_fadetime 3 "fade out time"
seta hud_panel_radar_zoommode 0 "zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out"
alias hud_panel_radar_rotate "toggle hud_panel_radar_rotation 0 1 2 3 4"
-seta hud_panel_score_rankings 0 "show rankings in non-team games instead of the score difference: 1 always show my own score; 2 pure rankings"
+seta hud_panel_score_rankings 0 "show rankings: 1 always show my own score; 2 pure rankings"
seta hud_panel_engineinfo_framecounter_time 0.1 "time between framerate display updates"
seta hud_panel_engineinfo_framecounter_decimals 0 "amount of decimals to show"
seta hud_panel_infomessages_flip "1"
seta hud_panel_physics 0
-seta hud_panel_physics_pos "0.410000 0.590000"
-seta hud_panel_physics_size "0.180000 0.100000"
+seta hud_panel_physics_pos "0.420000 0.620000"
+seta hud_panel_physics_size "0.170000 0.080000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_bg_color ""
seta hud_panel_physics_bg_color_team ""
seta hud_progressbar_armor_color "0 0.6 0"
seta hud_progressbar_fuel_color "0.6 0.6 0"
seta hud_progressbar_nexball_color "0.7 0.1 0"
+seta hud_progressbar_speed_color "1 0.75 0"
+seta hud_progressbar_acceleration_color "0.5 0.75 1"
+seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 "
seta hud_panel_powerups_bg_border ""
seta hud_panel_powerups_bg_padding ""
seta hud_panel_powerups_flip "1"
-seta hud_panel_powerups_iconalign "4"
-seta hud_panel_powerups_baralign "4"
+seta hud_panel_powerups_iconalign "3"
+seta hud_panel_powerups_baralign "3"
seta hud_panel_powerups_progressbar "1"
seta hud_panel_powerups_progressbar_strength "progressbar"
seta hud_panel_powerups_progressbar_shield "progressbar"
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding ""
seta hud_panel_healtharmor_flip "0"
-seta hud_panel_healtharmor_iconalign "4"
-seta hud_panel_healtharmor_baralign "4"
+seta hud_panel_healtharmor_iconalign "3"
+seta hud_panel_healtharmor_baralign "3"
seta hud_panel_healtharmor_progressbar "1"
seta hud_panel_healtharmor_progressbar_health "progressbar"
seta hud_panel_healtharmor_progressbar_armor "progressbar"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
+seta hud_panel_physics 0
+seta hud_panel_physics_pos "0.410000 0.590000"
+seta hud_panel_physics_size "0.180000 0.100000"
+seta hud_panel_physics_bg ""
+seta hud_panel_physics_bg_color ""
+seta hud_panel_physics_bg_color_team ""
+seta hud_panel_physics_bg_alpha ""
+seta hud_panel_physics_bg_border ""
+seta hud_panel_physics_bg_padding ""
+seta hud_panel_physics_flip "0"
+seta hud_panel_physics_baralign "0"
+seta hud_panel_physics_acceleration_progressbar_mode "0"
+seta hud_panel_physics_progressbar "1"
+seta hud_panel_physics_text "1"
+
menu_sync
// Spectating
float spectatee_status;
-float prev_spectatee_status;
// short mapname
string shortmapname;
race_laptime = 0;
race_checkpointtime = 0;
}
+ if (autocvar_hud_panel_healtharmor_progressbar_gfx)
+ {
+ if ( (spectatee_status == -1 && newspectatee_status > 0) //before observing, now spectating
+ || (spectatee_status > 0 && newspectatee_status > 0 && spectatee_status != newspectatee_status) //changed spectated player
+ )
+ prev_p_health = -1;
+ else if(spectatee_status && !newspectatee_status) //before observing/spectating, now playing
+ prev_health = -1;
+ }
spectatee_status = newspectatee_status;
}
cvar_set("vid_conheight", h0);
}
- prev_spectatee_status = spectatee_status;
-
if(autocvar__hud_configure)
HUD_Panel_Mouse();
float autocvar_hud_panel_healtharmor_progressbar;
string autocvar_hud_panel_healtharmor_progressbar_armor;
string autocvar_hud_panel_healtharmor_progressbar_health;
-string autocvar_hud_panel_healtharmor_progressbar_gfx;
+float autocvar_hud_panel_healtharmor_progressbar_gfx;
+float autocvar_hud_panel_healtharmor_progressbar_gfx_damage;
+float autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth;
+float autocvar_hud_panel_healtharmor_progressbar_gfx_smooth;
+
float autocvar_hud_panel_healtharmor_text;
float autocvar_hud_panel_infomessages;
float autocvar_hud_panel_infomessages_flip;
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)
{
// 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;
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
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;
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;
}
// 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<entries; ++i)
+ {
+ //simulate my score is lower than all displayed players,
+ //so that I don't appear at all showing pure rankings.
+ //This is to better show the difference between the 2 ranking views
+ if (i == entries-1 && autocvar_hud_panel_score_rankings == 1)
+ {
+ rgb = '1 1 0';
+ drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ s = GetPlayerName(pl.sv_entnum);
+ score = 7;
+ }
+ else
+ {
+ s = sprintf(_("Player %d"), i + 1 - first_pl);
+ score -= 3;
+ }
+
+ if (team_count)
+ score_color = GetTeamRGB(ColorByTeam(mod(i + 2, team_count))) * 0.8;
+ s = textShortenToWidth(s, name_size, fontsize, stringwidth_colors);
+ drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos + eX * (name_size + spacing_size), ftos(score), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ pos_y += height;
+ }
+ return;
+ }
+
+ if (!scoreboard_fade_alpha) // the scoreboard too calls HUD_UpdatePlayerTeams
+ HUD_UpdatePlayerTeams();
+ 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)
+ drawfill(pos - eY * (height * (1 - 0.9) / 2) + eX * score_size * i, eX * score_size + eY * height, '1 1 1', highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(pos + eX * score_size * i, ftos(tm.(teamscores[ts_primary])), eX * score_size + eY * fontsize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
+ ++i;
+ }
+ first_pl = 1;
+ pos_y += height;
+ }
+ i = first_pl;
+ for (pl = players.sort_next; pl && i<entries; pl = pl.sort_next, ++i)
+ {
+ if (pl.team == COLOR_SPECTATOR)
+ continue;
+
+ if (i == entries-1 && !me_printed && pl != me)
+ if (autocvar_hud_panel_score_rankings == 1 && spectatee_status != -1)
+ {
+ for (pl = me.sort_next; pl; pl = pl.sort_next)
+ if (pl.team != COLOR_SPECTATOR)
+ break;
+
+ if (pl)
+ rgb = '1 1 0'; //not last but not among the leading players: yellow
+ else
+ rgb = '1 0 0'; //last: red
+ pl = me;
+ }
+
+ if (pl == me)
+ {
+ if (i == first_pl)
+ rgb = '0 1 0'; //first: green
+ me_printed = 1;
+ drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
+ }
+ if (team_count)
+ score_color = GetTeamRGB(pl.team) * 0.8;
+ s = textShortenToWidth(GetPlayerName(pl.sv_entnum), name_size, fontsize, stringwidth_colors);
+ drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos + eX * (name_size + spacing_size), ftos(pl.(scores[ps_primary])), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ pos_y += height;
+ }
+}
+
void HUD_Score(void)
{
if(!autocvar__hud_configure)
} else if (!teamplay) { // non-teamgames
if ((spectatee_status == -1 && !autocvar__hud_configure) || autocvar_hud_panel_score_rankings)
{
-#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;
- rgb = '1 1 1';
-
- const float name_size = mySize_x*0.75;
- const float highlight_alpha = 0.2;
- float i, me_printed;
- string s;
- if (autocvar__hud_configure)
- {
- score = 10 + SCOREPANEL_MAX_ENTRIES * 3;
- for (i=0; i<entries; ++i)
- {
- //simulate my score is lower than all displayed players,
- //so that I don't appear at all showing pure rankings.
- //This is to better show the difference between the 2 ranking views
- if (i == entries-1 && autocvar_hud_panel_score_rankings == 1)
- {
- rgb = '1 1 0';
- drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
- s = GetPlayerName(pl.sv_entnum);
- score = 7;
- }
- else
- {
- s = sprintf(_("Player %d"), ftos(i+1));
- score -= 3;
- }
-
- s = textShortenToWidth(s, name_size, fontsize, stringwidth_colors);
- drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring(pos + eX * mySize_x*0.79, ftos(score), fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- pos_y += height;
- }
- return;
- }
-
- if (!scoreboard_fade_alpha) // the scoreboard too calls HUD_UpdatePlayerTeams
- HUD_UpdatePlayerTeams();
-
- for (pl = players.sort_next, i=0; pl && i<entries; pl = pl.sort_next, ++i)
- {
- if (pl.team == COLOR_SPECTATOR)
- continue;
-
- if (i == entries-1 && !me_printed && pl != me)
- if (autocvar_hud_panel_score_rankings == 1 && spectatee_status != -1)
- {
- for (pl = me.sort_next; pl; pl = pl.sort_next)
- if (pl.team != COLOR_SPECTATOR)
- break;
-
- if (pl)
- rgb = '1 1 0'; //not last but not among the leading players: yellow
- else
- rgb = '1 0 0'; //last: red
- pl = me;
- }
-
- if (pl == me)
- {
- if (i == 0)
- rgb = '0 1 0'; //first: green
- me_printed = 1;
- drawfill(pos - eY * (height * (1 - 0.9) / 2), eX * mySize_x + eY * height, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
- }
- s = textShortenToWidth(GetPlayerName(pl.sv_entnum), name_size, fontsize, stringwidth_colors);
- drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring(pos + eX * mySize_x*0.79, ftos(pl.(scores[ps_primary])), fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
- pos_y += height;
- }
+ HUD_Score_Rankings(pos, mySize, me, 0);
return;
}
// me vector := [team/connected frags id]
drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
drawstring_aspect(pos + eX * 0.75 * mySize_x, distribution_str, eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
} else { // teamgames
- float max_fragcount;
- max_fragcount = -99;
-
float scores_count, row, column, rows, columns;
vector offset;
vector score_pos, score_size; //for scores other than myteam
- if (spectatee_status == -1)
+ if (spectatee_status == -1 || autocvar_hud_panel_score_rankings)
{
- if (autocvar__hud_configure)
- scores_count = 4;
- else for(tm = teams.sort_next; tm; tm = tm.sort_next) {
- if(tm.team == COLOR_SPECTATOR)
- continue;
+ for(tm = teams.sort_next; tm, tm.team != COLOR_SPECTATOR; tm = tm.sort_next)
++scores_count;
+ if (autocvar_hud_panel_score_rankings)
+ {
+ HUD_Score_Rankings(pos, mySize, me, scores_count);
+ return;
}
rows = mySize_y/mySize_x;
rows = bound(1, floor((sqrt(4 * (3/1) * rows * scores_count + rows * rows) + rows + 0.5) / 2), scores_count);
}
else
score_size = eX * mySize_x*(1/4) + eY * mySize_y*(1/3);
+
+ float max_fragcount;
+ max_fragcount = -99;
for(tm = teams.sort_next; tm; tm = tm.sort_next) {
if(tm.team == COLOR_SPECTATOR)
continue;
default: return 0;
}
}
+float ColorByTeam(float i)
+{
+ switch(i)
+ {
+ case 0: return COLOR_TEAM1;
+ case 1: return COLOR_TEAM2;
+ case 2: return COLOR_TEAM3;
+ case 3: return COLOR_TEAM4;
+ default: return COLOR_TEAM1;
+ }
+}
float GetPlayerColorForce(float i)
{
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Ammunition display:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Ammunition display:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_ammo_onlycurrent", _("Show only current ammo type")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_ammo_onlycurrent", _("Show only current ammo type")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Align icon:"));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "0", _("Left")));
- me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "1", _("Right")));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Align icon:")));
+ me.TD(me, 1, 2.4/2, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "0", _("Left")));
+ me.TD(me, 1, 2.4/2, e = makeXonoticRadioButton(2, "hud_panel_ammo_iconalign", "1", _("Right")));
}
#endif
me.TD(me, 1, 2.6, e = makeXonoticSlider(5, 60, 5, "con_chattime"));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "con_chatsound", _("Chat beep sound")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "con_chatsound", _("Chat beep sound")));
}
#endif
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Engine info:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Engine info:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_engineinfo_framecounter_exponentialmovingaverage", _("Use an averaging algorithm for fps")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_engineinfo_framecounter_exponentialmovingaverage", _("Use an averaging algorithm for fps")));
}
#endif
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_progressbar", _("Enable status bar")));
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_progressbar", _("Enable status bar")));
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Status bar alignment:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Status bar alignment:")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_healtharmor_baralign", "3", _("Outward")));
setDependent(e, "hud_panel_healtharmor_progressbar", 1, 1);
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Icon alignment:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Icon alignment:")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "0", _("Left")));
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "2", _("Inward")));
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_healtharmor_iconalign", "3", _("Outward")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_flip", _("Flip health and armor positions")));
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_flip", _("Flip health and armor positions")));
}
#endif
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Info messages:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Info messages:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_infomessages_flip", _("Flip align")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_infomessages_flip", _("Flip align")));
}
#endif
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Notifications:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Notifications:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_notify_print", _("Also print notifications to the console")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_notify_print", _("Also print notifications to the console")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_notify_flip", _("Flip notify order")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_notify_flip", _("Flip notify order")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Entry lifetime:")));
me.TR(me);
me.TD(me, 1, 1.4, e = makeXonoticCheckBox(0, "hud_panel_physics_progressbar", _("Status bar")));
- me.TD(me, 1, 1.6, e = makeXonoticTextSlider("hud_panel_physics_baralign"));
+ me.TD(me, 1, 2.6, e = makeXonoticTextSlider("hud_panel_physics_baralign"));
e.addValue(e, _("Left align") , "0");
e.addValue(e, _("Right align") , "1");
e.addValue(e, _("Inward align") , "2");
e.configureXonoticTextSliderValues(e);
setDependent(e, "hud_panel_physics_progressbar", 1, 3);
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_physics_flip", _("Flip speed/acceleration positions")));
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_physics_flip", _("Flip speed/acceleration positions")));
//speed
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Speed:"));
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Speed:")));
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_physics_speed_vertical", _("Include vertical speed")));
// me.TR(me);
// me.TDempty(me, 0.2);
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups_progressbar", _("Enable status bar")));
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_powerups_progressbar", _("Enable status bar")));
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Status bar alignment:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Status bar alignment:")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(2, "hud_panel_powerups_baralign", "3", _("Outward")));
setDependent(e, "hud_panel_powerups_progressbar", 1, 1);
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Icon alignment:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Icon alignment:")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "0", _("Left")));
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "2", _("Inward")));
me.TD(me, 1, 0.95, e = makeXonoticRadioButton(3, "hud_panel_powerups_iconalign", "3", _("Outward")));
me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_powerups_flip", _("Flip strength and shield positions")));
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_powerups_flip", _("Flip strength and shield positions")));
}
#endif
DIALOG_HUDPANEL_COMMON_NOTOGGLE();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Radar:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Radar:")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Alpha:")));
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, "Score:"));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Score:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Rankings:"));
- me.TD(me, 1, 2.6/3, e = makeXonoticRadioButton(1, "hud_panel_score_rankings", "0", "Off"));
- me.TD(me, 1, 2.6/3, e = makeXonoticRadioButton(1, "hud_panel_score_rankings", "1", "And me"));
- me.TD(me, 1, 2.6/3, e = makeXonoticRadioButton(1, "hud_panel_score_rankings", "2", "Pure"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Rankings:")));
+ me.TD(me, 1, 2.6/3, e = makeXonoticRadioButton(1, "hud_panel_score_rankings", "0", _("Off")));
+ me.TD(me, 1, 2.6/3, e = makeXonoticRadioButton(1, "hud_panel_score_rankings", "1", _("And me")));
+ me.TD(me, 1, 2.6/3, e = makeXonoticRadioButton(1, "hud_panel_score_rankings", "2", _("Pure")));
}
#endif
DIALOG_HUDPANEL_COMMON();
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Timer:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Timer:")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_panel_timer_increment", _("Show elapsed time")));
+ me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_timer_increment", _("Show elapsed time")));
}
#endif
me.TR(me);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Alpha after voting:")));
- me.TD(me, 1, 2.6, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_vote_alreadyvoted_alpha"));
+ me.TD(me, 1, 2.6, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_vote_alreadyvoted_alpha"));
}
#endif
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Fade effect:"));
+ me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Fade effect:")));
setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_", panelname, "_timeout_effect"))));
e.addValue(e, ZCTX(_("EF^None")), "0");
e.configureXonoticTextSliderValues(e);
setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_timeout")), "0");
me.TR(me);
- me.TD(me, 1, 2, e = makeXonoticTextLabel(0, _("Weapon icons:")));
+ me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Weapon icons:")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Show weapon ID as:")));
me.TD(me, 1, 0.8, e = makeXonoticRadioButton(2, "hud_panel_weapons_label", "2", _("Bind")));
me.TR(me);
me.TDempty(me, 0.2);
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_weapons_accuracy", _("Show Accuracy")));
- me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "hud_panel_weapons_ammo", _("Show Ammo")));
+ me.TD(me, 1, 3.8/2, e = makeXonoticCheckBox(0, "hud_panel_weapons_accuracy", _("Show Accuracy")));
+ me.TD(me, 1, 3.8/2, e = makeXonoticCheckBox(0, "hud_panel_weapons_ammo", _("Show Ammo")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Ammo bar color:")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Ammo bar alpha:")));
- me.TD(me, 1, 2.6, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_weapons_ammo_alpha"));
+ me.TD(me, 1, 2.4, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_weapons_ammo_alpha"));
setDependent(e, "hud_panel_weapons_ammo", 1, 1);
}
#endif
me.TR(me);
me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Panel background defaults:")));
me.TR(me);
- me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, "Background:"));
+ me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Background:")));
me.TD(me, 1, 2.6, e = makeXonoticTextSlider(strzone(strcat("hud_panel_bg"))));
e.addValue(e, _("Disable"), "0");
e.addValue(e, "border_default", "border_default"); // this is a file name!
string ColoredTeamName(float t);
void DecodeLevelParms (void);
//void dom_player_join_team(entity pl);
-void set_dom_state(void);
+void set_dom_state(entity e);
void ClientConnect (void)
{
float t;
send_CSQC_teamnagger();
if (g_domination)
- set_dom_state();
+ set_dom_state(self);
CheatInitClient();
float pps_blue;
float pps_yellow;
float pps_pink;
-void set_dom_state(void)
+void set_dom_state(entity e)
{
// BIG ugly hack to make stat sending work
- self.dom_total_pps = total_pps;
- self.dom_pps_red = pps_red;
- self.dom_pps_blue = pps_blue;
+ e.dom_total_pps = total_pps;
+ e.dom_pps_red = pps_red;
+ e.dom_pps_blue = pps_blue;
if(c3 >= 0)
- {
- self.dom_pps_yellow = pps_yellow;
- }
+ e.dom_pps_yellow = pps_yellow;
if(c4 >= 0)
- {
- self.dom_pps_pink = pps_pink;
- }
+ e.dom_pps_pink = pps_pink;
}
void() dom_controlpoint_setup;
WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
}
- FOR_EACH_PLAYER(self)
- set_dom_state();
-
WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
WaypointSprite_Ping(self.sprite);
self.captime = time;
+
+ FOR_EACH_PLAYER(head)
+ set_dom_state(head);
};
void AnimateDomPoint()