]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote branch 'origin/master' into samual/hud_updates
authorSamual <samual@xonotic.org>
Mon, 3 Oct 2011 14:57:38 +0000 (10:57 -0400)
committerSamual <samual@xonotic.org>
Mon, 3 Oct 2011 14:57:38 +0000 (10:57 -0400)
14 files changed:
1  2 
qcsrc/client/hud.qc
qcsrc/client/hud_config.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_hagar.qc
qcsrc/server/w_hlac.qc
qcsrc/server/w_minelayer.qc
qcsrc/server/w_minstanex.qc
qcsrc/server/w_nex.qc
qcsrc/server/w_rifle.qc
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_uzi.qc

diff --combined qcsrc/client/hud.qc
index c4364a209ba091ffd8224f0ea6e3d1f5e237cb32,3d3fe93cc41ce8ba33a5116c9cde740b1af9c9e3..76a2db6794315aa1372ae80f97ac2749d01fc6f7
@@@ -431,58 -431,40 +431,58 @@@ float GetAmmoTypeForWep(float i
  
  void HUD_Weapons(void)
  {
 -      float i, f, screen_ar;
 -      float center_x, center_y;
 -    if(hud != HUD_NORMAL) return;
 +      // declarations
 +      float weapons_stat = getstati(STAT_WEAPONS); 
 +      float i, f, a, j, factor;
 +      float screen_ar, center_x, center_y; 
 +      float weapon_count, weapon_id, weapon_alpha; 
 +      float row, column, rows, columns; 
 +      float aspect = autocvar_hud_panel_weapons_aspect;
 +      
 +      float show_accuracy, panel_weapon_accuracy;
 +      
 +      float timeout = autocvar_hud_panel_weapons_timeout;
 +      float timein_effect_length = (autocvar_hud_panel_weapons_timeout_effect ? 0.375 : 0);
 +      float timeout_effect_length = (autocvar_hud_panel_weapons_timeout_effect ? 0.75 : 0);
 +      
 +      float ammo_type, ammo_full, ammo_alpha;
 +      float barsize_x, barsize_y, baroffset_x, baroffset_y;
 +      
 +      float when = autocvar_hud_panel_weapons_complainbubble_time;
 +      float fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
 +      
 +      vector weapon_pos, weapon_size;
 +      vector old_panel_size;
 +      vector color, ammo_color;
 +      
 +      // check to see if we want to continue
 +  if(hud != HUD_NORMAL) { return; }
 +  
        if(!autocvar__hud_configure)
 -      {
 -              if(!autocvar_hud_panel_weapons) return;
 -              if(spectatee_status == -1) return;
 -      }
 +              if((!autocvar_hud_panel_weapons) || (spectatee_status == -1))
 +                      return;
 +              else if(timeout && time >= weapontime + timeout + timeout_effect_length)
 +              {
 +                      weaponprevtime = time;
 +                      return;
 +              }
        else
                hud_configure_active_panel = HUD_PANEL_WEAPONS;
  
 -      float timeout = autocvar_hud_panel_weapons_timeout;
 -      float timeout_effect_length, timein_effect_length;
 -      if (autocvar_hud_panel_weapons_timeout_effect == 0)
 +      // update generic hud functions
 +      HUD_Panel_UpdateCvars(weapons);
 +      HUD_Panel_ApplyFadeAlpha();
 +      
 +      // calculate fading effect to weapon images for when the panel is idle
 +      if(autocvar_hud_panel_weapons_fade)
        {
 -              timeout_effect_length = 0;
 -              timein_effect_length = 0;
 +              weapon_alpha = 3.2 - 2 * (time - weapontime);
 +              weapon_alpha = bound(0.7, weapon_alpha, 1) * panel_fg_alpha;
        }
        else
 -      {
 -              timeout_effect_length = 0.75;
 -              timein_effect_length = 0.375;
 -      }
 -
 -      if (timeout && time >= weapontime + timeout + timeout_effect_length && !autocvar__hud_configure)
 -      {
 -              weaponprevtime = time;
 -              return;
 -      }
 +              weapon_alpha = panel_fg_alpha;
  
 -      HUD_Panel_UpdateCvars(weapons);
 -      HUD_Panel_ApplyFadeAlpha();
 -
 -      // TODO make this configurable
 +      // figure out weapon order (how the weapons are sorted) // TODO make this configurable
        if(weaponorder_bypriority != autocvar_cl_weaponpriority || !weaponorder[0])
        {
                float weapon_cnt;
  
                weaponorder_cmp_str = string_null;
        }
 -
 -      float when, fadetime;
 -      when = autocvar_hud_panel_weapons_complainbubble_time;
 -      fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime;
 -      float weapons_st = getstati(STAT_WEAPONS);
 -      float weapon_count;
 +      
 +      // determine which weapons are going to be shown
        if (autocvar_hud_panel_weapons_onlyowned)
        {
                if(autocvar__hud_configure)
                {
 -                      if (weapons_st == 0)
 +                      if (weapons_stat == 0) // create some fake weapons anyway
                                for(i = 0; i <= WEP_LAST-WEP_FIRST; i += floor((WEP_LAST-WEP_FIRST)/5))
 -                                      weapons_st |= power2of(i);
 +                                      weapons_stat |= power2of(i);
 +                                      
                        if(menu_enabled != 2)
                                HUD_Panel_DrawBg(1); // also draw the bg of the entire panel
                }
 -
 -              vector old_panel_size;
 +              
 +              // do we own this weapon?
                for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
 -              {
 -                      if(weapons_st & weaponorder[i].weapons)
 +                      if(weapons_stat & weaponorder[i].weapons)
                                ++weapon_count;
 -              }
 -              if(!autocvar__hud_configure && (autocvar_hud_panel_weapons_complainbubble && time - complain_weapon_time < when + fadetime))// && complain_weapon >= 0
 -                      ++weapon_count;
 -              if (weapon_count == 0)
 -                      return;
 +              
 +              // add it anyway if weaponcomplain is shown
 +              if((!autocvar__hud_configure) 
 +                      && (autocvar_hud_panel_weapons_complainbubble 
 +                              && time - complain_weapon_time < when + fadetime))
 +                                      ++weapon_count;
 +                      
 +              // might as well commit suicide now, no reason to live ;)
 +              if (weapon_count == 0) { return; }
 +              
                // reduce size of the panel
                if (panel_size_y > panel_size_x)
                {
        else
                weapon_count = WEP_COUNT;
  
 -      if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
 +      // animation for fading in/out the panel respectively when not in use
 +      if(!autocvar__hud_configure)
        {
 -              f = (time - (weapontime + timeout)) / timeout_effect_length;
 -              if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
 -              {
 -                      panel_bg_alpha *= (1 - f);
 -                      panel_fg_alpha *= (1 - f);
 -              }
 -              if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
 +              if (timeout && time >= weapontime + timeout) // apply timeout effect if needed
                {
 -                      f *= f; // for a cooler movement
 -                      center_x = panel_pos_x + panel_size_x/2;
 -                      center_y = panel_pos_y + panel_size_y/2;
 -                      screen_ar = vid_conwidth/vid_conheight;
 -                      if (center_x/center_y < screen_ar) //bottom left
 +                      f = (time - (weapontime + timeout)) / timeout_effect_length;
 +                      if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
                        {
 -                              if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
 -                                      panel_pos_y += f * (vid_conheight - panel_pos_y);
 -                              else //left
 -                                      panel_pos_x -= f * (panel_pos_x + panel_size_x);
 +                              panel_bg_alpha *= (1 - f);
 +                              panel_fg_alpha *= (1 - f);
                        }
 -                      else //top right
 +                      if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
                        {
 -                              if ((vid_conwidth - center_x)/center_y < screen_ar) //right
 -                                      panel_pos_x += f * (vid_conwidth - panel_pos_x);
 -                              else //top
 -                                      panel_pos_y -= f * (panel_pos_y + panel_size_y);
 +                              f *= f; // for a cooler movement
 +                              center_x = panel_pos_x + panel_size_x/2;
 +                              center_y = panel_pos_y + panel_size_y/2;
 +                              screen_ar = vid_conwidth/vid_conheight;
 +                              if (center_x/center_y < screen_ar) //bottom left
 +                              {
 +                                      if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
 +                                              panel_pos_y += f * (vid_conheight - panel_pos_y);
 +                                      else //left
 +                                              panel_pos_x -= f * (panel_pos_x + panel_size_x);
 +                              }
 +                              else //top right
 +                              {
 +                                      if ((vid_conwidth - center_x)/center_y < screen_ar) //right
 +                                              panel_pos_x += f * (vid_conwidth - panel_pos_x);
 +                                      else //top
 +                                              panel_pos_y -= f * (panel_pos_y + panel_size_y);
 +                              }
                        }
 +                      weaponprevtime = time - (1 - f) * timein_effect_length;
                }
 -              weaponprevtime = time - (1 - f) * timein_effect_length;
 -      }
 -      else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure)
 -      {
 -              f = (time - weaponprevtime) / timein_effect_length;
 -              if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
 -              {
 -                      panel_bg_alpha *= (f);
 -                      panel_fg_alpha *= (f);
 -              }
 -              if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
 +              else if (timeout && time < weaponprevtime + timein_effect_length) // apply timein effect if needed
                {
 -                      f *= f; // for a cooler movement
 -                      f = 1 - f;
 -                      center_x = panel_pos_x + panel_size_x/2;
 -                      center_y = panel_pos_y + panel_size_y/2;
 -                      screen_ar = vid_conwidth/vid_conheight;
 -                      if (center_x/center_y < screen_ar) //bottom left
 +                      f = (time - weaponprevtime) / timein_effect_length;
 +                      if (autocvar_hud_panel_weapons_timeout_effect == 1 || autocvar_hud_panel_weapons_timeout_effect == 3)
                        {
 -                              if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
 -                                      panel_pos_y += f * (vid_conheight - panel_pos_y);
 -                              else //left
 -                                      panel_pos_x -= f * (panel_pos_x + panel_size_x);
 +                              panel_bg_alpha *= (f);
 +                              panel_fg_alpha *= (f);
                        }
 -                      else //top right
 +                      if (autocvar_hud_panel_weapons_timeout_effect == 2 || autocvar_hud_panel_weapons_timeout_effect == 3)
                        {
 -                              if ((vid_conwidth - center_x)/center_y < screen_ar) //right
 -                                      panel_pos_x += f * (vid_conwidth - panel_pos_x);
 -                              else //top
 -                                      panel_pos_y -= f * (panel_pos_y + panel_size_y);
 +                              f *= f; // for a cooler movement
 +                              f = 1 - f;
 +                              center_x = panel_pos_x + panel_size_x/2;
 +                              center_y = panel_pos_y + panel_size_y/2;
 +                              screen_ar = vid_conwidth/vid_conheight;
 +                              if (center_x/center_y < screen_ar) //bottom left
 +                              {
 +                                      if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
 +                                              panel_pos_y += f * (vid_conheight - panel_pos_y);
 +                                      else //left
 +                                              panel_pos_x -= f * (panel_pos_x + panel_size_x);
 +                              }
 +                              else //top right
 +                              {
 +                                      if ((vid_conwidth - center_x)/center_y < screen_ar) //right
 +                                              panel_pos_x += f * (vid_conwidth - panel_pos_x);
 +                                      else //top
 +                                              panel_pos_y -= f * (panel_pos_y + panel_size_y);
 +                              }
                        }
                }
        }
  
 +      // draw the background, then change the virtual size of it to better fit other items inside 
        HUD_Panel_DrawBg(1);
        if(panel_bg_padding)
        {
                panel_pos += '1 1 0' * panel_bg_padding;
 -              panel_size -= '2 2 0' * panel_bg_padding;
 +              panel_size -= '1 1 0' * panel_bg_padding;
        }
  
 -      float weapid, wpnalpha;
 -
 -      if(autocvar_hud_panel_weapons_fade)
 -      {
 -              wpnalpha = 3.2 - 2 * (time - weapontime);
 -              wpnalpha = bound(0.7, wpnalpha, 1) * panel_fg_alpha;
 -      }
 -      else
 -              wpnalpha = panel_fg_alpha;
 -
 -      float rows, columns;
 -      float aspect = autocvar_hud_panel_weapons_aspect;
 +      // after the sizing and animations are done, update the other values
        rows = panel_size_y/panel_size_x;
        rows = bound(1, floor((sqrt(4 * aspect * rows * weapon_count + rows * rows) + rows + 0.5) / 2), weapon_count);
 -
        columns = ceil(weapon_count/rows);
 -      float row, column;
 -
 -      float a, type, fullammo;
 -
 -      vector color;
 -      vector wpnpos;
 -      vector wpnsize;
 -
 -      vector ammo_color;
 -      float ammo_alpha;
 -      wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
 -      float barsize_x, barsize_y, baroffset_x, baroffset_y;
 +      weapon_size = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
 +      
 +      // calculate position/size for visual bar displaying ammount of ammo status
        if (autocvar_hud_panel_weapons_ammo)
        {
                ammo_color = stov(autocvar_hud_panel_weapons_ammo_color);
                ammo_alpha = panel_fg_alpha * autocvar_hud_panel_weapons_ammo_alpha;
  
 -
 -              if(wpnsize_x/wpnsize_y > aspect)
 +              if(weapon_size_x/weapon_size_y > aspect)
                {
 -                      barsize_x = aspect * wpnsize_y;
 -                      barsize_y = wpnsize_y;
 -                      baroffset_x = (wpnsize_x - barsize_x) / 2;
 +                      barsize_x = aspect * weapon_size_y;
 +                      barsize_y = weapon_size_y;
 +                      baroffset_x = (weapon_size_x - barsize_x) / 2;
                }
                else
                {
 -                      barsize_y = 1/aspect * wpnsize_x;
 -                      barsize_x = wpnsize_x;
 -                      baroffset_y = (wpnsize_y - barsize_y) / 2;
 +                      barsize_y = 1/aspect * weapon_size_x;
 +                      barsize_x = weapon_size_x;
 +                      baroffset_y = (weapon_size_y - barsize_y) / 2;
                }
        }
  
 -      float show_accuracy;
 -      float weapon_stats;
        if(autocvar_hud_panel_weapons_accuracy && acc_levels)
        {
                show_accuracy = true;
  
        for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
        {
 +              // retrieve information about the current weapon to be drawn
                self = weaponorder[i];
 -              if (!self || self.impulse < 0)
 -                      continue;
 -              if (autocvar_hud_panel_weapons_onlyowned)
 -              if (!((weapons_st & self.weapons) || (self.weapon == complain_weapon && time - complain_weapon_time < when + fadetime && autocvar_hud_panel_weapons_complainbubble)))
 -                      continue;
 -              wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y;
 -
 -              weapid = self.impulse;
 +              weapon_id = self.impulse;
 +              
 +              // skip if this weapon doesn't exist
 +              if (!self || self.impulse < 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
 +                      && !((weapons_stat & self.weapons) 
 +                      || (self.weapon == complain_weapon 
 +                              && time - complain_weapon_time < when + fadetime 
 +                              && autocvar_hud_panel_weapons_complainbubble)))
 +                                      continue;
 +                                      
 +              // figure out the drawing position of weapon
 +              weapon_pos = (panel_pos 
 +                      + eX * column * weapon_size_x 
 +                      + eY * row * weapon_size_y);
  
                // draw background behind currently selected weapon
                if(self.weapon == switchweapon)
 -                      drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
 +                      drawpic_aspect_skin(weapon_pos, "weapon_current_bg", weapon_size, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL);
  
                // draw the weapon accuracy
                if(show_accuracy)
                {
 -                      weapon_stats = weapon_accuracy[self.weapon-WEP_FIRST];
 -                      if(weapon_stats >= 0)
 +                      panel_weapon_accuracy = weapon_accuracy[self.weapon-WEP_FIRST];
 +                      if(panel_weapon_accuracy >= 0)
                        {
 -                              // find the max level lower than weapon_stats
 -                              float j;
 +                              // find the max level lower than weapon_accuracy
                                j = acc_levels-1;
 -                              while ( j && weapon_stats < acc_lev[j] )
 +                              while ( j && panel_weapon_accuracy < acc_lev[j] )
                                        --j;
  
 -                              // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
 -                              float factor;
 -                              factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
 +                              // inject color j+1 in color j, how much depending on how much weapon_accuracy is higher than level j
 +                              factor = (panel_weapon_accuracy - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
                                color = acc_col[j];
                                color = color + factor * (acc_col[j+1] - color);
  
 -                              drawpic_aspect_skin(wpnpos, "weapon_accuracy", wpnsize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawpic_aspect_skin(weapon_pos, "weapon_accuracy", weapon_size, color, panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                }
  
 -              // draw the weapon icon
 -              if(weapons_st & self.weapons)
 +              // drawing all the weapon items
 +              if(weapons_stat & self.weapons)
                {
 -                      drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL);
 -
 -                      if(autocvar_hud_panel_weapons_label == 1) // weapon number
 -                              drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                      else if(autocvar_hud_panel_weapons_label == 2) // bind
 -                              drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                      // draw the weapon image
 +                      drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL);
  
 +                      // draw weapon label string
 +                      switch(autocvar_hud_panel_weapons_label)
 +                      {
 +                              case 1: // weapon number
 +                                      drawstring(weapon_pos, ftos(weapon_id), '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      break;
 +                                      
 +                              case 2: // bind
 +                                      drawstring(weapon_pos, getcommandkey(ftos(weapon_id), strcat("impulse ", ftos(weapon_id))), '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      break;
 +                                      
 +                              case 3: // weapon name
 +                                      drawstring(weapon_pos, self.netname, '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +                                      break;
 +                                      
 +                              default: // nothing
 +                                      break;
 +                      }
 +                      
                        // draw ammo status bar
                        if(autocvar_hud_panel_weapons_ammo && self.weapon != WEP_TUBA && self.weapon != WEP_LASER && self.weapon != WEP_PORTO)
                        {
                                a = 0;
 -                              type = GetAmmoTypeForWep(self.weapon);
 -                              if(type != -1)
 -                                      a = getstati(GetAmmoStat(type)); // how much ammo do we have?
 +                              ammo_type = GetAmmoTypeForWep(self.weapon);
 +                              if(ammo_type != -1)
 +                                      a = getstati(GetAmmoStat(ammo_type)); // how much ammo do we have?
  
                                if(a > 0)
                                {
 -                                      switch(type) {
 -                                              case 0: fullammo = autocvar_hud_panel_weapons_ammo_full_shells; break;
 -                                              case 1: fullammo = autocvar_hud_panel_weapons_ammo_full_nails; break;
 -                                              case 2: fullammo = autocvar_hud_panel_weapons_ammo_full_rockets; break;
 -                                              case 3: fullammo = autocvar_hud_panel_weapons_ammo_full_cells; break;
 -                                              case 4: fullammo = autocvar_hud_panel_weapons_ammo_full_fuel; break;
 -                                              default: fullammo = 60;
 +                                      switch(ammo_type) {
 +                                              case 0: ammo_full = autocvar_hud_panel_weapons_ammo_full_shells; break;
 +                                              case 1: ammo_full = autocvar_hud_panel_weapons_ammo_full_nails; break;
 +                                              case 2: ammo_full = autocvar_hud_panel_weapons_ammo_full_rockets; break;
 +                                              case 3: ammo_full = autocvar_hud_panel_weapons_ammo_full_cells; break;
 +                                              case 4: ammo_full = autocvar_hud_panel_weapons_ammo_full_fuel; break;
 +                                              default: ammo_full = 60;
                                        }
  
                                        drawsetcliparea(
 -                                              wpnpos_x + baroffset_x,
 -                                              wpnpos_y + baroffset_y,
 -                                              barsize_x * bound(0, a/fullammo, 1),
 +                                              weapon_pos_x + baroffset_x,
 +                                              weapon_pos_y + baroffset_y,
 +                                              barsize_x * bound(0, a/ammo_full, 1),
                                                barsize_y);
 -                                      drawpic_aspect_skin(wpnpos, "weapon_ammo", wpnsize, ammo_color, ammo_alpha, DRAWFLAG_NORMAL);
 +                                      drawpic_aspect_skin(weapon_pos, "weapon_ammo", weapon_size, ammo_color, ammo_alpha, DRAWFLAG_NORMAL);
                                        drawresetcliparea();
                                }
                        }
                }
 -
 -              // draw a "ghost weapon icon" if you don't have the weapon
 -              else
 +              else // draw a "ghost weapon icon" if you don't have the weapon
                {
 -                      drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
 +                      drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
                }
 -
 +              
                // draw the complain message
                if(time - complain_weapon_time < when + fadetime && self.weapon == complain_weapon && autocvar_hud_panel_weapons_complainbubble)
                {
                        if(fadetime)
 -                      {
 -                              if(complain_weapon_time + when > time)
 -                                      a = 1;
 -                              else
 -                                      a = bound(0, (complain_weapon_time + when + fadetime - time) / fadetime, 1);
 -                      }
 +                              a = ((complain_weapon_time + when > time) ? 1 : bound(0, (complain_weapon_time + when + fadetime - time) / fadetime, 1));
                        else
 -                      {
 -                              if(complain_weapon_time + when > time)
 -                                      a = 1;
 -                              else
 -                                      a = 0;
 -                      }
 +                              a = ((complain_weapon_time + when > time) ? 1 : 0);
 +
  
                        string s;
                        if(complain_weapon_type == 0) {
                                color = stov(autocvar_hud_panel_weapons_complainbubble_color_unavailable);
                        }
                        float padding = autocvar_hud_panel_weapons_complainbubble_padding;
 -                      drawpic_aspect_skin(wpnpos + '1 1 0' * padding, "weapon_complainbubble", wpnsize - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
 -                      drawstring_aspect(wpnpos + '1 1 0' * padding, s, wpnsize - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
 +                      drawpic_aspect_skin(weapon_pos + '1 1 0' * padding, "weapon_complainbubble", weapon_size - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
 +                      drawstring_aspect(weapon_pos + '1 1 0' * padding, s, weapon_size - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
                }
  
 +              // continue with new position for the next weapon
                ++row;
                if(row >= rows)
                {
                        ++column;
                }
        }
 -
  }
  
  // Ammo (#1)
@@@ -2483,19 -2471,20 +2483,20 @@@ void HUD_Score_Rankings(vector pos, vec
        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 vector fontsize = '1 1 0' * (mySize_y/entries);
+       float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
+       vector fontsize = '1 1 0' * (mySize_y/entries);
  
        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;
+       float name_size = mySize_x*0.75;
+       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;
+       i = 0;
+       first_pl = 0;
        if (autocvar__hud_configure)
        {
                float players_per_team;
@@@ -4603,14 -4592,13 +4604,14 @@@ void HUD_CenterPrint (void
                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_expire_time[j] > time)
                {
                        a = (centerprint_expire_time[j] - time) / centerprint_fadetime;
 -                      sz = 0.8 + a * (1 - 0.8);
                }
 +              
 +              a = a * (bound(0.5, (1 - (i / 2)), 1) * bound(0.5, (1 - (i / 10)), 1));
 +              sz = 0.8 + a * (1 - 0.8);
  
                drawfontscale = sz * '1 1 0';
                if (centerprint_countdown_num[j])
index 082353049178ca485501d2df2d27245b6b2b12c3,f26f65ea54b53d3c7a5d8cd564457416d81755d7..c7922eebc4db7040185ebcda71166bb1b5906226
@@@ -64,8 -64,6 +64,8 @@@ void HUD_Panel_ExportCfg(string cfgname
                                case HUD_PANEL_WEAPONS:
                                        HUD_Write_PanelCvar_q("_complainbubble");
                                        HUD_Write_PanelCvar_q("_complainbubble_padding");
 +                                      HUD_Write_PanelCvar_q("_complainbubble_time");
 +                                      HUD_Write_PanelCvar_q("_complainbubble_fadetime");
                                        HUD_Write_PanelCvar_q("_complainbubble_color_outofammo");
                                        HUD_Write_PanelCvar_q("_complainbubble_color_donthave");
                                        HUD_Write_PanelCvar_q("_complainbubble_color_unavailable");
@@@ -682,7 -680,7 +682,7 @@@ float HUD_Panel_InputEvent(float bInput
                float k, level, start_pos_x;
                vector candidate_pos;
                const float LEVELS_NUM = 4;
-               const float level_height = vid_conheight / LEVELS_NUM;
+               float level_height = vid_conheight / LEVELS_NUM;
  :find_tab_panel
                level = floor(tab_panel_pos_y / level_height) * level_height; //starting level
                candidate_pos_x = (!tab_backward) ? vid_conwidth : 0;
index dcacee6c46b936cc7e701bac7f0e0acc5a587f2e,e51b1a826673180c7614a7f52251cf767146c284..271b4f49146dd495d96dd70a8cd439ba270f1c7c
@@@ -268,7 -268,7 +268,7 @@@ void lgbeam_think(
                        {
                                dt = min(dt, owner_player.clip_load / autocvar_g_balance_electro_primary_ammo);
                                owner_player.clip_load = max(0, owner_player.clip_load - autocvar_g_balance_electro_primary_ammo * frametime);
-                               owner_player.weapon_load[WEP_ELECTRO] = owner_player.clip_load;
+                               owner_player.(weapon_load[WEP_ELECTRO]) = owner_player.clip_load;
                        }
                        else
                        {
@@@ -507,19 -507,19 +507,19 @@@ float w_electro(float req
                                ammo_amount = 1;
                        else
                                ammo_amount = self.ammo_cells > 0;
-                       ammo_amount += self.weapon_load[WEP_ELECTRO] > 0;
+                       ammo_amount += self.(weapon_load[WEP_ELECTRO]) > 0;
                }
                else
                {
                        ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_primary_ammo;
-                       ammo_amount += self.weapon_load[WEP_ELECTRO] >= autocvar_g_balance_electro_primary_ammo;
+                       ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_primary_ammo;
                }
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_electro_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_ELECTRO] >= autocvar_g_balance_electro_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_ELECTRO]) >= autocvar_g_balance_electro_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
@@@ -571,27 -571,27 +571,27 @@@ float w_electro(float req
        else if (req == WR_SUICIDEMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s could not remember where they put plasma");
 +                      w_deathtypestring = _("%s could not remember where they put their electro plasma");
                else
 -                      w_deathtypestring = _("%s played with plasma");
 +                      w_deathtypestring = _("%s played with electro plasma");
        }
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
                {
                        if(w_deathtype & HITTYPE_SPLASH) // unchecked: BOUNCE
 -                              w_deathtypestring = _("%s just noticed %s's blue ball");
 +                              w_deathtypestring = _("%s just noticed %s's electro plasma");
                        else // unchecked: BOUNCE
 -                              w_deathtypestring = _("%s got in touch with %s's blue ball");
 +                              w_deathtypestring = _("%s got in touch with %s's electro plasma");
                }
                else
                {
                        if(w_deathtype & HITTYPE_BOUNCE) // combo
 -                              w_deathtypestring = _("%s felt the electrifying air of %s's combo");
 +                              w_deathtypestring = _("%s felt the electrifying air of %s's electro combo");
                        else if(w_deathtype & HITTYPE_SPLASH)
 -                              w_deathtypestring = _("%s got too close to %s's blue beam");
 +                              w_deathtypestring = _("%s got too close to %s's blue electro bolt");
                        else
 -                              w_deathtypestring = _("%s was blasted by %s's blue beam");
 +                              w_deathtypestring = _("%s was blasted by %s's blue electro bolt");
                }
        }
        return TRUE;
index 968f157c7aa29735b7791b9ad417bdd90f1f14b3,a9d1246448f784661490a2d176c1e2635d5eed3d..4a9d672dc3a980c07ac8402b0f4e1a63a2ebf5d6
@@@ -346,13 -346,13 +346,13 @@@ float w_glauncher(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_grenadelauncher_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_GRENADE_LAUNCHER] >= autocvar_g_balance_grenadelauncher_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_GRENADE_LAUNCHER]) >= autocvar_g_balance_grenadelauncher_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_grenadelauncher_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_GRENADE_LAUNCHER] >= autocvar_g_balance_grenadelauncher_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_GRENADE_LAUNCHER]) >= autocvar_g_balance_grenadelauncher_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
@@@ -380,9 -380,9 +380,9 @@@ float w_glauncher(float req
        else if (req == WR_SUICIDEMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s tried out his own grenade");
 +                      w_deathtypestring = _("%s didn't see their own grenade");
                else
 -                      w_deathtypestring = _("%s detonated");
 +                      w_deathtypestring = _("%s blew themself up with their grenadelauncher");
        }
        else if (req == WR_KILLMESSAGE)
        {
diff --combined qcsrc/server/w_hagar.qc
index adecf1487fbb8c1e43c52de08d1ba884215e1709,1952607b823e04838f4f4b671a97a009d4a844f9..61d3fb5bdd459a04fa1fee62ab365cb29193137d
@@@ -197,7 -197,7 +197,7 @@@ void W_Hagar_Attack2_Load (void
  
        // this is different than WR_CHECKAMMO when it comes to reloading
        if(autocvar_g_balance_hagar_reload_ammo)
-               enough_ammo = self.weapon_load[WEP_HAGAR] >= autocvar_g_balance_hagar_secondary_ammo;
+               enough_ammo = self.(weapon_load[WEP_HAGAR]) >= autocvar_g_balance_hagar_secondary_ammo;
        else
                enough_ammo = self.ammo_rockets >= autocvar_g_balance_hagar_secondary_ammo;
  
@@@ -347,13 -347,13 +347,13 @@@ float w_hagar(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_hagar_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_HAGAR] >= autocvar_g_balance_hagar_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HAGAR]) >= autocvar_g_balance_hagar_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_hagar_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_HAGAR] >= autocvar_g_balance_hagar_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HAGAR]) >= autocvar_g_balance_hagar_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
@@@ -399,13 -399,13 +399,13 @@@ float w_hagar(float req
                precache_sound("weapons/hagexp3.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
 -              w_deathtypestring = _("%s played with tiny rockets");
 +              w_deathtypestring = _("%s played with tiny hagar rockets");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_BOUNCE) // must be secondary; unchecked: SPLASH
 -                      w_deathtypestring = _("%s hoped %s's missiles wouldn't bounce");
 +                      w_deathtypestring = _("%s was pummeled with a burst of hagar rockets by %s");
                else // unchecked: SPLASH, SECONDARY
 -                      w_deathtypestring = _("%s was pummeled by %s");
 +                      w_deathtypestring = _("%s was pummeled with hagar rockets by %s");
        }
        return TRUE;
  }
diff --combined qcsrc/server/w_hlac.qc
index bcda0a807829b384885550b0e774bcddd74b2c43,0a163e2f98affc699d87da07e3ddcb69b0a8dd2d..f218838f7262b1bf73bcd7eb0e3c2bddecd8f665
@@@ -205,13 -205,13 +205,13 @@@ float w_hlac(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_hlac_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_HLAC] >= autocvar_g_balance_hlac_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HLAC]) >= autocvar_g_balance_hlac_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_hlac_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_HLAC] >= autocvar_g_balance_hlac_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_HLAC]) >= autocvar_g_balance_hlac_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
@@@ -239,7 -239,7 +239,7 @@@ float w_hlac(float req
        else if (req == WR_SUICIDEMESSAGE)
                w_deathtypestring = _("%s should have used a smaller gun");
        else if (req == WR_KILLMESSAGE)
 -              w_deathtypestring = _("%s was cut down by %s");
 +              w_deathtypestring = _("%s was cut down with a HLAC by %s");
        return TRUE;
  }
  #endif
index a2c57004ff9fa813df69df2186fb31667458aa98,cf970ae9f785f2bba64dbeb8a11a1936bddbcbe4..f4a2fa2a8b6118a7f89f5a117e44750db6ed14ad
@@@ -486,7 -486,7 +486,7 @@@ float w_minelayer(float req
                if (ATTACK_FINISHED(self) <= time || self.weapon != WEP_MINE_LAYER)
                {
                        ammo_amount = self.ammo_rockets >= autocvar_g_balance_minelayer_ammo;
-                       ammo_amount += self.weapon_load[WEP_MINE_LAYER] >= autocvar_g_balance_minelayer_ammo;
+                       ammo_amount += self.(weapon_load[WEP_MINE_LAYER]) >= autocvar_g_balance_minelayer_ammo;
                        return ammo_amount;
                }
        }
@@@ -520,10 -520,7 +520,10 @@@ float w_minelayer(float req
                precache_sound("weapons/mine_exp.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
 -              w_deathtypestring = _("%s exploded");
 +              if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
 +                      w_deathtypestring = _("%s blew themself up with their minelayer");
 +              else
 +                      w_deathtypestring = _("%s forgot about their mine");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
index 8c071ed1d84f9ab6170d33e4328cc97aec7758cb,10014a7e1b2fb7f794a24b6fdef0c21f79eb9d9f..6045fdb3cd0c8d96b52bfa8ddacf63560176baba
@@@ -246,7 -246,7 +246,7 @@@ float w_minstanex(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_cells >= minstanex_ammo;
-               ammo_amount += self.weapon_load[WEP_MINSTANEX] >= minstanex_ammo;
+               ammo_amount += self.(weapon_load[WEP_MINSTANEX]) >= minstanex_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
                if(!autocvar_g_balance_minstanex_laser_ammo)
                        return TRUE;
                ammo_amount = self.ammo_cells >= autocvar_g_balance_minstanex_laser_ammo;
-               ammo_amount += self.weapon_load[WEP_MINSTANEX] >= autocvar_g_balance_minstanex_laser_ammo;
+               ammo_amount += self.(weapon_load[WEP_MINSTANEX]) >= autocvar_g_balance_minstanex_laser_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
@@@ -292,7 -292,7 +292,7 @@@ float w_minstanex(float req
        else if (req == WR_SUICIDEMESSAGE)
                w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
 -              w_deathtypestring = _("%s has been vaporized by %s");
 +              w_deathtypestring = _("%s has been vaporized by %s's minstanex");
        return TRUE;
  }
  #endif
diff --combined qcsrc/server/w_nex.qc
index 6847d89b96542c9c95c4695007042fc06c06af8e,802298912d96eb774796b893d222705f92eeb754..95da666fc68018476e6f02f8c7de77de3e801cf2
@@@ -161,7 -161,7 +161,7 @@@ float w_nex(float req
                                                                                {
                                                                                        self.clip_load = max(autocvar_g_balance_nex_secondary_ammo, self.clip_load - autocvar_g_balance_nex_secondary_ammo * dt);
                                                                                }
-                                                                               self.weapon_load[WEP_NEX] = self.clip_load;
+                                                                               self.(weapon_load[WEP_NEX]) = self.clip_load;
                                                                        }
                                                                        else
                                                                        {
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_cells >= autocvar_g_balance_nex_primary_ammo;
-               ammo_amount += (autocvar_g_balance_nex_reload_ammo && self.weapon_load[WEP_NEX] >= autocvar_g_balance_nex_primary_ammo);
+               ammo_amount += (autocvar_g_balance_nex_reload_ammo && self.(weapon_load[WEP_NEX]) >= autocvar_g_balance_nex_primary_ammo);
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                // don't allow charging if we don't have enough ammo
                ammo_amount = self.ammo_cells >= autocvar_g_balance_nex_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_NEX] >= autocvar_g_balance_nex_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_NEX]) >= autocvar_g_balance_nex_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
@@@ -252,7 -252,7 +252,7 @@@ float w_nex(float req
        else if (req == WR_SUICIDEMESSAGE)
                w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
 -              w_deathtypestring = _("%s has been vaporized by %s");
 +              w_deathtypestring = _("%s has been vaporized by %s's nex");
        return TRUE;
  }
  #endif
diff --combined qcsrc/server/w_rifle.qc
index 4a8ed746a289dd5ee82bf9dae8f9755e57239ded,941a528a4b0b4fa9eac087b0222cc3c4d60b9d93..b184e730a4cfbd489cec6b4083a31e2fb44ff182
@@@ -183,13 -183,13 +183,13 @@@ float w_rifle(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_RIFLE] >= autocvar_g_balance_rifle_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_RIFLE]) >= autocvar_g_balance_rifle_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_RIFLE] >= autocvar_g_balance_rifle_secondary_ammo;
+               ammo_amount += self.(weapon_load[WEP_RIFLE]) >= autocvar_g_balance_rifle_secondary_ammo;
                return ammo_amount;
        }
        else if (req == WR_RESETPLAYER)
