X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud%2Fcrosshair.qc;h=5672ebedb9caa2cce379b0c053338b8734dc02a0;hb=01c11fbf847916ff4d7ec9e1ff85e5f3138a7b29;hp=1c0f06c6ad5fb949982a751830c3199590ed4fce;hpb=6c4bdd5eeea06db69a457997de24bef84b4eaf93;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud/crosshair.qc b/qcsrc/client/hud/crosshair.qc index 1c0f06c6a..5672ebedb 100644 --- a/qcsrc/client/hud/crosshair.qc +++ b/qcsrc/client/hud/crosshair.qc @@ -1,21 +1,19 @@ #include "crosshair.qh" -#include #include -#include #include #include - -#include #include #include -#include -#include #include -#include #include #include #include +#include +#include +#include +#include +#include float pickup_crosshair_time, pickup_crosshair_size; float hitindication_crosshair_size; @@ -215,12 +213,19 @@ LABEL(normalcolor) return wcross_color; } +.entity tag_entity; void HUD_Crosshair(entity this) { // reset player's alpha here upon death since forced scoreboard prevents running the crosshair_chase code if(autocvar_chase_active > 0 && autocvar_crosshair_chase && STAT(HEALTH) <= 0 && csqcplayer) csqcplayer.alpha = csqcplayer.m_alpha; + if (autocvar_chase_active > 0 && autocvar_chase_front) + { + csqcplayer.alpha = csqcplayer.m_alpha; + return; + } + float f, i, j; vector v; if(!scoreboard_active && !camera_active && intermission != 2 && !STAT(GAME_STOPPED) && !autocvar_cl_lockview @@ -256,20 +261,41 @@ void HUD_Crosshair(entity this) // TrueAim check float shottype; + static int crosshair_chase_state = 0; + // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; if(csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM)) wcross_origin = viewloc_mousepos; else if(autocvar_chase_active > 0 && autocvar_crosshair_chase) { vector player_org = ((csqcplayer) ? csqcplayer.origin + csqcplayer.view_ofs : view_origin); - if(csqcplayer && autocvar_crosshair_chase_playeralpha && autocvar_crosshair_chase_playeralpha < 1) + float my_alpha = (!csqcplayer.m_alpha) ? 1 : csqcplayer.m_alpha; + float chase_playeralpha = bound(0.001, autocvar_crosshair_chase_playeralpha, 1); + if(csqcplayer && chase_playeralpha < 1 && my_alpha > chase_playeralpha) { - traceline(view_origin, view_origin + max_shot_distance * view_forward, MOVE_NORMAL, NULL); - float myalpha = (!csqcplayer.m_alpha) ? 1 : csqcplayer.m_alpha; - if(trace_ent == csqcplayer) - csqcplayer.alpha = min(autocvar_crosshair_chase_playeralpha, myalpha); + crosshair_chase_state = 2; + bool hit = false; + if (pointinsidebox(view_origin, csqcplayer.absmin, csqcplayer.absmax)) + hit = true; + else + { + WarpZone_TraceLine(view_origin, view_origin + max_shot_distance * view_forward, MOVE_NORMAL, NULL); + if(trace_ent == csqcplayer) + hit = true; + } + float prev_alpha = csqcplayer.alpha; + if(hit) + csqcplayer.alpha = max(csqcplayer.alpha - frametime * 5, chase_playeralpha); else - csqcplayer.alpha = csqcplayer.m_alpha; + csqcplayer.alpha = min(csqcplayer.alpha + frametime * 5, my_alpha); + + if (csqcplayer.alpha != prev_alpha) + { + FOREACH_ENTITY_CLASS("ENT_CLIENT_MODEL", it.tag_entity == csqcplayer, + { + it.alpha = csqcplayer.alpha; + }); + } } traceline(player_org, player_org + max_shot_distance * view_forward, MOVE_WORLDONLY, NULL); wcross_origin = project_3d_to_2d(trace_endpos); @@ -277,6 +303,16 @@ void HUD_Crosshair(entity this) else wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward); wcross_origin.z = 0; + if (crosshair_chase_state == 2) // enabled (this frame) + crosshair_chase_state = 1; + else if (crosshair_chase_state == 1) // turned off in the previous frame + { + // reset player alpha only in this frame + if (csqcplayer) + csqcplayer.alpha = csqcplayer.m_alpha; + crosshair_chase_state = 0; // turned off and alpha reset + } + if(autocvar_crosshair_hittest) { vector wcross_oldorigin;