Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
crosshair.qc
Go to the documentation of this file.
1#include "crosshair.qh"
2
3#include <client/draw.qh>
5#include <client/view.qh>
7#include <common/ent_cs.qh>
13#include <common/viewloc.qh>
14#include <common/wepent.qh>
17
21
28
33
35
38
39const float SHOTTYPE_HITTEAM = 1;
41const float SHOTTYPE_HITWORLD = 3;
42const float SHOTTYPE_HITENEMY = 4;
43
49
51{
53 wcross_origin.z = 0;
54 float n;
55 if (trace_ent)
56 n = trace_ent.entnum;
57 else
59 if (n < 1)
60 return SHOTTYPE_HITWORLD;
61 if (n > maxclients)
62 return SHOTTYPE_HITWORLD;
63 int t = entcs_GetTeam(n - 1);
64 if (teamplay && t == myteam)
65 return SHOTTYPE_HITTEAM;
66 if (t == NUM_SPECTATOR)
67 return SHOTTYPE_HITWORLD;
68 return SHOTTYPE_HITENEMY;
69}
70
72{
73 if (wepent.activeweapon.spawnflags & WEP_FLAG_NOTRUEAIM)
74 return SHOTTYPE_HITWORLD;
75
76 vector mi = '0 0 0', ma = '0 0 0';
77 entity ta = trueaim;
78 float mv = MOVE_NOMONSTERS;
79
80 switch (wepent.activeweapon) // WEAPONTODO
81 {
82 case WEP_VORTEX:
83 case WEP_OVERKILL_NEX:
84 case WEP_VAPORIZER:
85 mv = MOVE_NORMAL;
86 break;
87 case WEP_RIFLE:
88 ta = trueaim_rifle;
89 mv = MOVE_NORMAL;
91 {
92 tracebox(view_origin, '0 0 0', '0 0 0', view_origin + view_forward * max_shot_distance, mv, ta);
93 return EnemyHitCheck();
94 }
95 break;
96 case WEP_DEVASTATOR: // projectile has a size!
97 mi = '-3 -3 -3';
98 ma = '3 3 3';
99 break;
100 case WEP_FIREBALL: // projectile has a size!
101 mi = '-16 -16 -16';
102 ma = '16 16 16';
103 break;
104 case WEP_SEEKER: // projectile has a size!
105 mi = '-2 -2 -2';
106 ma = '2 2 2';
107 break;
108 case WEP_ELECTRO: // projectile has a size!
109 mi = '0 0 -3';
110 ma = '0 0 -3';
111 break;
112 }
113
114 vector traceorigin = entcs_receiver(player_localentnum - 1).origin + (eZ * STAT(VIEWHEIGHT));
115
116 traceline(traceorigin, traceorigin + view_forward * max_shot_distance, mv, ta);
117 vector trueaimpoint = trace_endpos;
118 // move trueaimpoint a little bit forward to make the final tracebox reliable
119 // since it sometimes doesn't reach a teammate by a hair
120 trueaimpoint += view_forward;
121
122 if (vdist((trueaimpoint - traceorigin), <, g_trueaim_minrange))
123 trueaimpoint = traceorigin + view_forward * g_trueaim_minrange;
124
125 vector vecs = decompressShotOrigin(STAT(SHOTORG));
126
127 if (vecs.x > 0)
128 vecs.y = -vecs.y;
129 else
130 vecs = '0 0 0';
131
132 vector dv = view_right * vecs.y + view_up * vecs.z;
133 vector w_shotorg = traceorigin + dv;
134
135 // now move the vecs forward as much as requested if possible
136 float nudge = 1; // added to traceline target and subtracted from result TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
137 tracebox(w_shotorg, mi, ma, w_shotorg + view_forward * (vecs.x + nudge), MOVE_NORMAL, ta); // FIXME this MOVE_NORMAL part will misbehave a little in csqc
139
140 tracebox(w_shotorg, mi, ma, trueaimpoint, MOVE_NORMAL, ta);
141 float shottype = EnemyHitCheck();
142 if (shottype != SHOTTYPE_HITWORLD)
143 return shottype;
144
145#if 0
146 // FIXME WHY DOES THIS NOT WORK FOR THE ROCKET LAUNCHER?
147 // or rather, I know why, but see no fix
148 if (vlen(trace_endpos - trueaimpoint) > vlen(ma) + vlen(mi) + 1)
149 // yes, this is an ugly hack... but it seems good enough to find out whether the test hits the same place as the initial trace
151#endif
152
153 return SHOTTYPE_HITWORLD;
154}
155
157{
158 if (hud != HUD_BUMBLEBEE_GUN)
159 {
160 Vehicle info = REGISTRY_GET(Vehicles, hud);
161 info.vr_crosshair(info, this);
162 }
163}
164
165vector crosshair_getcolor(entity this, float health_stat)
166{
167 static float rainbow_last_flicker;
168 static vector rainbow_prev_color;
169 vector wcross_color = '0 0 0';
171 {
172 case 1: // weapon color
173 if (this != WEP_Null && hud == HUD_NORMAL)
174 {
175 wcross_color = this.m_color;
176 break;
177 }
178 else
179 goto normalcolor;
180
181 case 2: // color based on health and armor
182 {
183 vector v = healtharmor_maxdamage(health_stat, STAT(ARMOR), armorblockpercent, DEATH_WEAPON.m_id);
184 float health_and_armor = floor(v.x + 1);
185 wcross_color = HUD_Get_Num_Color(health_and_armor, 200, false);
186 break;
187 }
188
189 case 3: // rainbow/random color
190 if (time >= rainbow_last_flicker)
191 {
194 }
195 wcross_color = rainbow_prev_color;
196 break;
197LABEL(normalcolor)
198 default:
199 wcross_color = stov(autocvar_crosshair_color);
200 break;
201 }
202
203 return wcross_color;
204}
205
208{
209 csqcplayer.alpha = new_alpha;
210 FOREACH_ENTITY_CLASS("ENT_CLIENT_MODEL", it.tag_entity == csqcplayer, it.alpha = new_alpha);
211}
212
214{
215 // reset player's alpha here upon death since forced scoreboard prevents running the crosshair_chase code
217 csqcplayer.alpha = csqcplayer.m_alpha;
218
220 {
221 if (csqcplayer.alpha != csqcplayer.m_alpha)
223 return;
224 }
225
226 if (!scoreboard_active && !camera_active && intermission != 2 && !STAT(GAME_STOPPED) && !autocvar_cl_lockview
227 && spectatee_status != -1 && STAT(HEALTH) > 0 && !MUTATOR_CALLHOOK(DrawCrosshair)
228 && (!csqcplayer.viewloc || (!spectatee_status && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM)))
230 {
231 if (!autocvar_crosshair_enabled) // main toggle for crosshair rendering
232 return;
233
234 if (spectatee_status > 0 && STAT(CAMERA_SPECTATOR) == 2)
235 return;
236
237 if (hud != HUD_NORMAL)
238 {
240 return;
241 }
242
243 string wcross_style;
244 float wcross_alpha, wcross_resolution;
245 wcross_style = autocvar_crosshair;
246 if (csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM) && autocvar_crosshair_2d != "")
247 wcross_style = autocvar_crosshair_2d;
248 if (wcross_style == "0")
249 return;
250 wcross_resolution = autocvar_crosshair_size;
251 if (wcross_resolution == 0)
252 return;
253 wcross_alpha = autocvar_crosshair_alpha;
254 if (wcross_alpha == 0)
255 return;
256
257 static int crosshair_chase_state = 0;
258
259 // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
260 if (csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM))
263 {
264 vector player_org = (csqcplayer ? csqcplayer.origin + csqcplayer.view_ofs : view_origin);
265 float my_alpha = !csqcplayer.m_alpha ? 1 : csqcplayer.m_alpha;
266 float chase_playeralpha = bound(0.001, autocvar_crosshair_chase_playeralpha, 1);
267 if (csqcplayer && chase_playeralpha < 1 && my_alpha > chase_playeralpha)
268 {
269 crosshair_chase_state = 2;
270 bool hit = false;
271 if (pointinsidebox(view_origin, csqcplayer.absmin, csqcplayer.absmax))
272 hit = true;
273 else
274 {
276 if (trace_ent == csqcplayer)
277 hit = true;
278 }
279 float prev_alpha = csqcplayer.alpha;
280 float new_alpha = hit
281 ? max(csqcplayer.alpha - frametime * 5, chase_playeralpha)
282 : min(csqcplayer.alpha + frametime * 5, my_alpha);
283
284 if (new_alpha != prev_alpha)
286 }
287 traceline(player_org, player_org + max_shot_distance * view_forward, MOVE_WORLDONLY, NULL);
289 }
290 else
292 wcross_origin.z = 0;
293 if (crosshair_chase_state == 2) // enabled (this frame)
294 crosshair_chase_state = 1;
295 else if (crosshair_chase_state == 1) // turned off in the previous frame
296 {
297 // reset player alpha only in this frame
298 if (csqcplayer)
300 crosshair_chase_state = 0; // turned off and alpha reset
301 }
302
303 // TrueAim check
304 float shottype;
305
307 {
308 vector wcross_oldorigin;
309 entity thiswep = viewmodels[0]; // TODO: unhardcode
310 wcross_oldorigin = wcross_origin;
311 shottype = TrueAimCheck(thiswep);
312 if (shottype == SHOTTYPE_HITWORLD)
313 {
314 vector v = wcross_origin - wcross_oldorigin;
315 v.x /= vid_conwidth;
316 v.y /= vid_conheight;
317 if (vdist(v, >, 0.01))
318 shottype = SHOTTYPE_HITOBSTRUCTION;
319 }
321 wcross_origin = wcross_oldorigin;
322 }
323 else
324 shottype = SHOTTYPE_HITWORLD;
325
326 vector wcross_color = '0 0 0', wcross_size = '0 0 0';
327 string wcross_name = "";
328 float wcross_scale, wcross_blur;
329
330 entity e = WEP_Null;
332 {
333 entity wepent = viewmodels[0]; // TODO: unhardcode
334 e = wepent.switchingweapon;
336 {
337 // WEAPONTODO: access these through some general settings (with non-balance config settings)
338 //wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size"));
339 //if (wcross_resolution == 0)
340 //return;
341
342 //wcross_style = cvar_string(strcat("crosshair_", wcross_wep));
343 wcross_resolution *= e.w_crosshair_size;
344 wcross_name = e.w_crosshair;
345 }
346 }
347
348 if (wcross_name == "")
349 wcross_name = strcat("gfx/crosshair", wcross_style);
350
351 // MAIN CROSSHAIR COLOR DECISION
352 wcross_color = crosshair_getcolor(e, STAT(HEALTH));
353
355 {
356 wcross_scale = wcross_resolution;
357 wcross_resolution = 1;
358 }
359 else
360 wcross_scale = 1;
361
363 {
364 float stat_pickup_time = STAT(LAST_PICKUP);
365
366 if (pickup_crosshair_time < stat_pickup_time)
367 {
368 if (time - stat_pickup_time < 5) // don't trigger the animation if it's too old
370
371 pickup_crosshair_time = stat_pickup_time;
372 }
373
374 if (pickup_crosshair_size > 0)
376 else
378
380 }
381
382 // todo: make crosshair hit indication dependent on damage dealt
384 {
386
389
392 else
394
396 wcross_color.x += sin(hitindication_crosshair_size) * col.x;
397 wcross_color.y += sin(hitindication_crosshair_size) * col.y;
398 wcross_color.z += sin(hitindication_crosshair_size) * col.z;
399 }
400
401 // no effects needed for targeting enemies, this can't possibly span all valid targets!
402 // just show for teammates to give a sign that they're an invalid target
403 //if (shottype == SHOTTYPE_HITENEMY)
404 //wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0
405 if (shottype == SHOTTYPE_HITTEAM)
406 wcross_scale /= autocvar_crosshair_hittest; // is not queried if hittest is 0
407
409 if (wcross_scale != wcross_scale_goal_prev || wcross_alpha != wcross_alpha_goal_prev || wcross_color != wcross_color_goal_prev)
411 if (wcross_name != wcross_name_goal_prev || wcross_resolution != wcross_resolution_goal_prev)
412 {
418 wcross_name_goal_prev = strzone(wcross_name);
421 wcross_resolution_goal_prev = wcross_resolution;
422 }
423
424 wcross_scale_goal_prev = wcross_scale;
425 wcross_alpha_goal_prev = wcross_alpha;
426 wcross_color_goal_prev = wcross_color;
427
430 {
431 wcross_blur = 1;
432 wcross_alpha *= 0.75;
433 }
434 else
435 wcross_blur = 0;
436 // *_prev is at time-frametime
437 // * is at wcross_changedonetime+f
438 // what do we have at time?
440 {
442 wcross_scale = f * wcross_scale + (1 - f) * wcross_scale_prev;
443 wcross_alpha = f * wcross_alpha + (1 - f) * wcross_alpha_prev;
444 wcross_color = f * wcross_color + (1 - f) * wcross_color_prev;
445 }
446
447 wcross_scale_prev = wcross_scale;
448 wcross_alpha_prev = wcross_alpha;
449 wcross_color_prev = wcross_color;
450
451 MUTATOR_CALLHOOK(UpdateCrosshair);
452
453 wcross_scale *= 1 - autocvar__menu_alpha;
454 wcross_alpha *= 1 - autocvar__menu_alpha;
455 wcross_size = draw_getimagesize(wcross_name) * wcross_scale;
456
457 if (wcross_scale >= 0.001 && wcross_alpha >= 0.001)
458 {
459 // crosshair rings for weapon stats
461 {
462 // declarations and stats
463 float ring_value = 0, ring_scale = 0, ring_alpha = 0, ring_inner_value = 0, ring_inner_alpha = 0;
464 string ring_image = string_null, ring_inner_image = string_null;
465 vector ring_rgb = '0 0 0', ring_inner_rgb = '0 0 0';
466
467 ring_scale = autocvar_crosshair_ring_size;
468
469 entity wepent = viewmodels[0]; // TODO: unhardcode
470
471 int weapon_clipload = wepent.clip_load;
472 int weapon_clipsize = wepent.clip_size;
473
474 float arc_heat = wepent.arc_heat_percent;
475
476 if (vortex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
477 vortex_charge_movingavg = wepent.vortex_charge;
478
479 float charge = 0;
480 float chargepool = 0;
481 bool ring_vortex_enabled = false;
483 {
484 if (wepent.activeweapon == WEP_VORTEX)
485 {
486 charge = wepent.vortex_charge;
487 chargepool = wepent.vortex_chargepool_ammo;
488 }
489 else if (wepent.activeweapon == WEP_OVERKILL_NEX)
490 {
491 charge = wepent.oknex_charge;
492 chargepool = wepent.oknex_chargepool_ammo;
493 }
494 if (charge)
495 ring_vortex_enabled = true;
496 }
497
498 if (ring_vortex_enabled)
499 {
500 if (chargepool || use_vortex_chargepool)
501 {
503 ring_inner_value = chargepool;
504 }
505 else
506 {
508 vortex_charge_movingavg = (1 - rate) * vortex_charge_movingavg + rate * charge;
510 }
511
514 ring_inner_image = "gfx/crosshair_ring_inner";
515
516 // draw the outer ring to show the current charge of the weapon
517 ring_value = charge;
519 ring_rgb = wcross_color;
520 ring_image = "gfx/crosshair_ring_nexgun";
521 }
522 else if (autocvar_crosshair_ring && wepent.activeweapon == WEP_MINE_LAYER && WEP_CVAR(WEP_MINE_LAYER, limit) && autocvar_crosshair_ring_minelayer)
523 {
524 ring_value = bound(0, wepent.minelayer_mines / WEP_CVAR(WEP_MINE_LAYER, limit), 1);
526 ring_rgb = wcross_color;
527 ring_image = "gfx/crosshair_ring";
528 }
529 else if (wepent.activeweapon == WEP_HAGAR && wepent.hagar_load && autocvar_crosshair_ring_hagar)
530 {
531 ring_value = bound(0, wepent.hagar_load / WEP_CVAR_SEC(WEP_HAGAR, load_max), 1);
533 ring_rgb = wcross_color;
534 ring_image = "gfx/crosshair_ring";
535 }
536 else if (autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring
537 {
538 ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
541 ring_rgb = wcross_color;
542
543 // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
544 // if a new image for another weapon is added, add the code (and its respective file/value) here
545 if (wepent.activeweapon == WEP_RIFLE && weapon_clipsize == 80)
546 ring_image = "gfx/crosshair_ring_rifle";
547 else
548 ring_image = "gfx/crosshair_ring";
549 }
550 else if (autocvar_crosshair_ring && autocvar_crosshair_ring_arc && arc_heat && wepent.activeweapon == WEP_ARC)
551 {
552 ring_value = arc_heat;
553 ring_alpha = (1 - arc_heat) * autocvar_crosshair_ring_arc_cold_alpha +
555 ring_rgb = (1 - arc_heat) * wcross_color + arc_heat * autocvar_crosshair_ring_arc_hot_color;
556 ring_image = "gfx/crosshair_ring";
557 }
558
559 // if in weapon switch animation, fade ring out/in
561 {
563 if (f >= 1)
564 wcross_ring_prev = (ring_image ? true : false);
565
567 {
568 if (f < 1)
569 ring_alpha *= fabs(1 - bound(0, f, 1));
570 }
571 else
572 {
573 if (f < 1)
574 ring_alpha *= bound(0, f, 1);
575 }
576 }
577
578 if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
579 DrawCircleClippedPic(wcross_origin, wcross_size.x * wcross_resolution * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
580
581 if (ring_value)
582 DrawCircleClippedPic(wcross_origin, wcross_size.x * wcross_resolution * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
583 }
584
585 #define CROSSHAIR_DO_BLUR(M, sz, wcross_name, wcross_alpha) MACRO_BEGIN \
586 vector scaled_sz = sz * wcross_size; \
587 if (wcross_blur > 0) \
588 for (int j, i = -2; i <= 2; ++i) \
589 for (j = -2; j <= 2; ++j) \
590 M(i, j, sz, scaled_sz, wcross_name, wcross_alpha * 0.04); \
591 else \
592 M(0, 0, sz, scaled_sz, wcross_name, wcross_alpha); \
593 MACRO_END
594
595 #define CROSSHAIR_DRAW_SINGLE(i, j, sz, scaled_sz, wcross_name, wcross_alpha) \
596 drawpic(wcross_origin - ('0.5 0 0' * (scaled_sz.x + i * wcross_blur) + '0 0.5 0' * (scaled_sz.y + j * wcross_blur)), wcross_name, scaled_sz, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
597
598 #define CROSSHAIR_DRAW(sz,wcross_name,wcross_alpha) \
599 CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE, sz, wcross_name, wcross_alpha)
600
603 {
605 wcross_size = draw_getimagesize(wcross_name_goal_prev_prev) * wcross_scale;
607 f = 1 - f;
608 }
609 else
610 f = 1;
611
613
614 wcross_size = draw_getimagesize(wcross_name) * wcross_scale;
615 CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
616
618 {
619 vector wcross_color_old;
620 wcross_color_old = wcross_color;
621
623 wcross_color = stov(autocvar_crosshair_dot_color);
624
625 CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot", f * autocvar_crosshair_dot_alpha);
626 // FIXME why don't we use wcross_alpha here?
627 wcross_color = wcross_color_old;
628 }
629 }
630 }
631 else
632 {
646 }
647}
648
650{
652 return;
653
654 string reticle_image = string_null;
655 bool wep_zoomed = false;
656 for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
657 {
658 entity wepe = viewmodels[slot];
659 Weapon wep = wepe.activeweapon;
660 if (wep != WEP_Null && wep.wr_zoom)
661 {
662 bool do_zoom = wep.wr_zoom(wep, NULL);
663 if (!reticle_image && wep.w_reticle && wep.w_reticle != "")
664 reticle_image = wep.w_reticle;
665 wep_zoomed += do_zoom;
666 }
667 }
668 // Draw the aiming reticle for weapons that use it
669 // reticle_type is changed to the item we are zooming / aiming with, to decide which reticle to use
670 // It must be a persisted float for fading out to work properly (you let go of the zoom button for
671 // the view to go back to normal, so reticle_type would become 0 as we fade out)
672 int reticle_type;
673 if (spectatee_status || (STAT(HEALTH) <= 0) || hud != HUD_NORMAL || this.viewloc || (autocvar_chase_active != 0 && !autocvar_cl_reticle_chase))
674 reticle_type = 0; // no zoom reticle while dead
675 else if (wep_zoomed && autocvar_cl_reticle_weapon)
676 {
677 if (reticle_image)
678 reticle_type = 2;
679 else
680 reticle_type = 0;
681 }
682 else if (button_zoom || zoomscript_caught)
683 reticle_type = 1; // normal zoom
684 else
685 reticle_type = 0;
686
687 if (reticle_type)
688 {
689 vector reticle_pos = '0 0 0', reticle_size = '0 0 0';
691 {
692 reticle_size.x = vid_conwidth;
693 reticle_size.y = vid_conheight;
694 reticle_pos.x = 0;
695 reticle_pos.y = 0;
696 }
697 else
698 {
699 reticle_size.x = max(vid_conwidth, vid_conheight);
700 reticle_size.y = max(vid_conwidth, vid_conheight);
701 reticle_pos.x = (vid_conwidth - reticle_size.x) / 2;
702 reticle_pos.y = (vid_conheight - reticle_size.y) / 2;
703 }
704
705 float f = (zoomscript_caught ? 1 : max(0.25, current_zoomfraction));
706 if (f)
707 switch (reticle_type)
708 {
709 case 1:
710 drawpic(reticle_pos, "gfx/reticle_normal", reticle_size, '1 1 1', f * autocvar_cl_reticle_normal_alpha, DRAWFLAG_NORMAL);
711 break;
712 case 2:
713 if (reticle_image)
714 drawpic(reticle_pos, reticle_image, reticle_size, '1 1 1', f * autocvar_cl_reticle_weapon_alpha, DRAWFLAG_NORMAL);
715 break;
716 }
717 }
718}
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
bool HUD_MinigameMenu_IsOpened()
entity csqcplayer
Definition cl_player.qh:26
virtual void vr_crosshair()
(CLIENT) logic to run every frame
Definition vehicle.qh:80
fields which are explicitly/manually set are marked with "M", fields set automatically are marked wit...
Definition weapon.qh:44
virtual void wr_zoom()
(BOTH) weapon specific zoom reticle
Definition weapon.qh:116
string w_reticle
A: reticle : per-weapon zoom reticle.
Definition weapon.qh:75
void DrawCircleClippedPic(vector centre, float radi, string pic, float f, vector rgb, float a, float drawflag)
Definition draw.qc:190
#define drawpic(position, pic, size, rgb, alpha, flag)
Definition draw.qh:21
float g_trueaim_minrange
Definition main.qh:171
vector view_origin
Definition main.qh:109
float armorblockpercent
Definition main.qh:160
bool button_zoom
Definition main.qh:113
int spectatee_status
the -1 disables HUD panels before CSQC receives necessary data
Definition main.qh:197
vector view_up
Definition main.qh:109
int hud
Definition main.qh:173
vector view_right
Definition main.qh:109
float camera_active
Definition main.qh:153
vector view_forward
Definition main.qh:109
float current_zoomfraction
Definition main.qh:148
vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype)
Definition util.qc:1289
vector decompressShotOrigin(int f)
Definition util.qc:1275
#define LABEL(id)
Definition compiler.qh:34
const int HUD_BUMBLEBEE_GUN
Definition constants.qh:48
const int HUD_NORMAL
Definition constants.qh:47
float pickup_crosshair_size
Definition crosshair.qc:18
const float SHOTTYPE_HITTEAM
Definition crosshair.qc:39
float wcross_resolution_goal_prev_prev
Definition crosshair.qc:30
string wcross_name_goal_prev_prev
Definition crosshair.qc:29
float wcross_alpha_prev
Definition crosshair.qc:23
void HUD_Crosshair_ApplyPlayerAlpha(float new_alpha)
Definition crosshair.qc:207
float wcross_scale_goal_prev
Definition crosshair.qc:25
float pickup_crosshair_time
Definition crosshair.qc:18
void HUD_Crosshair_Vehicle(entity this)
Definition crosshair.qc:156
void TrueAim_Init()
Definition crosshair.qc:44
vector wcross_color_prev
Definition crosshair.qc:24
float wcross_resolution_goal_prev
Definition crosshair.qc:30
float use_vortex_chargepool
Definition crosshair.qc:20
float wcross_changedonetime
Definition crosshair.qc:27
#define CROSSHAIR_DRAW(sz, wcross_name, wcross_alpha)
int TrueAimCheck(entity wepent)
Definition crosshair.qc:71
const float SHOTTYPE_HITWORLD
Definition crosshair.qc:41
vector wcross_color_goal_prev
Definition crosshair.qc:26
void DrawReticle(entity this)
Definition crosshair.qc:649
const float SHOTTYPE_HITENEMY
Definition crosshair.qc:42
void HUD_Crosshair(entity this)
Definition crosshair.qc:213
const float SHOTTYPE_HITOBSTRUCTION
Definition crosshair.qc:40
float wcross_name_changestarttime
Definition crosshair.qc:31
vector wcross_origin
Definition crosshair.qc:22
string wcross_name_goal_prev
Definition crosshair.qc:29
float wcross_name_changedonetime
Definition crosshair.qc:31
float wcross_scale_prev
Definition crosshair.qc:23
float hitindication_crosshair_size
Definition crosshair.qc:19
vector crosshair_getcolor(entity this, float health_stat)
Definition crosshair.qc:165
entity trueaim_rifle
Definition crosshair.qc:37
entity trueaim
Definition crosshair.qc:36
float wcross_alpha_goal_prev
Definition crosshair.qc:25
int EnemyHitCheck()
Definition crosshair.qc:50
float wcross_ring_prev
Definition crosshair.qc:34
float wcross_name_alpha_goal_prev_prev
Definition crosshair.qc:32
float wcross_name_alpha_goal_prev
Definition crosshair.qc:32
bool autocvar_crosshair_ring_hagar
Definition crosshair.qh:39
float autocvar_crosshair_ring_vortex_inner_color_blue
Definition crosshair.qh:46
bool autocvar_crosshair_ring
Definition crosshair.qh:35
float autocvar_crosshair_ring_vortex_inner_color_red
Definition crosshair.qh:48
string autocvar_crosshair_2d
Definition crosshair.qh:10
bool autocvar_cl_reticle_weapon
Definition crosshair.qh:5
float autocvar_crosshair_ring_vortex_alpha
Definition crosshair.qh:42
bool autocvar_crosshair_hitindication
Definition crosshair.qh:24
bool autocvar_crosshair_hittest
Definition crosshair.qh:28
float autocvar_crosshair_size
Definition crosshair.qh:57
bool autocvar_crosshair_effect_scalefade
Definition crosshair.qh:21
float autocvar_crosshair_ring_reload_size
Definition crosshair.qh:56
bool autocvar_crosshair_ring_arc
Definition crosshair.qh:49
string autocvar_crosshair_dot_color
Definition crosshair.qh:18
bool autocvar_crosshair_enabled
Definition crosshair.qh:23
float autocvar_crosshair_ring_size
Definition crosshair.qh:53
float autocvar_crosshair_ring_reload_alpha
Definition crosshair.qh:55
float autocvar_cl_reticle_weapon_alpha
Definition crosshair.qh:6
int autocvar_crosshair_color_special
Definition crosshair.qh:13
bool autocvar_crosshair_ring_inner
Definition crosshair.qh:36
float autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate
Definition crosshair.qh:43
float autocvar_crosshair_ring_hagar_alpha
Definition crosshair.qh:40
bool autocvar_crosshair_hittest_blur_wall
Definition crosshair.qh:30
bool autocvar_cl_reticle_stretch
Definition crosshair.qh:7
float autocvar_crosshair_ring_vortex_inner_color_green
Definition crosshair.qh:47
float autocvar_crosshair_pickup_speed
Definition crosshair.qh:34
float autocvar_crosshair_dot_size
Definition crosshair.qh:20
bool autocvar_crosshair_ring_minelayer
Definition crosshair.qh:37
float autocvar_crosshair_color_special_rainbow_delay
Definition crosshair.qh:15
string autocvar_crosshair_color
Definition crosshair.qh:12
float autocvar_crosshair_ring_vortex_currentcharge_scale
Definition crosshair.qh:44
bool autocvar_crosshair_ring_reload
Definition crosshair.qh:54
float autocvar_crosshair_ring_arc_cold_alpha
Definition crosshair.qh:51
bool autocvar_crosshair_hittest_showimpact
Definition crosshair.qh:31
bool autocvar_crosshair_per_weapon
Definition crosshair.qh:32
float autocvar_crosshair_ring_vortex_inner_alpha
Definition crosshair.qh:45
vector autocvar_crosshair_ring_arc_hot_color
Definition crosshair.qh:50
bool autocvar_crosshair_hittest_blur_teammate
Definition crosshair.qh:29
float autocvar_crosshair_pickup
Definition crosshair.qh:33
float autocvar_crosshair_color_special_rainbow_brightness
Definition crosshair.qh:14
float vortex_charge_movingavg
Definition crosshair.qh:61
float autocvar_crosshair_hitindication_speed
Definition crosshair.qh:27
float autocvar_cl_reticle_normal_alpha
Definition crosshair.qh:4
bool autocvar_cl_reticle_chase
Definition crosshair.qh:8
float autocvar_crosshair_effect_time
Definition crosshair.qh:22
float autocvar_crosshair_ring_minelayer_alpha
Definition crosshair.qh:38
bool autocvar_crosshair_dot
Definition crosshair.qh:16
bool autocvar_crosshair_dot_color_custom
Definition crosshair.qh:19
string autocvar_crosshair_hitindication_per_weapon_color
Definition crosshair.qh:26
bool autocvar_crosshair_ring_vortex
Definition crosshair.qh:41
float autocvar_crosshair_dot_alpha
Definition crosshair.qh:17
string autocvar_crosshair_hitindication_color
Definition crosshair.qh:25
float autocvar_crosshair_chase_playeralpha
Definition crosshair.qh:59
string autocvar_crosshair
Definition crosshair.qh:9
bool autocvar_cl_reticle
Definition crosshair.qh:3
float autocvar_crosshair_alpha
Definition crosshair.qh:11
bool autocvar_crosshair_chase
Definition crosshair.qh:58
float autocvar_crosshair_ring_arc_hot_alpha
Definition crosshair.qh:52
const float DRAWFLAG_NORMAL
const float MOVE_NOMONSTERS
float maxclients
entity trace_ent
float DPCONTENTS_SOLID
const float DRAWFLAG_ADDITIVE
float frametime
const float MOVE_NORMAL
float DPCONTENTS_CORPSE
float DPCONTENTS_BODY
float time
float trace_networkentity
vector trace_endpos
float MOVE_WORLDONLY
float player_localentnum
float intermission
float dphitcontentsmask
#define true
Definition csprogsdefs.qh:5
entity tag_entity
#define entcs_receiver(...)
Definition ent_cs.qh:65
int entcs_GetTeam(int i)
Definition ent_cs.qh:133
vector HUD_Get_Num_Color(float hp, float maxvalue, bool blink)
Definition hud.qc:123
float autocvar__menu_alpha
Definition hud.qh:187
#define FOREACH_ENTITY_CLASS(class, cond, body)
Definition iter.qh:189
noref float vid_conwidth
Definition draw.qh:8
noref float vid_conheight
Definition draw.qh:9
#define STAT(...)
Definition stats.qh:82
void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent)
Definition common.qc:348
const int VIEWLOC_FREEAIM
Definition viewloc.qh:5
entity viewloc
Definition viewloc.qh:13
float bound(float min, float value, float max)
vector stov(string s)
float vlen(vector v)
vector randomvec(void)
float sin(float f)
float min(float f,...)
void strunzone(string s)
float fabs(float f)
float floor(float f)
string strzone(string s)
float max(float f,...)
string string_null
Definition nil.qh:9
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:67
#define NULL
Definition post.qh:14
#define REGISTRY_GET(id, i)
Definition registry.qh:43
bool scoreboard_active
Definition scoreboard.qh:16
vector
Definition self.qh:92
#define strfree(this)
Definition string.qh:59
int myteam
Definition teams.qh:60
const int NUM_SPECTATOR
Definition teams.qh:23
bool teamplay
Definition teams.qh:59
vector w_shotorg
Definition tracing.qh:19
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition vector.qh:8
const vector eZ
Definition vector.qh:46
#define pointinsidebox(point, bmins, bmaxs)
Definition vector.qh:79
#define vec3(_x, _y, _z)
Definition vector.qh:95
vector project_3d_to_2d(vector vec)
Definition view.qc:373
int autocvar_chase_active
Definition view.qh:17
float unaccounted_damage
Definition view.qh:120
vector viewloc_mousepos
Definition view.qh:110
float zoomscript_caught
Definition view.qh:121
bool autocvar_chase_front
Definition view.qh:18
bool autocvar_cl_lockview
Definition view.qh:20
entity viewmodels[MAX_WEAPONSLOTS]
Definition view.qh:108
#define WEP_CVAR(wep, name)
Definition all.qh:321
#define WEP_CVAR_SEC(wep, name)
Definition all.qh:323
const int MAX_WEAPONSLOTS
Definition weapon.qh:16
const int WEP_FLAG_NOTRUEAIM
Definition weapon.qh:226
int max_shot_distance
Definition weapon.qh:203