X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=fe84271e9b8cc895b88764cd55fd1209195b5d49;hp=0c162a7579fab09946c8f6a6ee72206d627c70fa;hb=04ab0ff7c3c5fcfe9780eadccfd5abd03d25b181;hpb=c835373b4523fc731df99fdb81575c2cac8ce3a1 diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 0c162a7579..fe84271e9b 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -242,10 +242,10 @@ float GetPlayerColorForce(float i) float GetPlayerColor(float i) { - if not(playerslots[i].gotscores) // unconnected - return FL_SPECTATOR; + if(!playerslots[i].gotscores) // unconnected + return NUM_SPECTATOR; else if(stof(getplayerkeyvalue(i, "frags")) == FRAGS_SPECTATOR) - return FL_SPECTATOR; + return NUM_SPECTATOR; else return GetPlayerColorForce(i); } @@ -264,7 +264,7 @@ HUD panels // draw the background/borders #define HUD_Panel_DrawBg(theAlpha)\ -if(panel_bg != "0")\ +if(panel_bg != "0" && panel_bg != "")\ draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * theAlpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER)) //basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu @@ -447,8 +447,7 @@ float GetAmmoTypeForWep(float i) void HUD_Weapons(void) { // declarations - WEPSET_DECLARE_A(weapons_stat); - WEPSET_COPY_AS(weapons_stat); + WepSet weapons_stat = WepSet_GetFromStat(); float i, f, a; float screen_ar, center_x = 0, center_y; float weapon_count, weapon_id; @@ -487,11 +486,9 @@ void HUD_Weapons(void) return; } } - else - hud_configure_active_panel = HUD_PANEL_WEAPONS; // update generic hud functions - HUD_Panel_UpdateCvars(weapons); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); draw_beginBoldFont(); @@ -526,8 +523,7 @@ void HUD_Weapons(void) weaponorder_cmp_str = string_null; } - if(autocvar_hud_panel_weapons_complainbubble) - if(autocvar__hud_configure || time - complain_weapon_time >= when + fadetime) + if(!autocvar_hud_panel_weapons_complainbubble || autocvar__hud_configure || time - complain_weapon_time >= when + fadetime) complain_weapon = 0; // determine which weapons are going to be shown @@ -535,9 +531,9 @@ void HUD_Weapons(void) { if(autocvar__hud_configure) { - if (WEPSET_EMPTY_A(weapons_stat)) + if (!weapons_stat) for(i = WEP_FIRST; i <= WEP_LAST; i += floor((WEP_LAST-WEP_FIRST)/5)) - WEPSET_OR_AW(weapons_stat, i); + weapons_stat |= WepSet_FromWeapon(i); if(menu_enabled != 2) HUD_Panel_DrawBg(1); // also draw the bg of the entire panel @@ -546,7 +542,7 @@ void HUD_Weapons(void) // do we own this weapon? weapon_count = 0; for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i) - if(WEPSET_CONTAINS_AW(weapons_stat, weaponorder[i].weapon)) + if(weapons_stat & WepSet_FromWeapon(weaponorder[i].weapon)) ++weapon_count; // add it anyway if weaponcomplain is shown @@ -734,16 +730,16 @@ void HUD_Weapons(void) weapon_id = self.impulse; // skip if this weapon doesn't exist - if (!self || self.impulse < 0) { continue; } + if(!self || weapon_id < 0) { continue; } // skip this weapon if we don't own it (and onlyowned is enabled)-- or if weapons_complainbubble is showing for this weapon if(autocvar_hud_panel_weapons_onlyowned) - if not(WEPSET_CONTAINS_AW(weapons_stat, self.weapon) || (self.weapon == complain_weapon)) + if (!((weapons_stat & WepSet_FromWeapon(self.weapon)) || (self.weapon == complain_weapon))) continue; // figure out the drawing position of weapon - weapon_pos = (panel_pos - + eX * column * weapon_size_x + weapon_pos = (panel_pos + + eX * column * weapon_size_x + eY * row * weapon_size_y); // draw background behind currently selected weapon @@ -762,7 +758,7 @@ void HUD_Weapons(void) } // drawing all the weapon items - if(WEPSET_CONTAINS_AW(weapons_stat, self.weapon)) + if(weapons_stat & WepSet_FromWeapon(self.weapon)) { // draw the weapon image drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); @@ -951,10 +947,8 @@ void HUD_Ammo(void) if(!autocvar_hud_panel_ammo) return; if(spectatee_status == -1) return; } - else - hud_configure_active_panel = HUD_PANEL_AMMO; - HUD_Panel_UpdateCvars(ammo); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); draw_beginBoldFont(); @@ -1139,7 +1133,7 @@ void HUD_Powerups(void) { if(!autocvar_hud_panel_powerups) return; if(spectatee_status == -1) return; - if not(getstati(STAT_ITEMS, 0, 24) & (IT_STRENGTH | IT_INVINCIBLE | IT_SUPERWEAPON)) return; + if(!(getstati(STAT_ITEMS, 0, 24) & (IT_STRENGTH | IT_INVINCIBLE | IT_SUPERWEAPON))) return; if (getstati(STAT_HEALTH) <= 0) return; strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); @@ -1155,14 +1149,12 @@ void HUD_Powerups(void) } else { - hud_configure_active_panel = HUD_PANEL_POWERUPS; - strength_time = 15; shield_time = 27; superweapons_time = 13; } - HUD_Panel_UpdateCvars(powerups); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); draw_beginBoldFont(); @@ -1398,14 +1390,12 @@ void HUD_HealthArmor(void) } else { - hud_configure_active_panel = HUD_PANEL_HEALTHARMOR; - health = 150; armor = 75; fuel = 20; } - HUD_Panel_UpdateCvars(healtharmor); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; @@ -1426,7 +1416,7 @@ void HUD_HealthArmor(void) if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display { vector v; - v = healtharmor_maxdamage(health, armor, armorblockpercent); + v = healtharmor_maxdamage(health, armor, armorblockpercent, DEATH_WEAPON); float x; x = floor(v_x + 1); @@ -1553,7 +1543,7 @@ void HUD_HealthArmor(void) { float BLINK_FACTOR = 0.15; float BLINK_BASE = 0.85; - float BLINK_FREQ = 9; + float BLINK_FREQ = 9; pain_health_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); } } @@ -1629,20 +1619,6 @@ void HUD_HealthArmor(void) // Notification area (#4) // -string Weapon_SuicideMessage(float deathtype) -{ - w_deathtype = deathtype; - get_weaponinfo(DEATH_WEAPONOF(deathtype)).weapon_func(WR_SUICIDEMESSAGE); - return w_deathtypestring; -} - -string Weapon_KillMessage(float deathtype) -{ - w_deathtype = deathtype; - get_weaponinfo(DEATH_WEAPONOF(deathtype)).weapon_func(WR_KILLMESSAGE); - return w_deathtypestring; -} - void HUD_Notify_Push(string icon, string attacker, string victim) { if(icon != "") @@ -1671,10 +1647,8 @@ void HUD_Notify(void) { if(!autocvar_hud_panel_notify) return; } - else - hud_configure_active_panel = HUD_PANEL_NOTIFY; - HUD_Panel_UpdateCvars(notify); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; @@ -1690,7 +1664,7 @@ void HUD_Notify(void) float entries, height; entries = bound(1, floor(KN_MAX_ENTRIES * mySize_y/mySize_x), KN_MAX_ENTRIES); height = mySize_y/entries; - + vector fontsize; float fontheight = height * autocvar_hud_panel_notify_fontsize; fontsize = '0.5 0.5 0' * fontheight; @@ -1752,7 +1726,7 @@ void HUD_Notify(void) { break; } - + attacker = notify_attackers[j]; victim = notify_victims[j]; icon = notify_icon[j]; @@ -1810,10 +1784,8 @@ void HUD_Timer(void) { if(!autocvar_hud_panel_timer) return; } - else - hud_configure_active_panel = HUD_PANEL_TIMER; - HUD_Panel_UpdateCvars(timer); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); draw_beginBoldFont(); @@ -1880,12 +1852,10 @@ void HUD_Radar(void) if (autocvar_hud_panel_radar != 2 && !teamplay) return; } } - else - hud_configure_active_panel = HUD_PANEL_RADAR; - HUD_Panel_UpdateCvars(radar); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); - + float f = 0; if (hud_panel_radar_maximized && !autocvar__hud_configure) @@ -1895,10 +1865,10 @@ void HUD_Radar(void) panel_size_y = bound(0.2, panel_size_y, 1) * vid_conheight; panel_pos_x = (vid_conwidth - panel_size_x) / 2; panel_pos_y = (vid_conheight - panel_size_y) / 2; - + panel_bg = strcat(hud_skin_path, "/border_default"); // always use the default border when maximized if(precache_pic(panel_bg) == "") { panel_bg = "gfx/hud/default/border_default"; } // fallback - + switch(hud_panel_radar_maximized_zoommode) { default: @@ -1915,7 +1885,7 @@ void HUD_Radar(void) f = 1; break; } - + switch(hud_panel_radar_maximized_rotation) { case 0: @@ -1944,7 +1914,7 @@ void HUD_Radar(void) f = 1; break; } - + switch(hud_panel_radar_rotation) { case 0: @@ -2035,13 +2005,13 @@ void HUD_Radar(void) for(tm = world; (tm = find(tm, classname, "entcs_receiver")); ) { color2 = GetPlayerColor(tm.sv_entnum); - //if(color == FL_SPECTATOR || color == color2) + //if(color == NUM_SPECTATOR || color == color2) draw_teamradar_player(tm.origin, tm.angles, Team_ColorRGB(color2)); } draw_teamradar_player(view_origin, view_angles, '1 1 1'); drawresetcliparea(); -}; +} // Score (#7) // @@ -2116,7 +2086,7 @@ void HUD_Score_Rankings(vector pos, vector mySize, entity me, float 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 == FL_SPECTATOR) + if(tm.team == NUM_SPECTATOR) continue; if (tm.team == myteam) drawfill(pos + eX * score_size * i, eX * score_size + eY * fontsize_y, '1 1 1', highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); @@ -2132,14 +2102,14 @@ void HUD_Score_Rankings(vector pos, vector mySize, entity me, float team_count) do for (pl = players.sort_next; pl && i max_fragcount) max_fragcount = score; @@ -2371,10 +2339,8 @@ void HUD_RaceTimer (void) if(!(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return; if(spectatee_status == -1) return; } - else - hud_configure_active_panel = HUD_PANEL_RACETIMER; - HUD_Panel_UpdateCvars(racetimer); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); draw_beginBoldFont(); @@ -2523,7 +2489,7 @@ float vote_prev; // previous state of vote_active to check for a change float vote_alpha; float vote_change; // "time" when vote_active changed -void HUD_VoteWindow(void) +void HUD_Vote(void) { if(autocvar_cl_allow_uid2name == -1 && (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (serverflags & SERVERFLAG_PLAYERSTATS))) { @@ -2555,8 +2521,6 @@ void HUD_VoteWindow(void) } else { - hud_configure_active_panel = HUD_PANEL_VOTE; - vote_yescount = 3; vote_nocount = 2; vote_needed = 4; @@ -2577,7 +2541,7 @@ void HUD_VoteWindow(void) if(!vote_alpha) return; - HUD_Panel_UpdateCvars(vote); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); if(uid2name_dialog) @@ -2668,32 +2632,100 @@ void HUD_VoteWindow(void) float mod_active; // is there any active mod icon? -// Clan Arena HUD modicons -void HUD_Mod_CA(vector pos, vector mySize) +void DrawCAItem(vector myPos, vector mySize, float aspect_ratio, float layout, float i) { - mod_active = 1; // CA should never hide the mod icons panel - float redalive, bluealive; - redalive = getstati(STAT_REDALIVE); - bluealive = getstati(STAT_BLUEALIVE); + float stat; + string pic; + vector color; +#ifdef GMQCC + stat = -1; + pic = ""; + color = '0 0 0'; +#endif + switch(i) + { + case 0: + stat = getstati(STAT_REDALIVE); + pic = "player_red.tga"; + color = '1 0 0'; + break; + case 1: + stat = getstati(STAT_BLUEALIVE); + pic = "player_blue.tga"; + color = '0 0 1'; + break; + case 2: + stat = getstati(STAT_YELLOWALIVE); + pic = "player_yellow.tga"; + color = '1 1 0'; + break; + default: + case 3: + stat = getstati(STAT_PINKALIVE); + pic = "player_pink.tga"; + color = '1 0 1'; + break; + } - vector redpos, bluepos; - if(mySize_x > mySize_y) + if(mySize_x/mySize_y > aspect_ratio) { - redpos = pos; - bluepos = pos + eY * 0.5 * mySize_y; - drawpic_aspect_skin(redpos, "player_red.tga", 0.5 * mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(redpos + eX * 0.5 * mySize_x, ftos(redalive), 0.5 * mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(bluepos, "player_blue.tga", 0.5 * mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(bluepos + eX * 0.5 * mySize_x, ftos(bluealive), 0.5 * mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + i = aspect_ratio * mySize_y; + myPos_x = myPos_x + (mySize_x - i) / 2; + mySize_x = i; } else { - redpos = pos; - bluepos = pos + eY * 0.5 * mySize_y; - drawpic_aspect_skin(redpos, "player_red.tga", eX * mySize_x + eY * 0.3 * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(redpos + eY * 0.3 * mySize_y, ftos(redalive), eX * mySize_x + eY * 0.2 * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(bluepos, "player_blue.tga", eX * mySize_x + eY * 0.3 * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(bluepos + eY * 0.3 * mySize_y, ftos(bluealive), eX * mySize_x + eY * 0.2 * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + i = 1/aspect_ratio * mySize_x; + myPos_y = myPos_y + (mySize_y - i) / 2; + mySize_y = i; + } + + if(layout) + { + drawpic_aspect_skin(myPos, pic, eX * 0.7 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(myPos + eX * 0.7 * mySize_x, ftos(stat), eX * 0.3 * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL); + } + else + drawstring_aspect(myPos, ftos(stat), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL); +} + +// Clan Arena and Freeze Tag HUD modicons +void HUD_Mod_CA(vector myPos, vector mySize) +{ + mod_active = 1; // required in each mod function that always shows something + entity tm; + float teams_count = 0; + for(tm = teams.sort_next; tm; tm = tm.sort_next) + if(tm.team != NUM_SPECTATOR) + ++teams_count; + + float layout; + if(gametype == MAPINFO_TYPE_CA) + layout = autocvar_hud_panel_modicons_ca_layout; + else //if(gametype == MAPINFO_TYPE_FREEZETAG) + layout = autocvar_hud_panel_modicons_freezetag_layout; + float rows, columns, aspect_ratio; + rows = mySize_y/mySize_x; + aspect_ratio = (layout) ? 2 : 1; + rows = bound(1, floor((sqrt((4 * aspect_ratio * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count); + columns = ceil(teams_count/rows); + + int i; + float row = 0, column = 0; + vector pos, itemSize; + itemSize = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); + for(i=0; i= rows) + { + row = 0; + ++column; + } } } @@ -2720,7 +2752,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) stat_items = getstati(STAT_ITEMS, 0, 24); redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3; blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3; - + if(redflag || blueflag) mod_active = 1; else @@ -2767,7 +2799,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) case 2: red_icon = "flag_red_lost"; break; case 3: red_icon = "flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; default: - if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_2)) + if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2)) red_icon = "flag_red_shielded"; else red_icon = string_null; @@ -2780,7 +2812,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) default: if(redflag == 3) red_icon_prevstatus = "flag_red_carrying"; // make it more visible - else if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_2)) + else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2)) red_icon_prevstatus = "flag_red_shielded"; else red_icon_prevstatus = string_null; @@ -2795,7 +2827,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) case 2: blue_icon = "flag_blue_lost"; break; case 3: blue_icon = "flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; default: - if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_1)) + if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1)) blue_icon = "flag_blue_shielded"; else blue_icon = string_null; @@ -2808,7 +2840,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) default: if(blueflag == 3) blue_icon_prevstatus = "flag_blue_carrying"; // make it more visible - else if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_1)) + else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1)) blue_icon_prevstatus = "flag_blue_shielded"; else blue_icon_prevstatus = string_null; @@ -2816,7 +2848,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) } if(mySize_x > mySize_y) { - if (myteam == FL_TEAM_1) { // always draw own flag on left + if (myteam == NUM_TEAM_1) { // always draw own flag on left redflag_pos = pos; blueflag_pos = pos + eX * 0.5 * mySize_x; } else { @@ -2825,7 +2857,7 @@ void HUD_Mod_CTF(vector pos, vector mySize) } flag_size = eX * 0.5 * mySize_x + eY * mySize_y; } else { - if (myteam == FL_TEAM_1) { // always draw own flag on left + if (myteam == NUM_TEAM_1) { // always draw own flag on left redflag_pos = pos; blueflag_pos = pos + eY * 0.5 * mySize_y; } else { @@ -2939,16 +2971,16 @@ void HUD_Mod_KH(vector pos, vector mySize) { switch(keyteam) { - case FL_TEAM_1: + case NUM_TEAM_1: drawpic_aspect_skin(pa, "kh_redarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% theAlpha key break; - case FL_TEAM_2: + case NUM_TEAM_2: drawpic_aspect_skin(pa, "kh_bluearrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% theAlpha key break; - case FL_TEAM_3: + case NUM_TEAM_3: drawpic_aspect_skin(pa, "kh_yellowarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% theAlpha key break; - case FL_TEAM_4: + case NUM_TEAM_4: drawpic_aspect_skin(pa, "kh_pinkarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% theAlpha key break; default: @@ -2997,29 +3029,29 @@ void HUD_Mod_KH(vector pos, vector mySize) float kaball_prevstatus; // last remembered status float kaball_statuschange_time; // time when the status changed -// we don't need to reset for keepaway since it immediately +// we don't need to reset for keepaway since it immediately // autocorrects prevstatus as to if the player has the ball or not void HUD_Mod_Keepaway(vector pos, vector mySize) { mod_active = 1; // keepaway should always show the mod HUD - + float BLINK_FACTOR = 0.15; float BLINK_BASE = 0.85; - float BLINK_FREQ = 5; + float BLINK_FREQ = 5; float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); - + float stat_items = getstati(STAT_ITEMS, 0, 24); float kaball = (stat_items/IT_KEY1) & 1; - + if(kaball != kaball_prevstatus) { kaball_statuschange_time = time; kaball_prevstatus = kaball; } - + vector kaball_pos, kaball_size; - + if(mySize_x > mySize_y) { kaball_pos = pos + eX * 0.25 * mySize_x; kaball_size = eX * 0.5 * mySize_x + eY * mySize_y; @@ -3027,13 +3059,13 @@ void HUD_Mod_Keepaway(vector pos, vector mySize) kaball_pos = pos + eY * 0.25 * mySize_y; kaball_size = eY * 0.5 * mySize_y + eX * mySize_x; } - + float kaball_statuschange_elapsedtime = time - kaball_statuschange_time; float f = bound(0, kaball_statuschange_elapsedtime*2, 1); - + if(kaball_prevstatus && f < 1) drawpic_aspect_skin_expanding(kaball_pos, "keepawayball_carrying", kaball_size, '1 1 1', panel_fg_alpha * kaball_alpha, DRAWFLAG_NORMAL, f); - + if(kaball) drawpic_aspect_skin(pos, "keepawayball_carrying", eX * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha * kaball_alpha * f, DRAWFLAG_NORMAL); } @@ -3091,7 +3123,7 @@ void HUD_Mod_Race(vector pos, vector mySize) float f; // yet another function has this score = me.(scores[ps_primary]); - if not((scores_flags[ps_primary] & SFL_TIME) && !teamplay) // race/cts record display on HUD + if(!(scores_flags[ps_primary] & SFL_TIME) || teamplay) // race/cts record display on HUD return; // no records in the actual race // clientside personal record @@ -3107,7 +3139,7 @@ void HUD_Mod_Race(vector pos, vector mySize) if(autocvar_cl_autodemo_delete_keeprecords) { f = autocvar_cl_autodemo_delete; - f &~= 1; + f &= ~1; cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record! } } @@ -3295,7 +3327,7 @@ void HUD_Mod_Dom(vector myPos, vector mySize) entity tm; float teams_count = 0; for(tm = teams.sort_next; tm; tm = tm.sort_next) - if(tm.team != FL_SPECTATOR) + if(tm.team != NUM_SPECTATOR) ++teams_count; float layout = autocvar_hud_panel_modicons_dom_layout; @@ -3307,11 +3339,11 @@ void HUD_Mod_Dom(vector myPos, vector mySize) int i; float row = 0, column = 0; + vector pos, itemSize; + itemSize = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); for(i=0; i 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter. @@ -3608,10 +3631,8 @@ void HUD_InfoMessages(void) { if(!autocvar_hud_panel_infomessages) return; } - else - hud_configure_active_panel = HUD_PANEL_INFOMESSAGES; - HUD_Panel_UpdateCvars(infomessages); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); vector pos, mySize; pos = panel_pos; @@ -3648,7 +3669,7 @@ void HUD_InfoMessages(void) vector fontsize; fontsize = '0.20 0.20 0' * mySize_y; - + float a; a = panel_fg_alpha; @@ -3671,7 +3692,7 @@ void HUD_InfoMessages(void) if(spectatee_status == -1) s = sprintf(_("^1Press ^3%s^1 to spectate"), getcommandkey("primary fire", "+fire")); else - s = sprintf(_("^1Press ^3%s^1 for another player"), getcommandkey("primary fire", "+fire")); + s = sprintf(_("^1Press ^3%s^1 or ^3%s^1 for next or previous player"), getcommandkey("next weapon", "weapnext"), getcommandkey("previous weapon", "weapprev")); drawInfoMessage(s) if(spectatee_status == -1) @@ -3683,9 +3704,7 @@ void HUD_InfoMessages(void) s = sprintf(_("^1Press ^3%s^1 for gamemode info"), getcommandkey("server info", "+show_info")); drawInfoMessage(s) - if(gametype == MAPINFO_TYPE_ARENA) - s = _("^1Wait for your turn to join"); - else if(gametype == MAPINFO_TYPE_LMS) + if(gametype == MAPINFO_TYPE_LMS) { entity sk; sk = playerslots[player_localnum]; @@ -3754,7 +3773,7 @@ void HUD_InfoMessages(void) { for(; tm.sort_next; tm = tm.sort_next) { - if(!tm.team_size || tm.team == FL_SPECTATOR) + if(!tm.team_size || tm.team == NUM_SPECTATOR) continue; if(!ts_min) ts_min = tm.team_size; else ts_min = min(ts_min, tm.team_size); @@ -3766,7 +3785,7 @@ void HUD_InfoMessages(void) s = strcat(blinkcolor, _("Teamnumbers are unbalanced!")); tm = GetTeam(myteam, false); if (tm) - if (tm.team != FL_SPECTATOR) + if (tm.team != NUM_SPECTATOR) if (tm.team_size == ts_max) s = strcat(s, sprintf(_(" Press ^3%s%s to adjust"), getcommandkey("team menu", "menu_showteamselect"), blinkcolor)); drawInfoMessage(s) @@ -3774,7 +3793,7 @@ void HUD_InfoMessages(void) } } } - else + else { s = _("^7Press ^3ESC ^7to show HUD options."); drawInfoMessage(s) @@ -3799,10 +3818,8 @@ void HUD_Physics(void) if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return; if(autocvar_hud_panel_physics == 3 && !(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return; } - else - hud_configure_active_panel = HUD_PANEL_PHYSICS; - HUD_Panel_UpdateCvars(physics); + HUD_Panel_UpdateCvars(); HUD_Panel_ApplyFadeAlpha(); draw_beginBoldFont(); @@ -3852,7 +3869,7 @@ void HUD_Physics(void) conversion_factor = 0.0254 * 1.943844492; // 1 m/s = 1.943844492 knots, because 1 knot = 1.852 km/h break; } - + vector vel = (csqcplayer ? csqcplayer.velocity : pmove_vel); float max_speed = floor( autocvar_hud_panel_physics_speed_max * conversion_factor + 0.5 ); @@ -3875,9 +3892,9 @@ void HUD_Physics(void) acceleration = (vlen(vel) - vlen(acc_prevspeed)); else acceleration = (vlen(vel - '0 0 1' * vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z)); - + acceleration = acceleration * (1 / max(0.0001, f)) * (0.0254 / 9.80665); - + acc_prevspeed = vel; acc_prevtime = time; @@ -4182,8 +4199,6 @@ void HUD_CenterPrint (void) } else { - hud_configure_active_panel = HUD_PANEL_CENTERPRINT; - if (!hud_configure_prev) reset_centerprint_messages(); if (time > hud_configure_cp_generation_time) @@ -4191,7 +4206,7 @@ void HUD_CenterPrint (void) 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); + centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: ^COUNT"), 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 @@ -4200,7 +4215,7 @@ void HUD_CenterPrint (void) } } - HUD_Panel_UpdateCvars(centerprint); + HUD_Panel_UpdateCvars(); // this panel doesn't fade when showing the scoreboard if(autocvar__menu_alpha) @@ -4212,9 +4227,9 @@ void HUD_CenterPrint (void) if (scoreboard_bottom >= 0.96 * vid_conheight) return; vector target_pos; - + target_pos = eY * scoreboard_bottom + eX * 0.5 * (vid_conwidth - panel_size_x); - + if(target_pos_y > panel_pos_y) { panel_pos = panel_pos + (target_pos - panel_pos) * sqrt(scoreboard_fade_alpha); @@ -4271,7 +4286,7 @@ void HUD_CenterPrint (void) } - // fade the centerprint_hud in/out + // fade the centerprint_hud in/out if(centerprint_time[j] < 0) a = bound(0, (time - centerprint_expire_time[j]) / max(0.0001, autocvar_hud_panel_centerprint_fade_in), 1); else if(centerprint_expire_time[j] - autocvar_hud_panel_centerprint_fade_out > time) @@ -4280,21 +4295,21 @@ void HUD_CenterPrint (void) a = (centerprint_expire_time[j] - time) / max(0.0001, autocvar_hud_panel_centerprint_fade_out); else a = 0; - + // set the size from fading in/out before subsequent fading - sz = autocvar_hud_panel_centerprint_fade_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_minfontsize); - + sz = autocvar_hud_panel_centerprint_fade_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_minfontsize); + // also fade it based on positioning if(autocvar_hud_panel_centerprint_fade_subsequent) { a = a * bound(autocvar_hud_panel_centerprint_fade_subsequent_passone_minalpha, (1 - (g / max(1, autocvar_hud_panel_centerprint_fade_subsequent_passone))), 1); // pass one: all messages after the first have half theAlpha a = a * bound(autocvar_hud_panel_centerprint_fade_subsequent_passtwo_minalpha, (1 - (g / max(1, autocvar_hud_panel_centerprint_fade_subsequent_passtwo))), 1); // pass two: after that, gradually lower theAlpha even more for each message } - + // finally set the size based on the new theAlpha from subsequent fading - sz = sz * (autocvar_hud_panel_centerprint_fade_subsequent_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_subsequent_minfontsize)); + sz = sz * (autocvar_hud_panel_centerprint_fade_subsequent_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_subsequent_minfontsize)); drawfontscale = sz * '1 1 0'; - + if (centerprint_countdown_num[j]) n = tokenizebyseparator(strreplace("^COUNT", count_seconds(centerprint_countdown_num[j]), centerprint_messages[j]), "\n"); else @@ -4337,15 +4352,15 @@ void HUD_CenterPrint (void) } } - ++g; // move next position number up - + ++g; // move next position number up + 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(sz)); - + if (pos_y < panel_pos_y) // check if the next message can be shown { drawfontscale = '1 1 0'; @@ -4357,7 +4372,7 @@ void HUD_CenterPrint (void) 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(sz)); - + if(pos_y > panel_pos_y + panel_size_y - fontsize_y) // check if the next message can be shown { drawfontscale = '1 1 0'; @@ -4388,44 +4403,6 @@ void HUD_Reset (void) HUD_Mod_CTF_Reset(); } -#define HUD_DrawPanel(id)\ -switch (id) {\ - case (HUD_PANEL_RADAR):\ - HUD_Radar(); break;\ - case (HUD_PANEL_WEAPONS):\ - HUD_Weapons(); break;\ - case (HUD_PANEL_AMMO):\ - HUD_Ammo(); break;\ - case (HUD_PANEL_POWERUPS):\ - HUD_Powerups(); break;\ - case (HUD_PANEL_HEALTHARMOR):\ - HUD_HealthArmor(); break;\ - case (HUD_PANEL_NOTIFY):\ - HUD_Notify(); break;\ - case (HUD_PANEL_TIMER):\ - HUD_Timer(); break;\ - case (HUD_PANEL_SCORE):\ - HUD_Score(); break;\ - case (HUD_PANEL_RACETIMER):\ - HUD_RaceTimer(); break;\ - case (HUD_PANEL_VOTE):\ - HUD_VoteWindow(); break;\ - case (HUD_PANEL_MODICONS):\ - HUD_ModIcons(); break;\ - case (HUD_PANEL_PRESSEDKEYS):\ - HUD_DrawPressedKeys(); break;\ - case (HUD_PANEL_CHAT):\ - HUD_Chat(); break;\ - case (HUD_PANEL_ENGINEINFO):\ - HUD_EngineInfo(); break;\ - case (HUD_PANEL_INFOMESSAGES):\ - HUD_InfoMessages(); break;\ - case (HUD_PANEL_PHYSICS):\ - HUD_Physics(); break;\ - case (HUD_PANEL_CENTERPRINT):\ - HUD_CenterPrint(); break;\ -} ENDS_WITH_CURLY_BRACE - void HUD_Main (void) { float i; @@ -4455,7 +4432,7 @@ void HUD_Main (void) // they must call HUD_Panel_ApplyFadeAlpha(); only when showing the menu if(scoreboard_fade_alpha == 1) { - HUD_CenterPrint(); + (panel = HUD_PANEL(CENTERPRINT)).panel_draw(); return; } @@ -4504,8 +4481,10 @@ void HUD_Main (void) vector color; float hud_dock_color_team = autocvar_hud_dock_color_team; if((teamplay) && hud_dock_color_team) { - f = stof(getplayerkeyvalue(current_player - 1, "colors")); - color = colormapPaletteColor(mod(f, 16), 1) * hud_dock_color_team; + if(autocvar__hud_configure && myteam == NUM_SPECTATOR) + color = '1 0 0' * hud_dock_color_team; + else + color = myteamcolors * hud_dock_color_team; } else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && hud_dock_color_team) { color = '1 0 0' * hud_dock_color_team; @@ -4580,34 +4559,38 @@ void HUD_Main (void) hud_draw_maximized = 0; // draw panels in order specified by panel_order array for(i = HUD_PANEL_NUM - 1; i >= 0; --i) - HUD_DrawPanel(panel_order[i]); + (panel = hud_panel[panel_order[i]]).panel_draw(); hud_draw_maximized = 1; // panels that may be maximized must check this var // draw maximized panels on top if(hud_panel_radar_maximized) - HUD_Radar(); + (panel = HUD_PANEL(RADAR)).panel_draw(); if(autocvar__con_chat_maximized) - HUD_Chat(); + (panel = HUD_PANEL(CHAT)).panel_draw(); if(autocvar__hud_configure) { - if(tab_panel != -1) + if(tab_panel) { - HUD_Panel_UpdatePosSizeForId(tab_panel) + panel = tab_panel; + HUD_Panel_UpdatePosSize() drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL); } - if(highlightedPanel != -1) + if(highlightedPanel) { - HUD_Panel_UpdatePosSizeForId(highlightedPanel); + panel = highlightedPanel; + HUD_Panel_UpdatePosSize() HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha)); } if(!hud_configure_prev || hud_configure_prev == -1) { if(autocvar_hud_cursormode) { setcursormode(1); } hudShiftState = 0; + for(i = HUD_PANEL_NUM - 1; i >= 0; --i) + hud_panel[panel_order[i]].update_time = time; } } - else if (hud_configure_prev && autocvar_hud_cursormode) + else if(hud_configure_prev && hud_configure_prev != -1 && autocvar_hud_cursormode) setcursormode(0); hud_configure_prev = autocvar__hud_configure;