Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
tracing.qc File Reference
Include dependency graph for tracing.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void crosshair_trace (entity pl)
void crosshair_trace_plusvisibletriggers (entity pl)
void crosshair_trace_plusvisibletriggers__is_wz (entity pl, bool is_wz)
void fireBullet (entity this,.entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect)
void fireBullet_antilag (entity this,.entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect, bool do_antilag)
void fireBullet_falloff (entity this,.entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float falloff_halflife, float falloff_mindist, float falloff_maxdist, float headshot_multiplier, float force, float falloff_forcehalflife, float dtype, entity tracer_effect, bool do_antilag)
void fireBullet_trace_callback (vector start, vector hit, vector end)
void FireRailgunBullet (entity this,.entity weaponentity, vector start, vector end, float bdamage, bool headshot_notify, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, int deathtype)
bool Headshot (entity targ, entity ent, vector start, vector end)
vector W_CalculateProjectileVelocity (entity actor, vector pvelocity, vector mvelocity, float forceAbsolute)
void W_SetupProjVelocity_Explicit (entity proj, vector dir, vector upDir, float pSpeed, float pUpSpeed, float pZSpeed, float spread, float forceAbsolute)
void W_SetupShot_Dir_ProjectileSize_Range (entity ent,.entity weaponentity, vector s_forward, vector mi, vector ma, float antilag, float recoil, Sound snd, float chan, float maxdamage, float range, int deathtype)
void WarpZone_crosshair_trace (entity pl)
void WarpZone_crosshair_trace_plusvisibletriggers (entity pl)

Function Documentation

◆ crosshair_trace()

void crosshair_trace ( entity pl)

Definition at line 549 of file tracing.qc.

550{
552}
void traceline_antilag(entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
Definition antilag.qc:203
#define ANTILAG_LATENCY(e)
Definition antilag.qh:19
const float MOVE_NORMAL
vector cursor_trace_start
vector cursor_trace_endpos
vector normalize(vector v)
ClientState CS(Client this)
Definition state.qh:47
int max_shot_distance
Definition weapon.qh:203

References ANTILAG_LATENCY, CS(), cursor_trace_endpos, cursor_trace_start, entity(), max_shot_distance, MOVE_NORMAL, normalize(), and traceline_antilag().

Referenced by bumblebee_gunner_frame(), bumblebee_pilot_frame(), CheatCommand(), crosshair_trace_plusvisibletriggers__is_wz(), MUTATOR_HOOKFUNCTION(), racer_frame(), raptor_frame(), spiderbot_frame(), spiderbot_guide_release(), spiderbot_rocket_do(), and spiderbot_rocket_guided().

◆ crosshair_trace_plusvisibletriggers()

void crosshair_trace_plusvisibletriggers ( entity pl)

Definition at line 554 of file tracing.qc.

555{
557}
void crosshair_trace_plusvisibletriggers__is_wz(entity pl, bool is_wz)
Definition tracing.qc:564

References crosshair_trace_plusvisibletriggers__is_wz(), and entity().

Referenced by Drag(), and sandbox_ObjectEdit_Get().

◆ crosshair_trace_plusvisibletriggers__is_wz()

void crosshair_trace_plusvisibletriggers__is_wz ( entity pl,
bool is_wz )

Definition at line 564 of file tracing.qc.

565{
567 {
568 if(it.model != "")
569 {
570 it.solid = SOLID_BSP;
572 }
573 });
574
575 if (is_wz)
577 else
578 crosshair_trace(pl);
579
580 IL_EACH(g_ctrace_changed, true, { it.solid = SOLID_TRIGGER; });
581
583}
const float SOLID_TRIGGER
const float SOLID_BSP
solid
Definition ent_cs.qc:165
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define IL_EACH(this, cond, body)
#define IL_CLEAR(this)
Remove all elements.
#define FOREACH_ENTITY_FLOAT(fld, match, body)
Definition iter.qh:174
void crosshair_trace(entity pl)
Definition tracing.qc:549
void WarpZone_crosshair_trace(entity pl)
Definition tracing.qc:585
IntrusiveList g_ctrace_changed
Definition tracing.qh:110

References crosshair_trace(), entity(), FOREACH_ENTITY_FLOAT, g_ctrace_changed, IL_CLEAR, IL_EACH, IL_PUSH(), solid, SOLID_BSP, SOLID_TRIGGER, and WarpZone_crosshair_trace().

Referenced by crosshair_trace_plusvisibletriggers(), and WarpZone_crosshair_trace_plusvisibletriggers().

◆ fireBullet()

void fireBullet ( entity this,
.entity weaponentity,
vector start,
vector dir,
float spread,
float max_solid_penetration,
float damage,
float headshot_multiplier,
float force,
float dtype,
entity tracer_effect )

Definition at line 544 of file tracing.qc.