@@@ -229,16 -229,19 +229,16 @@@ float w_rifle(float req
        }
        else if (req == WR_SUICIDEMESSAGE)
        {
 -              if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s shot themself automatically");
 -              else
 -                      w_deathtypestring = _("%s sniped themself somehow");
 +              w_deathtypestring = _("%s is now thinking with portals");
        }
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
                {
                        if(w_deathtype & HITTYPE_BOUNCE)
 -                              w_deathtypestring = _("%s failed to hide from %s's bullet hail");
 +                              w_deathtypestring = _("%s failed to hide from %s's rifle bullet hail");
                        else
 -                              w_deathtypestring = _("%s died in %s's bullet hail");
 +                              w_deathtypestring = _("%s died in %s's rifle bullet hail");
                }
                else
                {
                        else
                        {
                                if(w_deathtype & HITTYPE_HEADSHOT)
 -                                      w_deathtypestring = _("%s got hit in the head by %s");
 +                                      w_deathtypestring = _("%s got shot in the head with a rifle by %s");
                                else
 -                                      w_deathtypestring = _("%s was sniped by %s");
 +                                      w_deathtypestring = _("%s was sniped with a rifle by %s");
                        }
                }
        }
index 280899fba78ff30129e93589e995c42d71408fdb,4da611e7263dc023953dbce8ff8408e1db7535f2..d582229da4756d8b0e9d4f2e463a67d6ffbe4384
@@@ -461,7 -461,7 +461,7 @@@ float w_rlauncher(float req
                {
                        if(autocvar_g_balance_rocketlauncher_reload_ammo)
                        {
-                               if(self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo && self.weapon_load[WEP_ROCKET_LAUNCHER] < autocvar_g_balance_rocketlauncher_ammo)
+                               if(self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo && self.(weapon_load[WEP_ROCKET_LAUNCHER]) < autocvar_g_balance_rocketlauncher_ammo)
                                        ammo_amount = TRUE;
                        }
                        else if(self.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
@@@ -498,7 -498,7 +498,7 @@@ float w_rlauncher(float req
                precache_sound("weapons/rocket_impact.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
 -              w_deathtypestring = _("%s exploded");
 +              w_deathtypestring = _("%s blew themself up with their rocketlauncher");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation)
diff --combined qcsrc/server/w_seeker.qc
index b74eb3d1d3facced36b523cdfe441aa94ab993cd,a110c003fdada021479974cbf2b057668d88026e..0a7b4761442f86026b1d0c0638ff0a243cbda8f2
@@@ -588,13 -588,13 +588,13 @@@ float w_seeker(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_seeker_missile_ammo;
-               ammo_amount += self.weapon_load[WEP_SEEKER] >= autocvar_g_balance_seeker_missile_ammo;
+               ammo_amount += self.(weapon_load[WEP_SEEKER]) >= autocvar_g_balance_seeker_missile_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
        {
                ammo_amount = self.ammo_rockets >= autocvar_g_balance_seeker_tag_ammo;
-               ammo_amount += self.weapon_load[WEP_SEEKER] >= autocvar_g_balance_seeker_tag_ammo;
+               ammo_amount += self.(weapon_load[WEP_SEEKER]) >= autocvar_g_balance_seeker_tag_ammo;
                return ammo_amount;
        }
        else if (req == WR_RELOAD)
@@@ -654,13 -654,13 +654,13 @@@ float w_seeker(float req
                precache_sound("weapons/tag_impact.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
 -              w_deathtypestring = _("%s played with tiny rockets");
 +              w_deathtypestring = _("%s played with tiny seeker rockets");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s was tagged by %s");
 +                      w_deathtypestring = _("%s was tagged with a seeker by %s");
                else
 -                      w_deathtypestring = _("%s was pummeled by %s");
 +                      w_deathtypestring = _("%s was pummeled with seeker rockets by %s");
        }
        return TRUE;
  }
index 62b190bb223541901a862c541ec319211f20c977,1f097132d84de84acc70fa16375ff6dab115ecaf..bca8222da62c26d43988ffd28103ccf1eb813452
@@@ -170,7 -170,7 +170,7 @@@ float w_shotgun(float req
        else if (req == WR_CHECKAMMO1)
        {
                ammo_amount = self.ammo_shells >= autocvar_g_balance_shotgun_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_SHOTGUN] >= autocvar_g_balance_shotgun_primary_ammo;
+               ammo_amount += self.(weapon_load[WEP_SHOTGUN]) >= autocvar_g_balance_shotgun_primary_ammo;
                return ammo_amount;
        }
        else if (req == WR_CHECKAMMO2)
@@@ -216,9 -216,9 +216,9 @@@ float w_shotgun(float req
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun");
 +                      w_deathtypestring = _("%2$s slapped %1$s around a bit with a large shotgun");
                else
 -                      w_deathtypestring = _("%s was gunned by %s");
 +                      w_deathtypestring = _("%s was gunned down with a shotgun by %s");
        }
        return TRUE;
  }
diff --combined qcsrc/server/w_uzi.qc
index e63d54a4152456988a2f2b4c9cc013323edd60f3,71ea1f6f6710d33f25dd833324c15f824fbe8a79..d7c5ea9cd4a725e1f482f616dd0889d2843fe3c0
@@@ -263,9 -263,9 +263,9 @@@ float w_uzi(float req
                if(autocvar_g_balance_uzi_reload_ammo)
                {
                        if(autocvar_g_balance_uzi_mode == 1)
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_sustained_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_sustained_ammo;
                        else
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_first_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_first_ammo;
                }
                return ammo_amount;
        }
                if(autocvar_g_balance_uzi_reload_ammo)
                {
                        if(autocvar_g_balance_uzi_mode == 1)
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_burst_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_burst_ammo;
                        else
-                               ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_first_ammo;
+                               ammo_amount += self.(weapon_load[WEP_UZI]) >= autocvar_g_balance_uzi_first_ammo;
                }
                return ammo_amount;
        }
@@@ -319,9 -319,9 +319,9 @@@ float w_uzi(float req
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s was sniped by %s");
 +                      w_deathtypestring = _("%s was sniped by %s's machine gun");
                else
 -                      w_deathtypestring = _("%s was riddled full of holes by %s");
 +                      w_deathtypestring = _("%s was riddled full of holes by %s's machine gun");
        }
        return TRUE;
  }