]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Sync with master
authorJakob MG <jakob_mg@hotmail.com>
Sun, 3 Apr 2011 17:29:02 +0000 (19:29 +0200)
committerJakob MG <jakob_mg@hotmail.com>
Sun, 3 Apr 2011 17:29:02 +0000 (19:29 +0200)
1  2 
qcsrc/client/View.qc
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc

diff --combined qcsrc/client/View.qc
index 8f38cb5bcdc1c3b545b256c976118ef37853ea9b,09ec96eabaaa9ece2608496c64c551d646d1b695..c54b4446543e5b8b81e1051191b522ff4a4b51d9
@@@ -1,3 -1,12 +1,3 @@@
 -#define spider_rocket_icon "gfx/vehicles/rocket_ico.tga"
 -#define spider_rocket_targ "gfx/vehicles/target.tga"
 -#define SPIDER_CROSS "textures/spiderbot/cross.tga"
 -#define rkt_size 32
 -#define rld_size_x 256
 -#define rld_size_y 16
 -
 -void CSQC_WAKIZASHI_HUD();
 -
  entity porto;
  vector polyline[16];
  float trace_dphitcontents;
@@@ -675,7 -684,7 +675,7 @@@ void CSQC_UpdateView(float w, float h
        {
                float contentalpha_temp, incontent, liquidalpha, contentfadetime;
                vector liquidcolor;
+               
                switch(pointcontents(view_origin))
                {
                        case CONTENT_WATER:
                                liquidcolor = stov(autocvar_hud_contents_water_color);
                                incontent = 1;
                                break;
+                               
                        case CONTENT_LAVA:
                                liquidalpha = autocvar_hud_contents_lava_alpha;
                                liquidcolor = stov(autocvar_hud_contents_lava_color);
                                incontent = 1;
-                               break;
+                               break;  
+                                                       
                        case CONTENT_SLIME:
                                liquidalpha = autocvar_hud_contents_slime_alpha;
                                liquidcolor = stov(autocvar_hud_contents_slime_color);
                                incontent = 1;
                                break;
+                               
                        default:
                                liquidalpha = 0;
                                liquidcolor = '0 0 0';
                                incontent = 0;
                                break;
                }
+               
                if(incontent) // fade in/out at different speeds so you can do e.g. instant fade when entering water and slow when leaving it.
                { // also lets delcare previous values for blending properties, this way it isn't reset until after you have entered a different content
                        contentfadetime = autocvar_hud_contents_fadeintime;
                }
                else
                        contentfadetime = autocvar_hud_contents_fadeouttime;
+                       
                contentalpha_temp = bound(0, drawframetime / max(0.0001, contentfadetime), 1);
                contentavgalpha = contentavgalpha * (1 - contentalpha_temp) + incontent * contentalpha_temp;
+               
                if(contentavgalpha)
                        drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, liquidcolor_prev, contentavgalpha * liquidalpha_prev, DRAWFLAG_NORMAL);
        }