545{
546 fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, headshot_multiplier, force, dtype, tracer_effect, true);
547}
int dir
Definition impulse.qc:89
void fireBullet_antilag(entity this,.entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float headshot_multiplier, float force, float dtype, entity tracer_effect, bool do_antilag)
Definition tracing.qc:539

References dir, entity(), fireBullet_antilag(), and vector.

Referenced by spiderbot_frame(), and W_OverkillHeavyMachineGun_Attack_Auto().

◆ fireBullet_antilag()

void fireBullet_antilag ( entity this,
.entity weaponentity,
vector start,
vector dir,
float spread,
float max_solid_penetration,
float damage,
float headshot_multiplier,
float force,
float dtype,
entity tracer_effect,
bool do_antilag )

Definition at line 539 of file tracing.qc.

540{
541 fireBullet_falloff(this, weaponentity, start, dir, spread, max_solid_penetration, damage, 0, 0, 0, headshot_multiplier, force, 0, dtype, tracer_effect, do_antilag);
542}
void fireBullet_falloff(entity this,.entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float falloff_halflife, float falloff_mindist, float falloff_maxdist, float headshot_multiplier, float force, float falloff_forcehalflife, float dtype, entity tracer_effect, bool do_antilag)
Definition tracing.qc:364

References dir, entity(), fireBullet_falloff(), and vector.

Referenced by fireBullet().

◆ fireBullet_falloff()

void fireBullet_falloff ( entity this,
.entity weaponentity,
vector start,
vector dir,
float spread,
float max_solid_penetration,
float damage,
float falloff_halflife,
float falloff_mindist,
float falloff_maxdist,
float headshot_multiplier,
float force,
float falloff_forcehalflife,
float dtype,
entity tracer_effect,
bool do_antilag )

Definition at line 364 of file tracing.qc.

