X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2FView.qc;h=5d5f28789e0449dd846777465d6174db501dc1f6;hp=e6d2f925e4a246cb67cbf5081193bd7181fa678d;hb=e64a2a1d922f7bb65999b71d1c35fd9e42def55d;hpb=0f060ee04a520b3692340198b22fa6184181c827 diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index e6d2f925e4..5d5f28789e 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -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 \