+       
        if(autocvar_hud_damage)
        {
                splash_size_x = max(vid_conwidth, vid_conheight);
                        else if(autocvar_crosshair_color_by_health)
                        {
                                local float x = getstati(STAT_HEALTH);
+                               
                                //x = red
                                //y = green
                                //z = blue
+                               
                                wcross_color_z = 0;
+                               
                                if(x > 200)
                                {
                                        wcross_color_x = 0;
                                {
                                        wcross_color_x = 1;
                                        wcross_color_y = 1;
-                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;  
                                }
                                else if(x > 20)
                                {
  
                                wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
                        }
+                       
                        vector hitindication_color;
                        if(autocvar_crosshair_hitindication)
                        {
                        wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
  
                        // crosshair rings for weapon stats
-                       if ((autocvar_crosshair_ring) || (autocvar_crosshair_ring_reload))
+                       if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
                        {
                                // declarations and stats
                                float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
                                string ring_image, ring_inner_image;
                                vector ring_rgb, ring_inner_rgb;
+                               
                                ring_scale = autocvar_crosshair_ring_size;
  
                                float weapon_clipload, weapon_clipsize;
  
                                if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
                                        nex_charge_movingavg = nex_charge;
+                                       
  
                                // handle the values
                                if (activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
                                {
-                                       if (nex_chargepool || use_nex_chargepool) {
-                                               use_nex_chargepool = 1;
+                                       if (nex_chargepool || use_nex_chargepool) { 
+                                               use_nex_chargepool = 1; 
                                                ring_inner_value = nex_chargepool;
-                                       } else {
+                                       } else { 
                                                nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
-                                               ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1);
+                                               ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); 
                                        }
-                                       ring_inner_alpha = wcross_alpha * autocvar_crosshair_ring_nex_inner_alpha;
+                                               
+                                       ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
                                        ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
                                        ring_inner_image = "gfx/crosshair_ring_inner.tga";
+                                       
                                        // draw the outer ring to show the current charge of the weapon
                                        ring_value = nex_charge;
-                                       ring_alpha = wcross_alpha * autocvar_crosshair_ring_nex_alpha;
+                                       ring_alpha = autocvar_crosshair_ring_nex_alpha;
                                        ring_rgb = wcross_color;
                                        ring_image = "gfx/crosshair_ring_nexgun.tga";
                                }
-                               else if (activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer)
+                               else if (activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) 
                                {
                                        ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
-                                       ring_alpha = wcross_alpha * autocvar_crosshair_ring_minelayer_alpha;
+                                       ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
                                        ring_rgb = wcross_color;
                                        ring_image = "gfx/crosshair_ring.tga";
                                }
  
-                               if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring
+                               if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring 
                                {
-                                       // if the main ring is already used by another weapon, instead use the inner one for ammo.
-                                       // inner ring is secondary anyway and doesn't matter as much as main ring, so overriding it is no issue.
-                                       if(ring_value && autocvar_crosshair_ring_reload_inner)
-                                       {
-                                               ring_inner_value = bound(0, weapon_clipload / weapon_clipsize, 1);
-                                               ring_inner_alpha = autocvar_crosshair_ring_reload_alpha;
-                                               ring_inner_rgb = wcross_color;
-                                               ring_inner_image = "gfx/crosshair_ring_inner.tga";
-                                       }
+                                       ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
+                                       ring_scale = autocvar_crosshair_ring_reload_size;
+                                       ring_alpha = autocvar_crosshair_ring_reload_alpha;
+                                       ring_rgb = wcross_color;
+                                       
+                                       // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
+                                       // if a new image for another weapon is added, add the code (and its respective file/value) here
+                                       if ((activeweapon == WEP_SNIPERRIFLE) && (weapon_clipsize == 80))
+                                               ring_image = "gfx/crosshair_ring_sniperrifle.tga";
                                        else
-                                       {
-                                               ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
-                                               ring_scale = autocvar_crosshair_ring_reload_size;
-                                               ring_alpha = autocvar_crosshair_ring_reload_alpha;
-                                               ring_rgb = wcross_color;
-                                               // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
-                                               // if a new image for another weapon is added, add the code (and its respective file/value) here
-                                               if ((activeweapon == WEP_SNIPERRIFLE) && (weapon_clipsize == 80))
-                                                       ring_image = "gfx/crosshair_ring_sniperrifle.tga";
-                                               else
-                                                       ring_image = "gfx/crosshair_ring.tga";
-                                       }
+                                               ring_image = "gfx/crosshair_ring.tga";
                                }
  
-                               if ((autocvar_crosshair_ring_inner || autocvar_crosshair_ring_reload_inner) && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
-                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, ring_inner_alpha, DRAWFLAG_ADDITIVE);
+                               if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
+                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
  
                                if (ring_value)
-                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, ring_alpha, DRAWFLAG_ADDITIVE);
+                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
                        }
  
  #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
        R_SetView(VF_SIZE, '1 0 0' * w + '0 1 0' * h);
  }
  
 -#define spider_h "gfx/vehicles/hud_bg.tga"
 -#define spider_b "gfx/vehicles/sbot.tga"
 -#define spider_r "gfx/vehicles/sbot_rpods.tga"
 -#define spider_g "gfx/vehicles/sbot_mguns.tga"
 -#define spider_s "gfx/vehicles/shiled.tga"
 -#define spider_a1 "gfx/hud/sb_rocket.tga"
 -#define spider_a2 "gfx/sb_bullets.tga"
 -
 -void CSQC_SPIDER_HUD()
 -{
 -      float rockets, reload, heat, hp, shield;
 -      vector picsize, hudloc;
 -
 -    // Fetch health & ammo stats
 -    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
 -      shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
 -      heat    = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2);
 -      rockets =     getstati(STAT_VEHICLESTAT_AMMO2);
 -      reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1);
 -
 -    // Draw the crosshairs
 -    picsize = drawgetimagesize(SPIDER_CROSS);
 -    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
 -    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
 -    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
 -
 -    hudloc_y =  4;
 -    hudloc_x = 4;
 -
 -    picsize = drawgetimagesize(spider_h) * 0.5;
 -    drawpic(hudloc, spider_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -    picsize = drawgetimagesize(spider_a2) * 0.5;
 -    drawpic(hudloc + '120 96  0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -    drawstring(hudloc + '145 19  0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
 -    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
 -    drawstring(hudloc + '136 102  0', strcat(ftos(100 - rint(heat * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
 -
 -    picsize = drawgetimagesize(spider_a1) * 0.85;
 -    if(rockets == 9)
 -    {
 -        drawpic(hudloc + '132 54  0', spider_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
 -        drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
 -    }
 -    else
 -    {
 -        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -        drawstring(hudloc + '179 69  0', strcat(ftos(9 - rockets), "/8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
 -    }
 -
 -    picsize = drawgetimagesize(spider_b) * 0.5;
 -    hudloc_y = 10.5;
 -    hudloc_x = 10.5;
 -
 -    drawpic(hudloc, spider_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, spider_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, spider_r, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, spider_g, picsize, '1 1 1' * (1 - heat) + '1 0 0' *  heat, 1, DRAWFLAG_NORMAL);
 -
 -
 -      /*
 -      // Draw health bar
 -      p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
 -      p = p + '0 1 0' * vid_conheight - '0 32 0';
 -      //pp = ('0 1 0' * hp) + ('1 0 0' * (1-hp));
 -      drawfill(p, '256 0 0' * shield + '0 8 0' , '0.5 0.5 1', 0.75, DRAWFLAG_NORMAL);
 -      p_y += 8;
 -      drawfill(p, '256 0 0' * hp + '0 8 0' , '0 1 0', 0.75, DRAWFLAG_NORMAL);
 -      p_x += 256 * hp;
 -      drawfill(p, '256 0 0' * (1-hp) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
 -
 -      // Draw minigun heat indicator
 -      p = '0.5 0 0' * (vid_conwidth - 256);
 -      p = p + '0 1 0' * vid_conheight - '0 34  0';
 -      drawfill(p, '256 0 0' * (1-heat) + '0 2 0' ,'0 0 1', 0.5, DRAWFLAG_NORMAL);
 -      p_x += 256 * (1-heat);
 -      drawfill(p, '256 0 0' * heat  + '0 2 0' , '1 0 0', 0.5, DRAWFLAG_NORMAL);
 -
 -
 -      // Draw rocket icons for loaded/empty tubes.
 -      pp = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
 -      pp += '0 1 0' * vid_conheight - '0 64 0';
 -      for(i = 0; i < 8; ++i)
 -      {
 -              p = pp + '1 0 0' * (rkt_size * i);
 -              if(rockets == 8)
 -              {
 -                      if(floor(reload * 8) == i)
 -                      {
 -                              drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 0 0' + '0 1 0' * ((reload*8)-i), 0.75 , DRAWFLAG_NORMAL);
 -                      }
 -                      else if(i < reload * 8)
 -                              drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 1 0', 0.75 , DRAWFLAG_NORMAL);
 -                      else
 -                              drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0.5 0.5 0.5', 0.75, DRAWFLAG_NORMAL);
 -              }
 -              else
 -              {
 -                      if(i < rockets)
 -                              drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 0 0', 0.25, DRAWFLAG_NORMAL);
 -                      else
 -                              drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 1 0' * reload, 0.75, DRAWFLAG_NORMAL);
 -              }
 -      }
 -      */
 -
 -      if (scoreboard_showscores)
 -      {
 -              HUD_DrawScoreboard();
 -              HUD_DrawCenterPrint();
 -      }
 -
 -}
 -
 -#define raptor_h "gfx/vehicles/hud_bg.tga"
 -#define raptor_b "gfx/vehicles/raptor.tga"
 -#define raptor_g1 "gfx/vehicles/raptor_guns.tga"
 -#define raptor_g2 "gfx/vehicles/raptor_bombs.tga"
 -#define raptor_s "gfx/vehicles/shiled.tga"
 -
 -void CSQC_RAPTOR_HUD()
 -{
 -      float reload, hp, shield, energy;
 -      vector picsize, hudloc;
 -
 -    // Fetch health & ammo stats
 -    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
 -      shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
 -      reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
 -      energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
 -
 -    // Draw the crosshairs
 -    picsize = drawgetimagesize(SPIDER_CROSS);
 -    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
 -    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
 -    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
 -
 -    hudloc_y =  4;
 -    hudloc_x = 4;
 -
 -    picsize = drawgetimagesize(raptor_h) * 0.5;
 -    drawpic(hudloc, raptor_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -    picsize = drawgetimagesize(spider_a2) * 0.5;
 -    drawpic(hudloc + '120 96  0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -    drawstring(hudloc + '145 19  0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
 -    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
 -    drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'15 15 0','0.5 0.5 1', 1, DRAWFLAG_NORMAL);
 -
 -
 -    picsize = drawgetimagesize(spider_a1) * 0.85;
 -    if(reload == 1)
 -    {
 -        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -        drawstring(hudloc + '179 69  0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 1 0', 0.5, DRAWFLAG_NORMAL);
 -    }
 -    else
 -    {
 -        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -        drawstring(hudloc + '179 69  0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 0 1', 1, DRAWFLAG_NORMAL);
 -    }
 -
 -    picsize = drawgetimagesize(raptor_b) * 0.5;
 -    hudloc_y = 10.5;
 -    hudloc_x = 10.5;
 -
 -    drawpic(hudloc, raptor_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, raptor_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, raptor_g1, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' *  (1 - reload), 1, DRAWFLAG_NORMAL);
 -
 -
 -      if (scoreboard_showscores)
 -      {
 -              HUD_DrawScoreboard();
 -              HUD_DrawCenterPrint();
 -      }
 -
 -}
 -
 -#define waki_h "gfx/vehicles/hud_bg.tga"
 -#define waki_b "gfx/vehicles/waki.tga"
 -#define waki_e "gfx/vehicles/waki_e.tga"
 -#define waki_g "gfx/vehicles/waki_guns.tga"
 -#define waki_r "gfx/vehicles/waki_rockets.tga"
 -#define waki_s "gfx/vehicles/shiled.tga"
 -
 -#define waki_a1 "gfx/hud/sb_rocket.tga"
 -#define waki_a2 "gfx/sb_cells.tga"
 -
 -void CSQC_WAKIZASHI_HUD()
 -{
 -      // 0--1 floats. 1 = 100%, 0.6 = 50%.
 -      float health, shield, energy, rockets;
 -      vector picsize, hudloc;
 -
 -    picsize = drawgetimagesize(SPIDER_CROSS);
 -    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
 -    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
 -    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
 -
 -/*
 -const float STAT_VEHICLESTAT_HEALTH  = 60;
 -const float STAT_VEHICLESTAT_SHIELD  = 61;
 -const float STAT_VEHICLESTAT_ENERGY  = 62;
 -const float STAT_VEHICLESTAT_AMMO1   = 63;
 -const float STAT_VEHICLESTAT_RELAOD1 = 64;
 -const float STAT_VEHICLESTAT_AMMO2   = 65;
 -const float STAT_VEHICLESTAT_RELOAD2 = 66;
 -*/
 -    health  = min(getstatf(STAT_VEHICLESTAT_HEALTH),  1);
 -      shield  = min(getstatf(STAT_VEHICLESTAT_SHIELD),  1);
 -      energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
 -      rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
 -
 -    hudloc_y =  4;
 -    hudloc_x = 4;
 -
 -    picsize = drawgetimagesize(waki_h) * 0.5;
 -    drawpic(hudloc, waki_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -    picsize = drawgetimagesize(waki_a2) * 0.7;
 -    drawpic(hudloc + '116 92  0', waki_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -
 -    drawstring(hudloc + '145 19  0', strcat(ftos(rint(health * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
 -    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
 -
 -    drawstring(hudloc + '136 102  0', strcat(ftos(rint(energy * 100)), "%"),'14 14 0','1 1 1', 1, DRAWFLAG_NORMAL);
 -
 -    picsize = drawgetimagesize(waki_a1) * 0.75;
 -    if(rockets == 1)
 -    {
 -        drawpic(hudloc + '140 55  0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -        drawpic(hudloc + '144 59  0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
 -    }
 -    else
 -    {
 -        drawpic(hudloc + '140 55  0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
 -        drawpic(hudloc + '144 59  0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
 -        drawstring(hudloc + '165 69 0', strcat(ftos(rint(rockets * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
 -    }
 -
 -    picsize = drawgetimagesize(waki_b) * 0.5;
 -    hudloc_y = 10.5;
 -    hudloc_x = 10.5;
 -
 -    drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, waki_r, picsize, '1 1 1' * rockets + '1 0 0' * (1 - rockets), 1, DRAWFLAG_NORMAL);
 -    drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' *  (1 - energy), 1, DRAWFLAG_NORMAL);
 -
 -
 -
 -      /*
 -      p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
 -      p = p + '0 1 0' * vid_conheight - '0 32 0';
 -
 -      // Draw health bar
 -      p_y += 8;
 -      drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL);
 -      p_x += 256 * health;
 -      drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
 -
 -      // Draw shiled bar
 -      p_x -= 256 * health;
 -      p_y += 4;
 -      drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL);
 -
 -      // Draw energy
 -      //p_x -= 256 * health;
 -      p_y -= 8;
 -      drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL);
 -
 -      // Draw rockets bar
 -      p_y += 12;
 -      drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL);
 -      */
 -
 -
 -
 -
 -      if (scoreboard_showscores)
 -      {
 -              HUD_DrawScoreboard();
 -              HUD_DrawCenterPrint();
 -      }
 -
 -}
 -
--
  void CSQC_common_hud(void)
  {
        // HUD_SortFrags(); done in HUD_Draw
                        HUD_DrawScoreboard();
  
                        if (scoreboard_active) // scoreboard/accuracy
-                       {
+                       {       
                                HUD_Reset();
                                // HUD_DrawScoreboard takes care of centerprint_start
                        }
index 978df2a016ed1d3a0de03a11c65934a8e33c52d4,d5652b775e4620b3831c96b0ae44d16ba1f737b8..0ec5d60ce28b2dd09b7cb20ad26308d0ed327196
@@@ -999,6 -999,68 +999,6 @@@ float autocvar_g_turrets_unit_walker_st
  float autocvar_g_turrets_unit_walker_std_rockets_range;
  float autocvar_g_turrets_unit_walker_std_rockets_range_min;
  float autocvar_g_use_ammunition;
 -float autocvar_g_vehicle_racer_afterburn_cost;
 -float autocvar_g_vehicle_racer_anglestabilizer;
 -float autocvar_g_vehicle_racer_downforce;
 -float autocvar_g_vehicle_racer_energy;
 -float autocvar_g_vehicle_racer_energy_usepause;
 -float autocvar_g_vehicle_racer_health;
 -float autocvar_g_vehicle_racer_laser_cost;
 -float autocvar_g_vehicle_racer_laser_damage;
 -float autocvar_g_vehicle_racer_laser_radius;
 -float autocvar_g_vehicle_racer_laser_refire;
 -float autocvar_g_vehicle_racer_laser_speed;
 -float autocvar_g_vehicle_racer_pitchspeed;
 -float autocvar_g_vehicle_racer_power_air;
 -float autocvar_g_vehicle_racer_power_min;
 -float autocvar_g_vehicle_racer_power_solid;
 -float autocvar_g_vehicle_racer_reload;
 -float autocvar_g_vehicle_racer_respawntime;
 -float autocvar_g_vehicle_racer_rocket_accel;
 -float autocvar_g_vehicle_racer_rocket_damage;
 -float autocvar_g_vehicle_racer_rocket_radius;
 -float autocvar_g_vehicle_racer_rocket_refire;
 -float autocvar_g_vehicle_racer_rocket_speed;
 -float autocvar_g_vehicle_racer_rocket_turnrate;
 -float autocvar_g_vehicle_racer_shield;
 -float autocvar_g_vehicle_racer_speed_afterburn;
 -float autocvar_g_vehicle_racer_speed_forward;
 -float autocvar_g_vehicle_racer_speed_strafe;
 -float autocvar_g_vehicle_racer_springlength;
 -float autocvar_g_vehicle_racer_turnroll;
 -float autocvar_g_vehicle_racer_turnspeed;
 -float autocvar_g_vehicle_raptor_reload;
 -float autocvar_g_vehicle_spiderbot_crush_dmg;
 -float autocvar_g_vehicle_spiderbot_crush_force;
 -float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
 -float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
 -float autocvar_g_vehicle_spiderbot_head_pitchspeed;
 -float autocvar_g_vehicle_spiderbot_head_turnlimit;
 -float autocvar_g_vehicle_spiderbot_head_turnspeed;
 -float autocvar_g_vehicle_spiderbot_health;
 -float autocvar_g_vehicle_spiderbot_minigun_cooldown;
 -float autocvar_g_vehicle_spiderbot_minigun_damage;
 -float autocvar_g_vehicle_spiderbot_minigun_heat;
 -float autocvar_g_vehicle_spiderbot_minigun_refire;
 -float autocvar_g_vehicle_spiderbot_minigun_spread;
 -float autocvar_g_vehicle_spiderbot_movement_inertia;
 -float autocvar_g_vehicle_spiderbot_respawntime;
 -float autocvar_g_vehicle_spiderbot_rocket_damage;
 -float autocvar_g_vehicle_spiderbot_rocket_edgedamage;
 -float autocvar_g_vehicle_spiderbot_rocket_force;
 -float autocvar_g_vehicle_spiderbot_rocket_health;
 -float autocvar_g_vehicle_spiderbot_rocket_lifetime;
 -float autocvar_g_vehicle_spiderbot_rocket_noise;
 -float autocvar_g_vehicle_spiderbot_rocket_radius;
 -float autocvar_g_vehicle_spiderbot_rocket_refire;
 -float autocvar_g_vehicle_spiderbot_rocket_reload;
 -float autocvar_g_vehicle_spiderbot_rocket_speed;
 -float autocvar_g_vehicle_spiderbot_rocket_turnrate;
 -float autocvar_g_vehicle_spiderbot_shield;
 -float autocvar_g_vehicle_spiderbot_speed_stop;
 -float autocvar_g_vehicle_spiderbot_speed_strafe;
 -float autocvar_g_vehicle_spiderbot_speed_walk;
 -float autocvar_g_vehicle_spiderbot_turnspeed;
  float autocvar_g_waypointeditor;
  float autocvar_g_waypoints_for_items;
  float autocvar_g_waypointsprite_deadlifetime;
@@@ -1152,6 -1214,7 +1152,7 @@@ float autocvar_sv_warsowbunny_backtosid
  float autocvar_sv_warsowbunny_topspeed;
  float autocvar_sv_warsowbunny_turnaccel;
  string autocvar_sv_weaponstats_file;
+ float autocvar_sv_gibhealth;
  float autocvar_sys_ticrate;
  float autocvar_teamplay_lockonrestart;
  float autocvar_teamplay_mode;
index 23a6019bc72a0493eea496907ca89bcb572aa29f,a1047ea9d07595dae83fcb3fd49953b5b24062c7..276a0e887a9e704e3799d18aeef19da99b2eda81
@@@ -132,9 -132,9 +132,9 @@@ vector Spawn_Score(entity spot, entity 
        prio = 0;
  
        // filter out spots for the wrong team
-       if(teamcheck)
-       if(spot.team != teamcheck)
-               return '-1 0 0';
+       if(teamcheck >= 0)
+               if(spot.team != teamcheck)
+                       return '-1 0 0';
  
        if(race_spawns)
                if(spot.target == "")
@@@ -269,7 -269,7 +269,7 @@@ entity Spawn_FilterOutBadSpots(entity f
                                        spotlist = spot;
  
                                /*
-                               if(teamcheck)
+                               if(teamcheck >= 0)
                                if(spot.team != teamcheck)
                                        error("invalid spawn added");
  
  
        /*
                entity e;
-               if(teamcheck)
+               if(teamcheck >= 0)
                        for(e = spotlist; e; e = e.chain)
                        {
                                print("seen ", etos(e), "\n");
@@@ -325,10 -325,15 +325,15 @@@ entity SelectSpawnPoint (float anypoint
        if (spot)
                return spot;
  
-       teamcheck = 0;
-       if(!anypoint && have_team_spawns > 0)
-               teamcheck = self.team;
+       if(anypoint)
+               teamcheck = -1;
+       else if(have_team_spawns > 0)
+               teamcheck = self.team; // MUST be team
+       else if(have_team_spawns == 0 && have_noteam_spawns)
+               teamcheck = 0; // MUST be noteam
+       else
+               teamcheck = -1;
+               // if we get here, we either require team spawns but have none, or we require non-team spawns and have none; use any spawn then
  
        // get the list of players
        playerlist = findchain(classname, "player");
                print("spot mindistance: ", vtos(spot.spawnpoint_score), "\n");
  
                entity e;
-               if(teamcheck)
+               if(teamcheck >= 0)
                        for(e = firstspot; e; e = e.chain)
                                if(e.team != teamcheck)
                                        error("invalid spawn found");
@@@ -1542,7 -1547,7 +1547,7 @@@ void ClientConnect (void
        playerdemo_init();
  
        anticheat_init();
 -      
 +
        race_PreSpawnObserver();
  
        //if(g_domination)
@@@ -1761,15 -1766,6 +1766,15 @@@ Called when a client disconnects from t
  void ReadyCount();
  void ClientDisconnect (void)
  {
 +      if(self.vehicle)
 +      {
 +          entity oldself;
 +          oldself = self;
 +          self = self.vehicle;
 +          self.vehicle_exit(VHEF_RELESE);
 +          self = oldself;
 +      }
 +
        if not(self.flags & FL_CLIENT)
        {
                print("Warning: ClientDisconnect without ClientConnect\n");
@@@ -2046,7 -2042,7 +2051,7 @@@ void player_powerups (void
  {
        // add a way to see what the items were BEFORE all of these checks for the mutator hook
        olditems = self.items;
 -      
 +
        if((self.items & IT_USING_JETPACK) && !self.deadflag)
        {
                SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
  
        if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
                return;
 -      
 +
        Fire_ApplyDamage(self);
        Fire_ApplyEffect(self);
  
                if (time < self.spawnshieldtime)
                        self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
        }
 -      
 +
        MUTATOR_CALLHOOK(PlayerPowerups);
  }
  
@@@ -2388,23 -2384,6 +2393,23 @@@ void SpectateCopy(entity spectatee) 
        SetZoomState(spectatee.zoomstate);
  
        anticheat_spectatecopy(spectatee);
 +
 +      //self.vehicle = spectatee.vehicle;
 +
 +      self.hud = spectatee.hud;
 +      if(spectatee.vehicle)
 +    {
 +        self.vehicle_health = spectatee.vehicle_health;
 +        self.vehicle_shield = spectatee.vehicle_shield;
 +        self.vehicle_energy = spectatee.vehicle_energy;
 +        self.vehicle_ammo1 = spectatee.vehicle_ammo1;
 +        self.vehicle_ammo2 = spectatee.vehicle_ammo2;
 +        self.vehicle_reload1 = spectatee.vehicle_reload1;
 +        self.vehicle_reload2 = spectatee.vehicle_reload2;
 +        msg_entity = self;
 +        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
 +        WriteEntity(MSG_ONE, spectatee.vehicle.vehicle_viewport);
 +    }
  }
  
  float SpectateUpdate() {
@@@ -3114,7 -3093,7 +3119,7 @@@ void PlayerPostThink (void
  
        if(self.waypointsprite_attachedforcarrier)
                WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
 -      
 +
        if(self.classname == "player" && self.deadflag == DEAD_NO && autocvar_r_showbboxes)
        {
                if(!self.showheadshotbbox)
index 28bbb81dc5187c7e944ada1484b6adbc2b4fa8e3,035114b25f23a9e62b34885927e9269c6330e003..cf7d655b1b601a5d5110ebe6a5711c13dfc38402
@@@ -358,7 -358,7 +358,7 @@@ void PlayerCorpseDamage (entity inflict
        self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
        self.dmg_inflictor = inflictor;
  
-       if (self.health <= -150 && self.modelindex != 0)
+       if (self.health <= -autocvar_sv_gibhealth && self.modelindex != 0)
        {
                // don't use any animations as a gib
                self.frame = 0;
@@@ -553,7 -553,7 +553,7 @@@ void PlayerDamage (entity inflictor, en
                        awep = DEATH_WEAPONOF(deathtype);
                valid_damage_for_weaponstats = 1;
        }
 -      
 +
        if(valid_damage_for_weaponstats)
        {
                dh = dh - max(self.health, 0);