370{
372 vector end = start + dir * max_shot_distance;
373
375 fireBullet_trace_callback_eff = tracer_effect;
376
377 float solid_penetration_fraction = 1;
378 float damage_fraction = 1;
379 float total_damage = 0;
380
381 float lag = ((do_antilag) ? antilag_getlag(this) : 0);
382 if(lag)
383 antilag_takeback_all(this, lag);
384
385 // change shooter to SOLID_BBOX so the shot can hit corpses
386 int oldsolid = this.dphitcontentsmask;
387 if(this)
389
391
392 bool headshot = false; // indicates that one of the hit targets was a headshot
393 for (;;)
394 {
398 start = trace_endpos;
399 entity hit = trace_ent;
400
401 // traced up to max_shot_distance and didn't hit anything at all
402 if (trace_fraction == 1.0)
403 break;
404
405 // When hitting sky, stop.
407 break;
408
409 // can't use noimpact, as we need to pass through walls
410 //if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
411 //break;
412
413 // if we hit "weapclip", bail out
414 //
415 // rationale of this check:
416 //
417 // any shader that is solid, nodraw AND trans is meant to clip weapon
418 // shots and players, but has no other effect!
419 //
420 // if it is not trans, it is caulk and should not have this side effect
421 //
422 // matching shaders:
423 // common/weapclip (intended)
424 // common/noimpact (is supposed to eat projectiles, but is erased anyway)
425 bool is_weapclip = false;
429 is_weapclip = true;
430
431 if(!hit || hit.solid == SOLID_BSP || hit.solid == SOLID_SLIDEBOX)
432 Damage_DamageInfo(start, damage * damage_fraction, 0, 0, max(1, force) * dir * damage_fraction, dtype, hit.species, this);
433
434 // Avoid self-damage (except after going through a warp)
435 // avoid hitting the same entity twice (engine bug)
436 if (hit && hit != WarpZone_trace_forent && hit != fireBullet_last_hit)
437 {
439 yoda = 0;
440 MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity));
441 damage = M_ARGV(4, float);
442 if(headshot_multiplier && Headshot(hit, this, start, end))
443 {
444 damage *= headshot_multiplier;
445 headshot = true;
446 }
447 bool gooddamage = accuracy_isgooddamage(this, hit);
448
449 float dealt_damage = damage * damage_fraction;
450 vector dealt_force = force * dir * damage_fraction;
451
452 if (falloff_halflife || falloff_forcehalflife)
453 {
454 // start, end and trace_endpos seem unreliable for
455 // falloff calculations, using `entity.origin`s instead.
456 // dist is only used to measure distance between shooter
457 // and target entities and do math based on the distance
458 // target's location = hit.origin
459 // shooter's location = this.origin
460 float dist = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, hit.origin) - this.origin);
461
462 if (falloff_halflife)
463 dealt_damage *= ExponentialFalloff(falloff_mindist, falloff_maxdist, falloff_halflife, dist);
464
465 if (falloff_forcehalflife)
466 dealt_force *= ExponentialFalloff(falloff_mindist, falloff_maxdist, falloff_forcehalflife, dist);
467 }
468
469 Damage(hit, this, this, dealt_damage, dtype, weaponentity, start, dealt_force);
470
471 // calculate hits for ballistic weapons
472 if(gooddamage)
473 {
474 // do not exceed 100%
475 float added_damage = min(damage - total_damage, damage * damage_fraction);
476 total_damage += damage * damage_fraction;
477 accuracy_add(this, this.(weaponentity).m_weapon, 0, added_damage, 0); // add to hit
478 }
479 }
480
481 if (is_weapclip && !autocvar_g_ballistics_penetrate_clips)
482 break;
483
484 // go through solid!
485 // outside the world? forget it
486 if(start.x > world.maxs.x || start.y > world.maxs.y || start.z > world.maxs.z || start.x < world.mins.x || start.y < world.mins.y || start.z < world.mins.z)
487 break;
488
489 float maxdist;
490 entity hitstore = IS_PLAYER(hit) ? PS(hit) : hit;
491 if(max_solid_penetration < 0)
492 break;
493 else if(hitstore.ballistics_density < -1)
494 break; // -2: no solid penetration, ever
495 else if(hitstore.ballistics_density < 0)
496 maxdist = vlen(hit.maxs - hit.mins) + 1; // -1: infinite travel distance
497 else if(hitstore.ballistics_density == 0)
498 maxdist = max_solid_penetration * solid_penetration_fraction;
499 else
500 maxdist = max_solid_penetration * solid_penetration_fraction / hitstore.ballistics_density;
501
503 break;
504
505 // move the entity along its velocity until it's out of solid, then let it resume
506 // The previously hit entity is ignored here!
507 traceline_inverted (start, start + dir * maxdist, MOVE_NORMAL, WarpZone_trace_forent, true, hit);
508 if(trace_fraction == 1) // 1: we never got out of solid
509 break;
510
511 float dist_taken = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - start));
512 float fraction_used_of_what_is_left = dist_taken / maxdist;
513 solid_penetration_fraction -= solid_penetration_fraction * fraction_used_of_what_is_left;
514 solid_penetration_fraction = max(solid_penetration_fraction, 0);
515 damage_fraction = pow(solid_penetration_fraction, autocvar_g_ballistics_solidpenetration_exponent);
516
517 // Only show effect when going through a player (invisible otherwise)
518 if (hit && (hit.solid != SOLID_BSP))
519 if(vdist(trace_endpos - start, >, 4))
521
522 start = trace_endpos;
523
524 if(hit.solid == SOLID_BSP)
525 Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -damage_fraction, dtype, 0, this);
526 }
527
528 if(headshot)
529 Send_Notification(NOTIF_ONE, this, MSG_ANNCE, ANNCE_HEADSHOT);
530
531 if(lag)
533
534 // restore shooter solid type
535 if(this)
536 this.dphitcontentsmask = oldsolid;
537}
void accuracy_add(entity this, Weapon w, float fired, float hit, float real)
update accuracy stats
Definition accuracy.qc:102
bool accuracy_isgooddamage(entity attacker, entity targ)
does this damage count towards accuracy stats?
Definition accuracy.qc:133
void antilag_takeback_all(entity ignore, float lag)
Definition antilag.qc:125
float antilag_getlag(entity e)
Definition antilag.qc:151
void antilag_restore_all(entity ignore)
Definition antilag.qc:138
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
vector W_CalculateSpread(vector dir, float spread, int spread_style, bool must_normalize)
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define M_ARGV(x, type)
Definition events.qh:17
#define IS_PLAYER(s)
Definition player.qh:243
void traceline_inverted(vector v1, vector v2, float nomonsters, entity forent, float stopatentity, entity ignorestopatentity)
Definition util.qc:101
float Q3SURFACEFLAG_SKY
const float SOLID_SLIDEBOX
float trace_dphitcontents
float Q3SURFACEFLAG_NONSOLID
entity trace_ent
float DPCONTENTS_SOLID
float Q3SURFACEFLAG_NODRAW
float DPCONTENTS_CORPSE
float DPCONTENTS_BODY
float DPCONTENTS_OPAQUE
vector trace_endpos
float trace_dphitq3surfaceflags
float trace_fraction
float dphitcontentsmask
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition damage.qc:503
float yoda
Definition damage.qh:48
void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner)
#define trailparticles(e, effect, org, vel)
Definition effect.qh:9
#define pow(a, b)
Definition _all.inc:67
void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
Definition common.qc:212
vector WarpZone_TransformVelocity(entity wz, vector v)
Definition common.qc:514
vector WarpZone_UnTransformOrigin(entity wz, vector v)
Definition common.qc:545
vector WarpZone_TransformOrigin(entity wz, vector v)
Definition common.qc:509
entity WarpZone_trace_transform
Definition common.qh:37
entity WarpZone_trace_forent
Definition common.qh:34
ERASEABLE float ExponentialFalloff(float mindist, float maxdist, float halflifedist, float d)
Definition math.qh:241
float vlen(vector v)
float min(float f,...)
float max(float f,...)
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
#define NULL
Definition post.qh:14
#define world
Definition post.qh:15
vector
Definition self.qh:92
#define PS(this)
Definition state.qh:18
bool Headshot(entity targ, entity ent, vector start, vector end)
Definition tracing.qc:227
void fireBullet_trace_callback(vector start, vector hit, vector end)
Definition tracing.qc:356
float autocvar_g_ballistics_mindistance
Definition tracing.qh:8
int autocvar_g_hitscan_spread_style
Definition tracing.qh:15
float autocvar_g_ballistics_solidpenetration_exponent
Definition tracing.qh:10
bool autocvar_g_ballistics_penetrate_clips
Definition tracing.qh:9
entity fireBullet_trace_callback_eff
Definition tracing.qh:92
entity fireBullet_last_hit
Definition tracing.qh:93
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition vector.qh:8
Weapon m_weapon
Definition wepent.qh:26

