]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/View.qc
Merge remote-tracking branch 'origin/master' into samual/combined_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / View.qc
index b2e9c03e0ea5659da6b93b5f1c41b0592283e864..36b49bda977c520edeccde2ee486ad63ee609452 100644 (file)
@@ -1,10 +1,5 @@
 entity porto;
 vector polyline[16];
-float Q3SURFACEFLAG_SLICK = 2; // low friction surface
-float DPCONTENTS_SOLID = 1; // blocks player movement
-float DPCONTENTS_BODY = 32; // blocks player movement
-float DPCONTENTS_CORPSE = 64; // blocks player movement
-float DPCONTENTS_PLAYERCLIP = 256; // blocks player movement
 void Porto_Draw()
 {
        vector p, dir, ang, q, nextdir;
@@ -171,15 +166,19 @@ vector GetCurrentFov(float fov)
 
        if(autocvar_cl_velocityzoom && autocvar_cl_velocityzoom_type) // _type = 0 disables velocity zoom too
        {
-               v = pmove_vel;
-               if(csqcplayer)
-                       v = csqcplayer.velocity;
-
-               switch(autocvar_cl_velocityzoom_type)
+               if(intermission) { curspeed = 0; }
+               else
                {
-                       case 3: curspeed = max(0, v_forward * v); break;
-                       case 2: curspeed = (v_forward * v); break;
-                       case 1: default: curspeed = vlen(v); break;
+                       v = pmove_vel;
+                       if(csqcplayer)
+                               v = csqcplayer.velocity;
+
+                       switch(autocvar_cl_velocityzoom_type)
+                       {
+                               case 3: curspeed = max(0, v_forward * v); break;
+                               case 2: curspeed = (v_forward * v); break;
+                               case 1: default: curspeed = vlen(v); break;
+                       }
                }
                
                velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoom_time), 1); // speed at which the zoom adapts to player velocity
@@ -214,6 +213,9 @@ string wcross_name_goal_prev, wcross_name_goal_prev_prev;
 float wcross_resolution_goal_prev, wcross_resolution_goal_prev_prev;
 float wcross_name_changestarttime, wcross_name_changedonetime;
 float wcross_name_alpha_goal_prev, wcross_name_alpha_goal_prev_prev;
+
+float wcross_ring_prev;
+
 entity trueaim;
 entity trueaim_rifle;
 
@@ -347,8 +349,8 @@ void PostInit(void);
 void CSQC_Demo_Camera();
 float HUD_WouldDrawScoreboard();
 float camera_mode;
-float CAMERA_FREE = 1;
-float CAMERA_CHASE = 2;
+const float CAMERA_FREE = 1;
+const float CAMERA_CHASE = 2;
 float reticle_type;
 string NextFrameCommand;
 void CSQC_SPIDER_HUD();
@@ -477,10 +479,18 @@ void CSQC_UpdateView(float w, float h)
        // 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 && is_dead) || intermission)
+               if((spectatee_status >= 0 && (autocvar_cl_eventchase_death && is_dead)) || 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 = ((csqcplayer ? csqcplayer.origin : pmove_org) + autocvar_cl_eventchase_viewoffset);
+                       vector current_view_origin = (csqcplayer ? csqcplayer.origin : pmove_org);
+
+                       // detect maximum viewoffset and use it
+                       if(autocvar_cl_eventchase_viewoffset)
+                       {
+                               WarpZone_TraceLine(current_view_origin, current_view_origin + autocvar_cl_eventchase_viewoffset + ('0 0 1' * autocvar_cl_eventchase_maxs_z), MOVE_WORLDONLY, self);
+                               if(trace_fraction == 1) { current_view_origin += autocvar_cl_eventchase_viewoffset; }
+                               else { current_view_origin_z += max(0, (trace_endpos_z - current_view_origin_z) - autocvar_cl_eventchase_maxs_z); }
+                       }
 
                        // 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 setproperty()
@@ -794,11 +804,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 || is_dead || hud != HUD_NORMAL)
                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_RIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
