]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/View.qc
Don't let eventchase put the view into the ceiling when you die
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / View.qc
index e6d2f925e4a246cb67cbf5081193bd7181fa678d..5d5f28789e0449dd846777465d6174db501dc1f6 100644 (file)
@@ -214,6 +214,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;
 
@@ -381,8 +384,8 @@ vector damage_blurpostprocess, content_blurpostprocess;
 
 float checkfail[16];
 
-float last_flicker;
-vector previous_color;
+float rainbow_last_flicker;
+vector rainbow_prev_color;
 
 #define BUTTON_3 4
 #define BUTTON_4 8
@@ -480,7 +483,16 @@ void CSQC_UpdateView(float w, float h)
                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
+                       WarpZone_TraceLine(current_view_origin, current_view_origin + autocvar_cl_eventchase_viewoffset + ('0 0 1' * autocvar_cl_eventchase_maxs_z), MOVE_WORLDONLY, self);
+                       current_view_origin_z +=
+                               max(0,
+                                       (trace_fraction * autocvar_cl_eventchase_viewoffset_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()
@@ -1138,7 +1150,8 @@ void CSQC_UpdateView(float w, float h)
                        string wcross_wep = "", wcross_name;
                        float wcross_scale, wcross_blur;
 
-                       if (autocvar_crosshair_per_weapon || autocvar_crosshair_color_per_weapon) {
+                       if (autocvar_crosshair_per_weapon || (autocvar_crosshair_color_special == 1))
+                       {
                                e = get_weaponinfo(switchingweapon);
                                if (e && e.netname != "")
                                {
@@ -1158,56 +1171,82 @@ void CSQC_UpdateView(float w, float h)
                                        }
                                }
                        }
-                       if(wcross_wep != "" && autocvar_crosshair_color_per_weapon)
-                               wcross_color = stov(cvar_string(strcat("crosshair_", wcross_wep, "_color")));
-                       else if(autocvar_crosshair_color_by_health)
-                       {
-                               float x = getstati(STAT_HEALTH);
-
-                               //x = red
-                               //y = green
-                               //z = blue
 
-                               wcross_color_z = 0;
+                       //print(sprintf("crosshair style: %s\n", wcross_style));
+                       wcross_name = strcat("gfx/crosshair", wcross_style);
 
-                               if(x > 200)
-                               {
-                                       wcross_color_x = 0;
-                                       wcross_color_y = 1;
-                               }
-                               else if(x > 150)
-                               {
-                                       wcross_color_x = 0.4 - (x-150)*0.02 * 0.4;
-                                       wcross_color_y = 0.9 + (x-150)*0.02 * 0.1;
-                               }
-                               else if(x > 100)
-                               {
-                                       wcross_color_x = 1 - (x-100)*0.02 * 0.6;
-                                       wcross_color_y = 1 - (x-100)*0.02 * 0.1;
-                                       wcross_color_z = 1 - (x-100)*0.02;
-                               }
-                               else if(x > 50)
+                       // MAIN CROSSHAIR COLOR DECISION
+                       switch(autocvar_crosshair_color_special)
+                       {
+                               case 1: // crosshair_color_per_weapon
                                {
-                                       wcross_color_x = 1;
-                                       wcross_color_y = 1;
-                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+                                       if(wcross_wep != "")
+                                       {
+                                               wcross_color = stov(cvar_string(sprintf("crosshair_%s_color", wcross_wep)));
+                                               break;
+                                       }
+                                       else { goto normalcolor; }
                                }
-                               else if(x > 20)
+
+                               case 2: // crosshair_color_by_health
                                {
-                                       wcross_color_x = 1;
-                                       wcross_color_y = (x-20)*90/27/100;
-                                       wcross_color_z = (x-20)*90/27/100 * 0.2;
+                                       float x = getstati(STAT_HEALTH);
+
+                                       //x = red
+                                       //y = green
+                                       //z = blue
+
+                                       wcross_color_z = 0;
+
+                                       if(x > 200)
+                                       {
+                                               wcross_color_x = 0;
+                                               wcross_color_y = 1;
+                                       }
+                                       else if(x > 150)
+                                       {
+                                               wcross_color_x = 0.4 - (x-150)*0.02 * 0.4;
+                                               wcross_color_y = 0.9 + (x-150)*0.02 * 0.1;
+                                       }
+                                       else if(x > 100)
+                                       {
+                                               wcross_color_x = 1 - (x-100)*0.02 * 0.6;
+                                               wcross_color_y = 1 - (x-100)*0.02 * 0.1;
+                                               wcross_color_z = 1 - (x-100)*0.02;
+                                       }
+                                       else if(x > 50)
+                                       {
+                                               wcross_color_x = 1;
+                                               wcross_color_y = 1;
+                                               wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+                                       }
+                                       else if(x > 20)
+                                       {
+                                               wcross_color_x = 1;
+                                               wcross_color_y = (x-20)*90/27/100;
+                                               wcross_color_z = (x-20)*90/27/100 * 0.2;
+                                       }
+                                       else
+                                       {
+                                               wcross_color_x = 1;
+                                               wcross_color_y = 0;
+                                       }
+                                       break;
                                }
-                               else
+
+                               case 3: // crosshair_color_rainbow
                                {
-                                       wcross_color_x = 1;
-                                       wcross_color_y = 0;
+                                       if(time >= rainbow_last_flicker)
+                                       {
+                                               rainbow_prev_color = randomvec() * autocvar_crosshair_color_special_rainbow_brightness;
+                                               rainbow_last_flicker = time + autocvar_crosshair_color_special_rainbow_delay;
+                                       }
+                                       wcross_color = rainbow_prev_color;
+                                       break;
                                }
+                               :normalcolor
+                               default: { wcross_color = stov(autocvar_crosshair_color); break; }
                        }
-                       else
-                               wcross_color = stov(autocvar_crosshair_color);
-
-                       wcross_name = strcat("gfx/crosshair", wcross_style);
 
                        if(autocvar_crosshair_effect_scalefade)
                        {
@@ -1241,7 +1280,7 @@ void CSQC_UpdateView(float w, float h)
 
                        if(autocvar_crosshair_hitindication)
                        {
-                               vector hitindication_color = ((autocvar_crosshair_color_per_weapon) ? stov(autocvar_crosshair_hitindication_per_weapon_color) : stov(autocvar_crosshair_hitindication_color));
+                               vector hitindication_color = ((autocvar_crosshair_color_special == 1) ? stov(autocvar_crosshair_hitindication_per_weapon_color) : stov(autocvar_crosshair_hitindication_color));
                                
                                if(hitindication_crosshair_time < hit_time)
                                {
@@ -1267,9 +1306,7 @@ void CSQC_UpdateView(float w, float h)
                        if(shottype == SHOTTYPE_HITTEAM)
                                wcross_scale /= autocvar_crosshair_hittest; // 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;
@@ -1393,11 +1430,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
@@ -1406,16 +1456,6 @@ void CSQC_UpdateView(float w, float h)
                                        if (ring_value)
                                                DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
                                }
-                               
-                               if(autocvar_crosshair_rainbow)
-                               {
-                                       if(time >= last_flicker)
-                                       {
-                                               previous_color = randomvec() * autocvar_crosshair_rainbow_brightness;
-                                               last_flicker = time + autocvar_crosshair_rainbow_delay;
-                                       }
-                                       wcross_color = previous_color;
-                               }
 
 #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
                                do \