References accuracy_add(), accuracy_isgooddamage(), antilag_getlag(), antilag_restore_all(), antilag_takeback_all(), autocvar_g_ballistics_mindistance, autocvar_g_ballistics_penetrate_clips, autocvar_g_ballistics_solidpenetration_exponent, autocvar_g_hitscan_spread_style, Damage(), Damage_DamageInfo(), dir, DPCONTENTS_BODY, DPCONTENTS_CORPSE, DPCONTENTS_OPAQUE, DPCONTENTS_SOLID, dphitcontentsmask, entity(), ExponentialFalloff(), fireBullet_last_hit, fireBullet_trace_callback(), fireBullet_trace_callback_eff, Headshot(), IS_PLAYER, M_ARGV, m_weapon, max(), max_shot_distance, min(), MOVE_NORMAL, MUTATOR_CALLHOOK, normalize(), NULL, pow, PS, Q3SURFACEFLAG_NODRAW, Q3SURFACEFLAG_NONSOLID, Q3SURFACEFLAG_SKY, Send_Notification(), SOLID_BSP, SOLID_SLIDEBOX, trace_dphitcontents, trace_dphitq3surfaceflags, trace_endpos, trace_ent, trace_fraction, traceline_inverted(), trailparticles, vdist, vector, vlen(), W_CalculateSpread(), WarpZone_trace_forent, WarpZone_trace_transform, WarpZone_TraceBox_ThroughZone(), WarpZone_TransformOrigin(), WarpZone_TransformVelocity(), WarpZone_UnTransformOrigin(), world, and yoda.

Referenced by fireBullet_antilag(), W_MachineGun_Attack(), W_MachineGun_Attack_Auto(), W_MachineGun_Attack_Burst(), W_OverkillMachineGun_Attack_Auto(), W_Rifle_FireBullet(), and W_Shotgun_Attack().

◆ fireBullet_trace_callback()

void fireBullet_trace_callback ( vector start,
vector hit,
vector end )

Definition at line 356 of file tracing.qc.

357{
358 if(vdist(hit - start, >, 16))
362}

References fireBullet_last_hit, fireBullet_trace_callback_eff, NULL, trailparticles, vdist, vector, and WarpZone_trace_forent.

Referenced by fireBullet_falloff().

◆ FireRailgunBullet()

void FireRailgunBullet ( entity this,
.entity weaponentity,
vector start,
vector end,
float bdamage,
bool headshot_notify,
float bforce,
float mindist,
float maxdist,
float halflifedist,
float forcehalflifedist,
int deathtype )

Definition at line 238 of file tracing.qc.