+       else if((activeweapon == WEP_NEX || activeweapon == WEP_RIFLE || 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_RIFLE && button_attack2)
+       else if((activeweapon == WEP_NEX) && button_attack2)
                reticle_type = 2; // nex zoom
     
        if(reticle_type && autocvar_cl_reticle)
@@ -1061,7 +1071,7 @@ void CSQC_UpdateView(float w, float h)
        if(hit_time > nextsound_hit_time && autocvar_cl_hitsound)
        {
                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);
+                       sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTEN_NONE);
                        
                nextsound_hit_time = time + autocvar_cl_hitsound_antispam_time;
        }
@@ -1069,7 +1079,7 @@ void CSQC_UpdateView(float w, float h)
        if(typehit_time > nextsound_typehit_time) 
        {
                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);
+                       sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTEN_NONE);
                        
                nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
        }
@@ -1115,7 +1125,18 @@ void CSQC_UpdateView(float w, float h)
                        // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
                        wcross_origin = project_3d_to_2d(view_origin + MAX_SHOT_DISTANCE * view_forward);
                        wcross_origin_z = 0;
-                       if(autocvar_crosshair_hittest)
+                       
+                       if(
+                               autocvar_crosshair_hittest
+                               &&
+                               (
+                                       autocvar_crosshair_hittest_blur
+                                       ||
+                                       autocvar_crosshair_hittest_scale
+                                       ||
+                                       autocvar_crosshair_hittest_showimpact
+                               )
+                       )
                        {
                                vector wcross_oldorigin;
                                wcross_oldorigin = wcross_origin;
@@ -1131,8 +1152,7 @@ void CSQC_UpdateView(float w, float h)
                                if(!autocvar_crosshair_hittest_showimpact)
                                        wcross_origin = wcross_oldorigin;
                        }
-                       else
-                               shottype = SHOTTYPE_HITWORLD;
+                       else { shottype = SHOTTYPE_HITWORLD; }
 
                        vector wcross_color = '0 0 0', wcross_size = '0 0 0';
                        string wcross_wep = "", wcross_name;
@@ -1290,13 +1310,11 @@ void CSQC_UpdateView(float w, float h)
                        }
 
                        if(shottype == SHOTTYPE_HITENEMY)
-                               wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0
+                               wcross_scale *= autocvar_crosshair_hittest_scale; // is not queried if hittest is 0
                        if(shottype == SHOTTYPE_HITTEAM)
-                               wcross_scale /= autocvar_crosshair_hittest; // is not queried if hittest is 0
+                               wcross_scale /= autocvar_crosshair_hittest_scale; // is not queried if hittest is 0
 
-                       f = autocvar_crosshair_effect_speed;
-                       if(f < 0)
-                               f *= -2 * g_weaponswitchdelay; // anim starts when weapon has been lowered and new weapon comes up
+                       f = fabs(autocvar_crosshair_effect_time);
                        if(wcross_scale != wcross_scale_goal_prev || wcross_alpha != wcross_alpha_goal_prev || wcross_color != wcross_color_goal_prev)
                        {
                                wcross_changedonetime = time + f;
@@ -1420,11 +1438,24 @@ void CSQC_UpdateView(float w, float h)
                                        }
 
                                        // if in weapon switch animation, fade ring out/in
-                                       if(g_weaponswitchdelay > 0)
+                                       if(autocvar_crosshair_effect_time > 0)
                                        {
-                                               f = (time - wcross_name_changestarttime) / g_weaponswitchdelay;
-                                               if(f > 0 && f < 2)
-                                                       ring_alpha *= fabs(1 - f);
+                                               f = (time - wcross_name_changestarttime) / autocvar_crosshair_effect_time;
+                                               if not(f < 1)
+                                               {
+                                                       wcross_ring_prev = ((ring_image) ? TRUE : FALSE);
+                                               }
+                                               
+                                               if(wcross_ring_prev)
+                                               {
+                                                       if(f < 1)
+                                                               ring_alpha *= fabs(1 - bound(0, f, 1));
+                                               }
+                                               else
+                                               {
+                                                       if(f < 1)
+                                                               ring_alpha *= bound(0, f, 1);
+                                               }
                                        }
 
                                        if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring