]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud/crosshair.qc
Fix compilation units
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / crosshair.qc
index 1c0f06c6ad5fb949982a751830c3199590ed4fce..5672ebedb9caa2cce379b0c053338b8734dc02a0 100644 (file)
@@ -1,21 +1,19 @@
 #include "crosshair.qh"
 
-#include <client/autocvars.qh>
 #include <client/draw.qh>
-#include <client/main.qh>
 #include <client/hud/panel/scoreboard.qh>
 #include <client/view.qh>
-
-#include <lib/csqcmodel/cl_player.qh>
 #include <common/deathtypes/all.qh>
 #include <common/ent_cs.qh>
-#include <common/vehicles/all.qh>
-#include <common/viewloc.qh>
 #include <common/mapobjects/trigger/viewloc.qh>
-#include <common/wepent.qh>
 #include <common/minigames/cl_minigames.qh>
 #include <common/minigames/cl_minigames_hud.qh>
 #include <common/mutators/mutator/overkill/oknex.qh>
+#include <common/vehicles/all.qh>
+#include <common/viewloc.qh>
+#include <common/wepent.qh>
+#include <lib/csqcmodel/cl_player.qh>
+#include <lib/warpzone/common.qh>
 
 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;