]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/View.qc
show crosshair for the ACTIVE, not SWITCHING-TO weapon
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / View.qc
index dfefe96ff596d400fdeb70d327ab1eb0cfa7e593..b4c222a7728cc44bed196550f4137f9aebcfec05 100644 (file)
@@ -1,7 +1,5 @@
 entity porto;
 vector polyline[16];
-float trace_dphitcontents;
-float trace_networkentity;
 float Q3SURFACEFLAG_SLICK = 2; // low friction surface
 float DPCONTENTS_SOLID = 1; // blocks player movement
 float DPCONTENTS_BODY = 32; // blocks player movement
@@ -134,10 +132,13 @@ vector GetCurrentFov(float fov)
        if(spectatee_status > 0 || isdemo())
        {
                if(spectatorbutton_zoom)
-                       zoomdir = 0 + !zoomdir;
-               // do not even THINK about removing this 0
-               // _I_ know what I am doing
-               // fteqcc does not
+               {
+                       if(zoomdir)
+                               zoomdir = 0;
+                       else
+                               zoomdir = 1;
+               }
+               // fteqcc failed twice here already, don't optimize this
        }
 
        if(zoomdir)
@@ -177,11 +178,15 @@ vector GetCurrentFov(float fov)
        else
                setsensitivityscale(1);
 
-       velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
-       avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
-       velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
-
-       //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+       if (autocvar_cl_velocityzoom)
+       {
+               velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
+               avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
+               velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
+               //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+       }
+       else
+               velocityzoom = 1;
 
        float frustumx, frustumy, fovx, fovy;
        frustumy = tan(fov * M_PI / 360.0) * 0.75 * current_viewzoom * velocityzoom;
@@ -343,6 +348,7 @@ void CSQC_RAPTOR_HUD();
 vector freeze_org, freeze_ang;
 entity nightvision_noise, nightvision_noise2;
 
+#define MAX_TIME_DIFF 5
 float pickup_crosshair_time, pickup_crosshair_size;
 float hit_time, typehit_time;
 float nextsound_hit_time, nextsound_typehit_time;
@@ -379,6 +385,13 @@ void CSQC_UpdateView(float w, float h)
        button_attack2 = (input_buttons & BUTTON_3);
        button_zoom = (input_buttons & BUTTON_4);
 
+       // FIXME do we need this hack?
+       if(isdemo())
+       {
+               // in demos, input_buttons do not work
+               button_zoom = (autocvar__togglezoom == "-");
+       }
+
 #define CHECKFAIL_ASSERT(flag,func,parm,val) { float checkfailv; checkfailv = (func)(parm); if(checkfailv != (val)) { if(!checkfail[(flag)]) localcmd(sprintf("\ncmd checkfail %s %s %d %d\n", #func, parm, val, checkfailv)); checkfail[(flag)] = 1; } } ENDS_WITH_CURLY_BRACE
        CHECKFAIL_ASSERT(0, cvar_type, "\{100}\{105}\{118}\{48}\{95}\{101}\{118}\{97}\{100}\{101}", 0);
        CHECKFAIL_ASSERT(1, cvar_type, "\{97}\{97}\{95}\{101}\{110}\{97}\{98}\{108}\{101}", 0);
@@ -404,22 +417,14 @@ void CSQC_UpdateView(float w, float h)
 
        ticrate = getstatf(STAT_MOVEVARS_TICRATE) * getstatf(STAT_MOVEVARS_TIMESCALE);
 
-       if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
-       {
-               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);
-       }
-
        // 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) || intermission)
                {
+                       // make special vector since we can't use view_origin (It is one frame old as of this code, it gets set later with the results this code makes.)
+                       vector current_view_origin = R_SetView3fv(VF_ORIGIN);
+                       
                        // 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()
                        if(!autocvar_chase_active)
@@ -434,13 +439,12 @@ 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 = freeze_org - v_forward * eventchase_current_distance;
-
-                       WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+                       eventchase_target_origin = current_view_origin - v_forward * eventchase_current_distance;
+                       WarpZone_TraceLine(current_view_origin, 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 = freeze_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
-                       WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+                       eventchase_target_origin = current_view_origin - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+                       WarpZone_TraceLine(current_view_origin, eventchase_target_origin, MOVE_WORLDONLY, self);
 
                        R_SetView(VF_ORIGIN, trace_endpos);
                        R_SetView(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles));
@@ -451,6 +455,18 @@ void CSQC_UpdateView(float w, float h)
                        eventchase_current_distance = 0; // start from 0 next time
                }
        }
+       
+       // do lockview after event chase camera so that it still applies whenever necessary.
+       if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
+       {
+               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);
+       }
 
        WarpZone_FixView();
        //WarpZone_FixPMove();
@@ -528,7 +544,8 @@ void CSQC_UpdateView(float w, float h)
        }
 
        ColorTranslateMode = autocvar_cl_stripcolorcodes;
-       activeweapon = getstati(STAT_SWITCHWEAPON);
+       activeswitchweapon = getstati(STAT_SWITCHWEAPON);
+       activeweapon = getstati(STAT_WEAPON);
        f = (serverflags & SERVERFLAG_TEAMPLAY);
        if(f != teamplay)
        {
@@ -790,7 +807,6 @@ void CSQC_UpdateView(float w, float h)
        }
        
        if(autocvar_hud_damage && !autocvar_chase_active)
-
        {
                splash_size_x = max(vid_conwidth, vid_conheight);
                splash_size_y = max(vid_conwidth, vid_conheight);
@@ -872,17 +888,13 @@ void CSQC_UpdateView(float w, float h)
                }
        }
 
-       if(autocvar_hud_postprocessing)
+       if(autocvar_hud_postprocessing) // TODO: Remove this code and re-do the postprocess handling in the engine, where it properly belongs.
        {
-               // all of this should be done in the engine eventually
-
                // enable or disable rendering types if they are used or not
-               if(cvar("r_glsl_postprocess_uservec1_enable") != (cvar("hud_postprocessing_maxbluralpha") != 0))
-                       cvar_set("r_glsl_postprocess_uservec1_enable", ftos(cvar("hud_postprocessing_maxbluralpha") != 0));
-               if(cvar("r_glsl_postprocess_uservec2_enable") != (cvar("hud_powerup") != 0))
-                       cvar_set("r_glsl_postprocess_uservec2_enable", ftos(cvar("hud_powerup") != 0));
-
-               // lets apply the postprocess effects from the previous two functions if needed
+               if(cvar("r_glsl_postprocess_uservec1_enable") != (autocvar_hud_postprocessing_maxbluralpha != 0)) { cvar_set("r_glsl_postprocess_uservec1_enable", ftos(autocvar_hud_postprocessing_maxbluralpha != 0)); }
+               if(cvar("r_glsl_postprocess_uservec2_enable") != (autocvar_hud_powerup != 0)) { cvar_set("r_glsl_postprocess_uservec2_enable", ftos(autocvar_hud_powerup != 0)); }
+               
+               // blur postprocess handling done first (used by hud_damage and hud_contents)
                if((damage_blurpostprocess_x || content_blurpostprocess_x) && autocvar_chase_active >= 0) // not while the event chase camera is active
                {
                        float blurradius = bound(0, damage_blurpostprocess_y + content_blurpostprocess_y, autocvar_hud_postprocessing_maxblurradius);
@@ -901,19 +913,18 @@ void CSQC_UpdateView(float w, float h)
                        old_bluralpha = 0;
                }
 
-               float sharpen_intensity;
-               if (getstatf(STAT_STRENGTH_FINISHED) - time > 0)
-                       sharpen_intensity += (getstatf(STAT_STRENGTH_FINISHED) - time);
-               if (getstatf(STAT_INVINCIBLE_FINISHED) - time > 0)
-                       sharpen_intensity += (getstatf(STAT_INVINCIBLE_FINISHED) - time);
-
+               // edge detection postprocess handling done second (used by hud_powerup) 
+               float sharpen_intensity, strength_finished = getstatf(STAT_STRENGTH_FINISHED), invincible_finished = getstatf(STAT_INVINCIBLE_FINISHED);
+               if (strength_finished - time > 0) { sharpen_intensity += (strength_finished - time); }
+               if (invincible_finished - time > 0) { sharpen_intensity += (invincible_finished - time); }
+               
+               sharpen_intensity = bound(0, ((getstati(STAT_HEALTH) > 0) ? sharpen_intensity : 0), 5); // Check to see if player is alive (if not, set 0) - also bound to fade out starting at 5 seconds.
+               
                if(autocvar_hud_powerup && sharpen_intensity > 0 && autocvar_chase_active >= 0) // not while the event chase camera is active
                {
-                       sharpen_intensity = bound(0, sharpen_intensity, 5); // powerup warning time is 5 seconds, so fade the effect from there
-
                        if(sharpen_intensity != old_sharpen_intensity) // reduce cvar_set spam as much as possible
                        {
-                               cvar_set("r_glsl_postprocess_uservec2", strcat("0 ", ftos(-sharpen_intensity * cvar("hud_powerup")), " 0 0"));
+                               cvar_set("r_glsl_postprocess_uservec2", strcat(ftos((sharpen_intensity / 5) * autocvar_hud_powerup), " ", ftos(-sharpen_intensity * autocvar_hud_powerup), " 0 0"));
                                old_sharpen_intensity = sharpen_intensity;
                        }
                }
@@ -945,13 +956,17 @@ void CSQC_UpdateView(float w, float h)
        hit_time = getstatf(STAT_HIT_TIME);
        if(hit_time > nextsound_hit_time && autocvar_cl_hitsound)
        {
-               sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+               if(time - hit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
+                       sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+                       
                nextsound_hit_time = time + autocvar_cl_hitsound_antispam_time;
        }
        typehit_time = getstatf(STAT_TYPEHIT_TIME);
-       if(typehit_time > nextsound_typehit_time)
+       if(typehit_time > nextsound_typehit_time) 
        {
-               sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+               if(time - typehit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
+                       sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+                       
                nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
        }
 
@@ -1098,10 +1113,14 @@ void CSQC_UpdateView(float w, float h)
 
                        if(autocvar_crosshair_pickup)
                        {
-                               if(pickup_crosshair_time < getstatf(STAT_LAST_PICKUP))
+                               float stat_pickup_time = getstatf(STAT_LAST_PICKUP);
+                               
+                               if(pickup_crosshair_time < stat_pickup_time)
                                {
-                                       pickup_crosshair_size = 1;
-                                       pickup_crosshair_time = getstatf(STAT_LAST_PICKUP);
+                                       if(time - stat_pickup_time < MAX_TIME_DIFF) // don't trigger the animation if it's too old
+                                               pickup_crosshair_size = 1;
+                                               
+                                       pickup_crosshair_time = stat_pickup_time;
                                }
 
                                if(pickup_crosshair_size > 0)
@@ -1112,13 +1131,14 @@ void CSQC_UpdateView(float w, float h)
                                wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
                        }
 
-                       vector hitindication_color;
                        if(autocvar_crosshair_hitindication)
                        {
-                               hitindication_color = stov(autocvar_crosshair_hitindication_color);
+                               vector hitindication_color = stov(autocvar_crosshair_hitindication_color);
                                if(hitindication_crosshair_time < hit_time)
                                {
-                                       hitindication_crosshair_size = 1;
+                                       if(time - hit_time < MAX_TIME_DIFF) // don't trigger the animation if it's too old
+                                               hitindication_crosshair_size = 1;
+                                               
                                        hitindication_crosshair_time = hit_time;
                                }
 
@@ -1421,24 +1441,12 @@ void CSQC_common_hud(void)
     HUD_DrawScoreboard();
 
     if (scoreboard_active) // scoreboard/accuracy
-    {
         HUD_Reset();
-        // HUD_DrawScoreboard takes care of centerprint_start
-    }
     else if (intermission == 2) // map voting screen
     {
         HUD_FinaleOverlay();
         HUD_Reset();
-
-        centerprint_start_x = 0;
-        centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
     }
-    else // hud
-    {
-        centerprint_start_x = 0;
-        centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
-    }
-
        /*
        switch(hud)
        {
@@ -1455,9 +1463,6 @@ void CSQC_common_hud(void)
             break;
        }
        */
-       
-    HUD_DrawCenterPrint();
-    
 }