239{
240 vector dir = normalize(end - start);
241 vector force = dir * bforce;
242
243 // go a little bit into the wall because we need to hit this wall later
244 end = end + dir;
245
246 float totaldmg = 0;
247 bool headshot = false; // indicates that one of the targets hit was a headshot
248
249 // trace multiple times until we hit a wall, each obstacle will be made
250 // non-solid so we can hit the next, while doing this we spawn effects and
251 // note down which entities were hit so we can damage them later
252 entity o = this;
253 while (1)
254 {
255 if(CS(this).antilag_debug)
256 WarpZone_traceline_antilag (this, start, end, false, o, CS(this).antilag_debug);
257 else
258 WarpZone_traceline_antilag (this, start, end, false, o, ANTILAG_LATENCY(this));
260 {
261 o = NULL;
262 continue;
263 }
264
265 if(trace_ent.solid == SOLID_BSP || trace_ent.solid == SOLID_SLIDEBOX)
266 Damage_DamageInfo(trace_endpos, bdamage, 0, 0, force, deathtype, trace_ent.species, this);
267
268 // if it is NULL we can't hurt it so stop now
269 if (trace_ent == NULL || trace_fraction == 1)
270 break;
271
272 if(headshot_notify && !headshot && Headshot(trace_ent, this, start, end))
273 headshot = true;
274
275 // make the entity non-solid so we can hit the next one
277 trace_ent.railgunhit = true;
278 trace_ent.railgunhitloc = end;
279 trace_ent.railgunhitsolidbackup = trace_ent.solid;
282
283 // stop if this is a wall
284 if (trace_ent.solid == SOLID_BSP)
285 break;
286
287 // make the entity non-solid
288 trace_ent.solid = SOLID_NOT;
289 }
290
291 vector endpoint = trace_endpos;
292 entity endent = trace_ent;
293 float endq3surfaceflags = trace_dphitq3surfaceflags;
294
295 // find all the entities the railgun hit and restore their solid state
296 IL_EACH(g_railgunhit, it.railgunhit,
297 {
298 it.solid = it.railgunhitsolidbackup;
299 });
300
301 // Find all players the beam passed close by (even those hit)
302 float length = vlen(endpoint - start);
303 entity pseudoprojectile = NULL;
304 FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this, {
305 // not when spectating the shooter
306 if (IS_SPEC(it) && it.enemy == this) continue;
307
308 // nearest point on the beam
309 vector beampos = start + dir * bound(0, (it.origin - start) * dir, length);
310
311 if(!pseudoprojectile)
312 pseudoprojectile = new(pseudoprojectile); // we need this so the sound uses the "entchannel4" volume
313
314 msg_entity = it;
315 // we want this to be very loud when close but fall off quickly -> using max base volume and high attenuation
316 soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, SND(NEXWHOOSH_RANDOM()), VOL_BASEVOICE, ATTEN_IDLE, 0);
317 });
318 if(pseudoprojectile)
319 delete(pseudoprojectile);
320
321 // find all the entities the railgun hit and hurt them
322 IL_EACH(g_railgunhit, it.railgunhit,
323 {
324 // removal from the list is handled below
325
326 float foff = ExponentialFalloff(mindist, maxdist, halflifedist, it.railgundistance);
327 float ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, it.railgundistance);
328
329 if(accuracy_isgooddamage(this, it))
330 totaldmg += bdamage * foff;
331
332 // apply the damage
333 if (it.takedamage)
334 Damage(it, this, this, bdamage * foff, deathtype, weaponentity, it.railgunhitloc, it.railgunforce * ffs);
335
336 it.railgunhitloc = '0 0 0';
337 it.railgunhitsolidbackup = SOLID_NOT;
338 it.railgunhit = false;
339 it.railgundistance = 0;
340 });
341
343
344 if(headshot)
345 Send_Notification(NOTIF_ONE, this, MSG_ANNCE, ANNCE_HEADSHOT);
346
347 // calculate hits and fired shots for hitscan
348 if(this.(weaponentity))
349 accuracy_add(this, this.(weaponentity).m_weapon, 0, min(bdamage, totaldmg), 0); // add to hit
350
351 trace_endpos = endpoint;
352 trace_ent = endent;
353 trace_dphitq3surfaceflags = endq3surfaceflags;
354}
float antilag_debug
Definition antilag.qc:19
void WarpZone_traceline_antilag(entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
Definition antilag.qc:221
const float SOLID_NOT
entity WarpZone_trace_firstzone
Definition common.qh:38
float MSG_ONE
Definition menudefs.qc:56
float bound(float min, float value, float max)
entity msg_entity
Definition progsdefs.qc:63
const float VOL_BASEVOICE
Definition sound.qh:37
const int CH_SHOTS
Definition sound.qh:14
const float ATTEN_IDLE
Definition sound.qh:32
void soundtoat(int to, entity e, vector o, int chan, string samp, float vol, float attenu, float _pitch)
Definition all.qc:39
#define SND(id)
Definition all.qh:35
IntrusiveList g_railgunhit
Definition tracing.qh:85
#define IS_SPEC(v)
Definition utils.qh:10
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50

References accuracy_add(), antilag_debug, ANTILAG_LATENCY, ATTEN_IDLE, bound(), CH_SHOTS, CS(), Damage_DamageInfo(), dir, entity(), FOREACH_CLIENT, g_railgunhit, Headshot(), IL_CLEAR, IL_EACH, IL_PUSH(), IS_REAL_CLIENT, IS_SPEC, m_weapon, min(), msg_entity, MSG_ONE, normalize(), NULL, Send_Notification(), SND, SOLID_BSP, SOLID_NOT, SOLID_SLIDEBOX, soundtoat(), trace_dphitq3surfaceflags, trace_endpos, trace_ent, trace_fraction, vector, vlen(), VOL_BASEVOICE, WarpZone_trace_firstzone, WarpZone_trace_transform, WarpZone_traceline_antilag(), WarpZone_TransformVelocity(), and WarpZone_UnTransformOrigin().

Referenced by W_OverkillNex_Attack(), W_Vaporizer_Attack(), and W_Vortex_Attack().

◆ Headshot()

bool Headshot ( entity targ,
entity ent,
vector start,
vector end )

Definition at line 227 of file tracing.qc.

228{
229 if(!IS_PLAYER(targ) || IS_DEAD(targ) || STAT(FROZEN, targ) || !targ.takedamage)
230 return false;
231 vector org = targ.origin; // antilag is already taken into consideration //antilag_takebackorigin(targ, CS(targ), time - ANTILAG_LATENCY(ent));
232 vector headmins = org + '0.6 0 0' * targ.mins_x + '0 0.6 0' * targ.mins_y + '0 0 1' * (1.3 * targ.view_ofs_z - 0.3 * targ.maxs_z);
233 vector headmaxs = org + '0.6 0 0' * targ.maxs_x + '0 0.6 0' * targ.maxs_y + '0 0 1' * targ.maxs_z;
234
235 return trace_hits_box(start, end, headmins, headmaxs);
236}
#define IS_DEAD(s)
Definition player.qh:245
float trace_hits_box(vector start, vector end, vector thmi, vector thma)
Definition util.qc:2123
#define STAT(...)
Definition stats.qh:82
vector org
Definition self.qh:92

References entity(), IS_DEAD, IS_PLAYER, org, STAT, trace_hits_box(), and vector.

Referenced by fireBullet_falloff(), and FireRailgunBullet().

◆ W_CalculateProjectileVelocity()

vector W_CalculateProjectileVelocity ( entity actor,
vector pvelocity,
vector mvelocity,
float forceAbsolute )

Definition at line 176 of file tracing.qc.

177{
178 vector mdirection;
179 float mspeed;
180 vector outvelocity;
181
182 mvelocity = mvelocity * W_WeaponSpeedFactor(actor);
183
184 mdirection = normalize(mvelocity);
185 mspeed = vlen(mvelocity);
186
188
189 return outvelocity;
190}
vector get_shotvelocity(vector myvel, vector mydir, float spd, float newton_style, float mi, float ma)
Definition util.qc:1196
float autocvar_g_projectiles_newton_style_2_maxfactor
Definition tracing.qh:12
int autocvar_g_projectiles_newton_style
Definition tracing.qh:11
float autocvar_g_projectiles_newton_style_2_minfactor
Definition tracing.qh:13
float W_WeaponSpeedFactor(entity this)

References autocvar_g_projectiles_newton_style, autocvar_g_projectiles_newton_style_2_maxfactor, autocvar_g_projectiles_newton_style_2_minfactor, entity(), get_shotvelocity(), normalize(), vector, vlen(), and W_WeaponSpeedFactor().

Referenced by ctf_Handle_Throw(), IMPULSE(), kh_Key_DropAll(), kh_Key_DropOne(), powerups_DropItem(), toss_nade(), W_Nexball_Attack(), W_RocketMinsta_Attack(), and W_SetupProjVelocity_Explicit().

◆ W_SetupProjVelocity_Explicit()

void W_SetupProjVelocity_Explicit ( entity proj,
vector dir,
vector upDir,
float pSpeed,
float pUpSpeed,
float pZSpeed,
float spread,
float forceAbsolute )

Definition at line 192 of file tracing.qc.

193{
194 if(proj.owner == NULL)
195 error("Unowned missile");
196
197 dir = dir + upDir * (pUpSpeed / pSpeed);
198 dir.z += pZSpeed / pSpeed;
199 pSpeed *= vlen(dir);
200 dir = normalize(dir);
201
202 #if 0
203 if(autocvar_g_projectiles_spread_style != mspercallsstyle)
204 {
205 mspercallsum = mspercallcount = 0;
206 mspercallsstyle = autocvar_g_projectiles_spread_style;
207 }
208 mspercallsum -= gettime(GETTIME_HIRES);
209 #endif
210
212
213 #if 0
214 mspercallsum += gettime(GETTIME_HIRES);
215 mspercallcount += 1;
216 LOG_INFO("avg: ", ftos(mspercallcount / mspercallsum), " per sec");
217 #endif
218
219 proj.velocity = W_CalculateProjectileVelocity(proj.owner, proj.owner.velocity, pSpeed * dir, forceAbsolute);
220}
float GETTIME_HIRES
#define LOG_INFO(...)
Definition log.qh:65
float gettime(void)
string ftos(float f)
#define error
Definition pre.qh:6
vector W_CalculateProjectileVelocity(entity actor, vector pvelocity, vector mvelocity, float forceAbsolute)
Definition tracing.qc:176
int autocvar_g_projectiles_spread_style
Definition tracing.qh:14

References autocvar_g_projectiles_spread_style, dir, entity(), error, ftos(), gettime(), GETTIME_HIRES, LOG_INFO, normalize(), NULL, vector, vlen(), W_CalculateProjectileVelocity(), and W_CalculateSpread().

Referenced by FireGrapplingHook(), M_Golem_Attack_Lightning(), M_Spider_Attack_Web(), W_Blaster_Attack(), W_Crylink_Attack(), W_Crylink_Attack2(), and W_Hagar_Attack2_Load_Release().

◆ W_SetupShot_Dir_ProjectileSize_Range()

void W_SetupShot_Dir_ProjectileSize_Range ( entity ent,
.entity weaponentity,
vector s_forward,
vector mi,
vector ma,
float antilag,
float recoil,
Sound snd,
float chan,
float maxdamage,
float range,
int deathtype )

Definition at line 24 of file tracing.qc.

25{
26 TC(Sound, snd);
27 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?
28 float oldsolid = ent.dphitcontentsmask;
29 Weapon wep = DEATH_WEAPONOF(deathtype);
30 if(!IS_CLIENT(ent))
31 antilag = false; // no antilag for non-clients!
33 {
34 // This is the reason rifle, MG, OKMG and other fireBullet weapons don't hit the crosshair when shooting at walls.
35 // This is intentional, otherwise if you stand too close to a (glass) wall and attempt to shoot an enemy through it,
36 // trueaim will cause the shot to hit the wall exactly but then miss the enemy (unless shooting from eye/center).
37 // TODO for fireBullet, find how far the shot will penetrate and aim at that
38 // for fireRailgunbullet, find the farthest target and aim at that
39 // this will avoid issues when another player is passing in front of you when you shoot
40 // (currently such a shot will hit them but then miss the original target)
41 ent.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE;
42 }
43 else
44 ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
45 if(antilag)
46 WarpZone_traceline_antilag(NULL, ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * range, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
47 // passing NULL, because we do NOT want it to touch dphitcontentsmask
48 else
49 WarpZone_TraceLine(ent.origin + ent.view_ofs, ent.origin + ent.view_ofs + s_forward * range, MOVE_NOMONSTERS, ent);
50 ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
51
52 vector forward, right, up;
53 forward = v_forward;
54 right = v_right;
55 up = v_up;
57 v_forward = forward;
58 v_right = right;
59 v_up = up;
60
61 // un-adjust trueaim if shotend is too close
62 if(vdist(w_shotend - (ent.origin + ent.view_ofs), <, autocvar_g_trueaim_minrange))
63 w_shotend = ent.origin + ent.view_ofs + s_forward * autocvar_g_trueaim_minrange;
64
65 // track max damage
66 if (IS_PLAYER(ent) && accuracy_canbegooddamage(ent))
67 accuracy_add(ent, wep, maxdamage, 0, 0); // add to fired
68
69 if(IS_PLAYER(ent))
70 W_HitPlotAnalysis(ent, wep, forward, right, up);
71
72 // read shot origin offset, like g_shootfromcenter
73 // set in CL_WeaponEntity_SetModel (not a CSQC exclusive function...)
74 vector md = ent.(weaponentity).movedir;
75 //print(sprintf("offset of %s: %v\n", ent.(weaponentity).m_weapon.netname, md));
76 vector dv = right * -md.y + up * md.z;
77
78 w_shotorg = ent.origin + ent.view_ofs;
79
80 // move the shotorg sideways and vertically as much as requested if possible
81 if(antilag)
82 {
83 if(CS(ent).antilag_debug)
84 tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, CS(ent).antilag_debug);
85 else
86 tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
87 }
88 else
89 tracebox(w_shotorg, mi, ma, w_shotorg + dv, MOVE_NORMAL, ent);
91
92 // now move the shotorg forward as much as requested if possible
93 if(antilag)
94 {
95 if(CS(ent).antilag_debug)
96 tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug);
97 else
98 tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
99 }
100 else
101 tracebox(w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent);
102 w_shotorg = trace_endpos - forward * nudge;
103
104 //print(sprintf("w_shotorg %v\n\n", w_shotorg - (ent.origin + ent.view_ofs)));
105
106 // calculate the shotdir from the chosen shotorg
107 if(W_DualWielding(ent))
108 w_shotdir = s_forward;
109 else
111
112 //vector prevdir = w_shotdir;
113 //vector prevorg = w_shotorg;
114 //vector prevend = w_shotend;
115
116 if (antilag)
117 if (!CS_CVAR(ent).cvar_cl_noantilag)
118 {
119 if (autocvar_g_antilag == 1) // switch to "ghost" if not hitting original
120 {
121 traceline(w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent);
122 if (!trace_ent.takedamage)
123 {
125 if (trace_ent.takedamage && IS_PLAYER(trace_ent))
126 {
127 entity e;
128 e = trace_ent;
129 traceline(w_shotorg, e.origin, MOVE_NORMAL, ent);
130 if(trace_ent == e)
132 }
133 }
134 }
135 else if(autocvar_g_antilag == 3) // client side hitscan
136 {
137 // this part MUST use prydon cursor
138 if (CS(ent).cursor_trace_ent) // client was aiming at someone
139 if (CS(ent).cursor_trace_ent != ent) // just to make sure
140 if (CS(ent).cursor_trace_ent.takedamage) // and that person is killable
141 if (IS_PLAYER(CS(ent).cursor_trace_ent)) // and actually a player
142 {
143 // verify that the shot would miss without antilag
144 // (avoids an issue where guns would always shoot at their origin)
145 traceline(w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent);
146 if (!trace_ent.takedamage)
147 {
148 // verify that the shot would hit if altered
149 traceline(w_shotorg, CS(ent).cursor_trace_ent.origin, MOVE_NORMAL, ent);
150 if (trace_ent == CS(ent).cursor_trace_ent)
152 else
153 LOG_INFO("antilag fail");
154 }
155 }
156 }
157 }
158
159 ent.dphitcontentsmask = oldsolid; // restore solid type (generally SOLID_SLIDEBOX)
160
162 ent.punchangle_x = recoil * -1;
163
164 if (snd != SND_Null) {
165 sound(ent, chan, snd, (W_DualWielding(ent) ? VOL_BASE * 0.7 : VOL_BASE), ATTN_NORM);
167 }
168
169 // nudge w_shotend so a trace to w_shotend hits
171 //if(w_shotend != prevend) { printf("SERVER: shotEND differs: %s - %s\n", vtos(w_shotend), vtos(prevend)); }
172 //if(w_shotorg != prevorg) { printf("SERVER: shotORG differs: %s - %s\n", vtos(w_shotorg), vtos(prevorg)); }
173 //if(w_shotdir != prevdir) { printf("SERVER: shotDIR differs: %s - %s\n", vtos(w_shotdir), vtos(prevdir)); }
174}
bool accuracy_canbegooddamage(entity attacker)
if damage were to occur, would accuracy_isgooddamage be able to return true?
Definition accuracy.qc:154
void tracebox_antilag(entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
Definition antilag.qc:210
void traceline_antilag_force(entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
Definition antilag.qc:199
int autocvar_g_antilag
Definition antilag.qh:3
fields which are explicitly/manually set are marked with "M", fields set automatically are marked wit...
Definition weapon.qh:44
int spawnflags
M: flags : WEPSPAWNFLAG_... combined.
Definition weapon.qh:55
#define IS_CLIENT(s)
Definition player.qh:242
vector v_up
const float MOVE_NOMONSTERS
vector v_right
vector v_forward
const float ATTN_NORM
#define DEATH_WEAPONOF(t)
Definition all.qh:45
entity cursor_trace_ent
void W_HitPlotAnalysis(entity player, entity wep, vector screenforward, vector screenright, vector screenup)
Definition hitplot.qc:58
#define TC(T, sym)
Definition _all.inc:82
void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent)
Definition common.qc:348
vector movedir
Definition viewloc.qh:18
void W_PlayStrengthSound(entity player)
Definition common.qc:40
bool W_DualWielding(entity player)
Definition common.qc:20
const float VOL_BASE
Definition sound.qh:36
#define sound(e, c, s, v, a)
Definition sound.qh:52
#define CS_CVAR(this)
Definition state.qh:51
float autocvar_g_trueaim_minrange
Definition tracing.qh:17
bool autocvar_g_norecoil
Definition tracing.qh:16
vector w_shotdir
Definition tracing.qh:20
vector w_shotorg
Definition tracing.qh:19
vector w_shotend
Definition tracing.qh:21
const int WEP_FLAG_PENETRATEWALLS
Definition weapon.qh:224

References accuracy_add(), accuracy_canbegooddamage(), antilag_debug, ANTILAG_LATENCY, ATTN_NORM, autocvar_g_antilag, autocvar_g_norecoil, autocvar_g_trueaim_minrange, CS(), CS_CVAR, cursor_trace_ent, DEATH_WEAPONOF, DPCONTENTS_BODY, DPCONTENTS_CORPSE, DPCONTENTS_SOLID, entity(), IS_CLIENT, IS_PLAYER, LOG_INFO, MOVE_NOMONSTERS, MOVE_NORMAL, movedir, normalize(), NULL, sound, Weapon::spawnflags, TC, trace_endpos, trace_ent, tracebox_antilag(), traceline_antilag_force(), v_forward, v_right, v_up, vdist, vector, VOL_BASE, W_DualWielding(), W_HitPlotAnalysis(), W_PlayStrengthSound(), w_shotdir, w_shotend, w_shotorg, WarpZone_trace_transform, WarpZone_TraceLine(), WarpZone_traceline_antilag(), WarpZone_UnTransformOrigin(), and WEP_FLAG_PENETRATEWALLS.

◆ WarpZone_crosshair_trace()

◆ WarpZone_crosshair_trace_plusvisibletriggers()

void WarpZone_crosshair_trace_plusvisibletriggers ( entity pl)

Definition at line 559 of file tracing.qc.

References crosshair_trace_plusvisibletriggers__is_wz(), and entity().

Referenced by formatmessage(), IMPULSE(), and show_entnum().