]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/View.qc
Merge remote branch 'origin/master' into tzork/vehicles-2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / View.qc
index f1352472bc64cbd2e22db7cac0c64e984721d39b..e26eca3dd8eded944e11c1ab28af08d41c0c8688 100644 (file)
@@ -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;
@@ -137,7 +128,7 @@ vector GetCurrentFov(float fov)
                        zoomspeed = 3.5;
 
        zoomdir = button_zoom;
-       if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_SNIPERRIFLE && sniperrifle_scope)) // do NOT use switchweapon here
+       if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here
                zoomdir += button_attack2;
        if(spectatee_status > 0 || isdemo())
        {
@@ -274,7 +265,7 @@ float TrueAimCheck()
                case WEP_MINSTANEX:
                        mv = MOVE_NORMAL;
                        break;
-               case WEP_SNIPERRIFLE:
+               case WEP_RIFLE:
                        ta = trueaim_rifle;
                        mv = MOVE_NORMAL;
                        if(zoomscript_caught)
@@ -342,14 +333,13 @@ void CSQC_common_hud(void);
 void PostInit(void);
 void CSQC_Demo_Camera();
 float HUD_WouldDrawScoreboard();
-float view_set;
 float camera_mode;
 float reticle_type;
 string NextFrameCommand;
 void CSQC_SPIDER_HUD();
 void CSQC_RAPTOR_HUD();
 
-vector freeze_pmove_org, freeze_input_angles;
+vector freeze_org, freeze_ang;
 entity nightvision_noise, nightvision_noise2;
 
 float pickup_crosshair_time, pickup_crosshair_size;
@@ -378,6 +368,8 @@ void CSQC_UpdateView(float w, float h)
        vector v, vo;
        vector vf_size, vf_min;
        float a;
+       float hud;
+       hud = getstati(STAT_HUD);
 
        button_attack2 = (input_buttons & BUTTON_3);
        button_zoom = (input_buttons & BUTTON_4);
@@ -408,29 +400,21 @@ void CSQC_UpdateView(float w, float h)
        ticrate = getstatf(STAT_MOVEVARS_TICRATE) * getstatf(STAT_MOVEVARS_TIMESCALE);
        vo = '0 0 1' * getstati(STAT_VIEWHEIGHT);
 
-       warpzone_fixview_origin = pmove_org + vo;
-       warpzone_fixview_cl_viewangles = input_angles;
-       warpzone_fixview_angles = view_angles;
-       WarpZone_FixView();
-       pmove_org = warpzone_fixview_origin - vo;
-       input_angles = warpzone_fixview_cl_viewangles;
-       view_angles = warpzone_fixview_angles;
-
        if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
        {
-               pmove_org = freeze_pmove_org;
-               input_angles = view_angles = freeze_input_angles;
-               R_SetView(VF_ORIGIN, pmove_org + vo);
-               R_SetView(VF_ANGLES, view_angles);
-               //R_SetView(VF_CL_VIEWANGLES, input_angles);
+               R_SetView(VF_ORIGIN, freeze_org);
+               R_SetView(VF_ANGLES, freeze_ang);
+       }
+       else
+       {
+               freeze_org = R_SetView3fv(VF_ORIGIN);
+               freeze_ang = R_SetView3fv(VF_ANGLES);
        }
-       freeze_pmove_org = pmove_org;
-       freeze_input_angles = input_angles;
 
        // event chase camera
        if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
        {
-               if(spectatee_status >= 0 && (autocvar_cl_eventchase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || (autocvar_cl_eventchase_intermission && intermission))
+               if(spectatee_status >= 0 && (autocvar_cl_eventchase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || intermission)
                {
                        // We must enable chase_active to get a third person view (weapon viewmodel hidden and own player model showing).
                        // Ideally, there should be another way to enable third person cameras, such as through R_SetView()
@@ -446,14 +430,16 @@ void CSQC_UpdateView(float w, float h)
                        vector eventchase_target_origin;
                        makevectors(view_angles);
                        // pass 1, used to check where the camera would go and obtain the trace_fraction
-                       eventchase_target_origin = pmove_org - v_forward * eventchase_current_distance;
+                       eventchase_target_origin = freeze_org - v_forward * eventchase_current_distance;
 
-                       traceline(pmove_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+                       WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
                        // pass 2, also multiplying view_forward with trace_fraction, to prevent the camera from going through walls
                        // The 0.1 subtraction is to not limit the camera precisely at the wall surface, as that allows the view to poke through
-                       eventchase_target_origin = pmove_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+                       eventchase_target_origin = freeze_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+                       WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
 
-                       R_SetView(VF_ORIGIN, eventchase_target_origin);
+                       R_SetView(VF_ORIGIN, trace_endpos);
+                       R_SetView(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles));
                }
                else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code
                {
@@ -462,17 +448,16 @@ void CSQC_UpdateView(float w, float h)
                }
        }
 
+       WarpZone_FixView();
+       //WarpZone_FixPMove();
+
        // Render the Scene
-       if(!intermission || !view_set || (intermission && autocvar_cl_eventchase_intermission))
-       {
-               view_origin = pmove_org + vo;
-               view_angles = input_angles;
-               makevectors(view_angles);
-               view_forward = v_forward;
-               view_right = v_right;
-               view_up = v_up;
-               view_set = 1;
-       }
+       view_origin = R_SetView3fv(VF_ORIGIN);
+       view_angles = R_SetView3fv(VF_ANGLES);
+       makevectors(view_angles);
+       view_forward = v_forward;
+       view_right = v_right;
+       view_up = v_up;
 
 #ifdef BLURTEST
        if(time > blurtest_time0 && time < blurtest_time1)
@@ -496,7 +481,10 @@ void CSQC_UpdateView(float w, float h)
        TargetMusic_Advance();
        Fog_Force();
 
-       drawframetime = max(0.000001, time - drawtime);
+       if(drawtime == 0)
+               drawframetime = 0.01666667; // when we don't know fps yet, we assume 60fps
+       else
+               drawframetime = bound(0.000001, time - drawtime, 1);
        drawtime = time;
 
        // watch for gametype changes here...
@@ -557,6 +545,8 @@ void CSQC_UpdateView(float w, float h)
 
        // ALWAYS Clear Current Scene First
        R_ClearScene();
+       R_SetView(VF_ORIGIN, view_origin);
+       R_SetView(VF_ANGLES, view_angles);
 
        // FIXME engine bug? VF_SIZE and VF_MIN are not restored to sensible values by this
        R_SetView(VF_SIZE, vf_size);
@@ -605,10 +595,6 @@ void CSQC_UpdateView(float w, float h)
        // Draw the Engine Status Bar (the default Quake HUD)
        R_SetView(VF_DRAWENGINEHUD, 0);
 
-       // fetch this one only once per frame
-       hud_showbinds = autocvar_hud_showbinds;
-       hud_showbinds_limit = autocvar_hud_showbinds_limit;
-
        // Update the mouse position
        /*
           mousepos_x = vid_conwidth;
@@ -686,11 +672,11 @@ void CSQC_UpdateView(float w, float h)
        // the view to go back to normal, so reticle_type would become 0 as we fade out)
        if(spectatee_status || getstati(STAT_HEALTH) <= 0)
                reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
-       else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_SNIPERRIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
+       else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_RIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
                reticle_type = 2; // nex zoom
        else if(button_zoom || zoomscript_caught)
                reticle_type = 1; // normal zoom
-       else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_SNIPERRIFLE && button_attack2)
+       else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_RIFLE && button_attack2)
                reticle_type = 2; // nex zoom
 
        if (reticle_type)
@@ -732,7 +718,7 @@ void CSQC_UpdateView(float w, float h)
        {
                float contentalpha_temp, incontent, liquidalpha, contentfadetime;
                vector liquidcolor;
-               
+
                switch(pointcontents(view_origin))
                {
                        case CONTENT_WATER:
@@ -740,26 +726,26 @@ void CSQC_UpdateView(float w, float h)
                                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;
@@ -768,15 +754,16 @@ void CSQC_UpdateView(float w, float h)
                }
                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)
+       if(autocvar_hud_damage && !autocvar_chase_active)
+
        {
                splash_size_x = max(vid_conwidth, vid_conheight);
                splash_size_y = max(vid_conwidth, vid_conheight);
@@ -842,14 +829,6 @@ void CSQC_UpdateView(float w, float h)
                        drawpic(splash_pos, "gfx/blood", splash_size, stov(autocvar_hud_damage_color), bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage, DRAWFLAG_NORMAL);
        }
 
-       // Draw the mouse cursor
-       // NOTE: drawpic must happen after R_RenderScene for some reason
-       //drawpic(getmousepos(), "gfx/cursor.tga", '11 14 0', '1 1 1', 1, 0);
-       //drawstring('50 50', ftos(game), '10 10 0', '1 1 1', 1, 0);
-       //self = edict_num(player_localnum);
-       //drawstring('0 0', vtos(pmove_org), '8 8 0', '1 1 1', 1, 0);
-       //drawstring('0 8', strcat("ORG: ", vtos(self.origin), " state: ", ftos(self.ctf_state), " HP: ", ftos(self.health)), '8 8 0', '1 1 1', 1, 0);
-       // as long as the ctf part isn't in, this is useless
        if(menu_visible)
                menu_show();
 
@@ -864,6 +843,7 @@ void CSQC_UpdateView(float w, float h)
                if(self.draw2d)
                        self.draw2d();
        self = e;
+       Draw_ShowNames_All();
 
        scoreboard_active = HUD_WouldDrawScoreboard();
 
@@ -880,14 +860,14 @@ void CSQC_UpdateView(float w, float h)
                nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
        }
 
-       float hud;
-       hud = getstati(STAT_HUD);
        if(hud == HUD_SPIDERBOT)
                CSQC_SPIDER_HUD();
        else if(hud == HUD_WAKIZASHI)
         CSQC_WAKIZASHI_HUD();
     else if(hud == HUD_RAPTOR)
         CSQC_RAPTOR_HUD();
+    else if(hud == HUD_BUMBLEBEE)
+        CSQC_BUMBLE_HUD();
        else
        {
                if(gametype == GAME_FREEZETAG)
@@ -906,7 +886,7 @@ void CSQC_UpdateView(float w, float h)
                                CSQC_common_hud();
 
                // crosshair goes VERY LAST
-               if(!scoreboard_active && !camera_active && intermission != 2) {
+               if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1) {
                        string wcross_style;
                        float wcross_alpha, wcross_resolution;
                        wcross_style = autocvar_crosshair;
@@ -973,13 +953,13 @@ void CSQC_UpdateView(float w, float h)
                        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;
@@ -1000,7 +980,7 @@ void CSQC_UpdateView(float w, float h)
                                {
                                        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)
                                {
@@ -1044,7 +1024,7 @@ void CSQC_UpdateView(float w, float h)
 
                                wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
                        }
-                       
+
                        vector hitindication_color;
                        if(autocvar_crosshair_hitindication)
                        {
@@ -1128,7 +1108,7 @@ void CSQC_UpdateView(float w, float h)
                                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;
@@ -1141,30 +1121,30 @@ void CSQC_UpdateView(float w, float h)
 
                                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 (autocvar_crosshair_ring && 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 = 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 = autocvar_crosshair_ring_nex_alpha;
                                        ring_rgb = wcross_color;
                                        ring_image = "gfx/crosshair_ring_nexgun.tga";
                                }
-                               else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) 
+                               else if (autocvar_crosshair_ring && 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 = autocvar_crosshair_ring_minelayer_alpha;
@@ -1179,17 +1159,17 @@ void CSQC_UpdateView(float w, float h)
                                        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
                                {
                                        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";
+                                       if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80))
+                                               ring_image = "gfx/crosshair_ring_rifle.tga";
                                        else
                                                ring_image = "gfx/crosshair_ring.tga";
                                }
@@ -1313,298 +1293,6 @@ void CSQC_UpdateView(float w, float h)
        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)
 {
@@ -1640,7 +1328,7 @@ void CSQC_common_hud(void)
                        HUD_DrawScoreboard();
 
                        if (scoreboard_active) // scoreboard/accuracy
-                       {       
+                       {
                                HUD_Reset();
                                // HUD_DrawScoreboard takes care of centerprint_start
                        }
@@ -1668,6 +1356,11 @@ void CSQC_common_hud(void)
                case HUD_WAKIZASHI:
                        CSQC_WAKIZASHI_HUD();
                        break;
+
+        case HUD_BUMBLEBEE:
+            CSQC_BUMBLE_HUD();
+            break;
+
        }
 }