🚧 This incomplete article needs help! Please submit tips and info by pull requests or issues or contacting a maintainer.

Projectiles are special moving objects shot from weapons and thrown as grenades.

Movement

Projectile movement is simulated during each game tick (smallest unit of simulated time). According to the projectile's velocity and gravity scale, its next position is calculated by the engine and a "trace" line between the two points is tested for collisions.

The trace collision test takes advantage of objects' bounding radii and the collision BSP structures found in model_collision_geometry and scenario_structure_bsp. If any collision is detected, it is handled accordingly (e.g. applying effects or playing sounds).

If no collision is detected, the projectile is moved to its next position at the end of the trace line. The process continues, tick by tick, until the projectile collides, detonates at its maximum range, or is removed at its maximum air or water damage range.

A sufficiently high velocity projectile is essentially hitscan if it can cross a playable space within a single tick, with the game being simulated at 30 ticks per second. Otherwise, ballistic leading will be required to hit a moving target.

Structure and fields

This tag inherits fields from object which are not shown here. See the parent's page for more information. The following information is unique to the projectile tag.

Field Type Comments
projectile flags bitfield
Flag Mask Comments
oriented along velocity 0x1
ai must use ballistic aiming 0x2
detonation max time if attached 0x4
has super combining explosion 0x8
combine initial velocity with parent velocity 0x10
random attached detonation time 0x20
minimum unattached detonation time 0x40
detonation timer starts enum
Option Value Comments
immediately 0x0

The detonation timer begins immediately after the projectile is created, causing it to explode after a fixed length of time.

after first bounce 0x1

Treated identically to when at rest by the game (same code path).

when at rest 0x2

Once the projectile comes to rest, its detonation timer begins. If it becomes in motion again, the timer is not interrupted.

impact noise enum
Option Value Comments
silent 0x0
medium 0x1
loud 0x2
shout 0x3
quiet 0x4
projectile a in enum
Option Value Comments
none 0x0
range remaining 0x1
time remaining 0x2
tracer 0x3
projectile b in enum?
projectile c in enum?
projectile d in enum?
super detonation

TagDependency: effect

ai perception radius float
  • Unit: world units
collision radius float
  • Unit: world units
arming time float
  • Unit: seconds
danger radius float
  • Unit: world units
effect

TagDependency: effect

timer Bounds
  • Unit: seconds
Field Type Comments
min float
max float
minimum velocity float
  • Unit: world units per second
maximum range float
  • Unit: world units
air gravity scale float
air damage range Bounds?
  • Unit: world units

Determines the maximum range that the projectile travels in the air and scales impact damage between its lower and upper bound. When the projectile reaches the maximum range, it disappears (and does not detonate). If detonation at a max range is desired, used the maximum range field above. See the impact damage formula for more information. If these values are set to 0, maximum damage is applied and the projectile continues traveling until colliding or detonating.

water gravity scale float
water damage range Bounds?
  • Unit: world units

Like air damage range, but for underwater environments (determined by the is water flag of fog tags).

initial velocity float
  • Unit: world units per second

Sets the velocity of the projectile upon creation. For grenades thrown by AI, see actor_variant grenade velocity. For player-thrown grenades, see unit grenade velocity.

final velocity float
  • Unit: world units per second
guided angular velocity float
  • Unit: degrees per second
detonation noise enum?
detonation started

TagDependency: effect

flyby sound

TagDependency: sound

attached detonation damage

TagDependency: damage_effect

impact damage

TagDependency: damage_effect

projectile material response Block
  • HEK max count: 33
Field Type Comments
flags bitfield
Flag Mask Comments
cannot be overpenetrated 0x1
default response enum
Option Value Comments
disappear 0x0
detonate 0x1
reflect 0x2
overpenetrate 0x3
attach 0x4
default effect

TagDependency: effect

potential response enum?
potential flags bitfield
Flag Mask Comments
only against units 0x1
potential skip fraction float
  • Min: 0
  • Max: 1
potential between Bounds?
potential and Bounds?
  • Unit: world units per second
potential effect

TagDependency: effect

scale effects by enum
Option Value Comments
damage 0x0
angle 0x1
angular noise float
velocity noise float
  • Unit: world units per second
detonation effect

TagDependency: effect

initial friction float
maximum distance float
parallel friction float
perpendicular friction float

Acknowledgements

Thanks to the following individuals for their research or contributions to this topic:

  • gbMichelle (Movement)
  • Kavawuvi (Invader tag definitions)
  • Mimickal (Explaining bounce timer)
  • MosesOfEgypt (Tag structure research)