CS2 mechanicVERIFIED + CAPTURE-EXACT on current buildUpdated 2026-07-21
CS2 grenade bounce: exactly 0.45× on every surface
A CS2 grenade leaves every bounce at exactly 0.45× the speed it arrived with, and both components scale: v⁺ = 0.45 · reflect(v⁻, n). There is no separate normal and tangential restitution, and there is no per-surface elasticity table — concrete, wood, metal and dirt all return 0.45. The ratio was measured on 983 bounces across four maps and is now reproduced tick-exactly against controlled captures on the current build.
Derived from 983 bounces in 2026 tournament demos on four maps; confirmed by 90 controlled captures on CS2 build 1.41.6.8/10847 (de_mirage and de_dust2).
Bounce is the mechanic where a plausible-looking measurement is easiest to get wrong. Old demos update entities only every few ticks, so the tick a grenade actually touched a wall is rarely sampled, and the speed ratio you compute from the nearest samples is biased by however much flight got folded into the pair. An earlier pass on coarse-cadence data produced a per-surface reading of about 0.53 for concrete blocks, and it was recorded as UNRESOLVED rather than shipped.
On current-build demos, which update every tick, the same estimator run over 983 bounces converges: 0.4500 on the normal component and 0.4517 on the tangential. Two components agreeing to within the noise is the actual finding — it says CS2 scales the whole reflected vector by one number rather than treating friction and restitution separately.
Then the exact response law was transcribed from the game binary and replayed against 90 controlled captures: the sweep stops 1/32 u short of contact, the backoff is 2·dot plus that same 1/32, and the ground branches are separate. Replay is tick-exact — median residual zero, bounce counts and surface normals matching case by case. That is what retires the 0.53: the resolver applies a flat 0.45 with no surface term, and the flat law replays every surface the capture matrix touches, so the old figure was coarse-cadence noise rather than a material property.
The rest transition was the last piece. A grenade does not roll to a stop by friction; a collision on a qualifying normal whose post-clip speed is below 20 u/s zeroes the velocity and switches the entity to MOVETYPE_NONE on that same tick. All 85 recorded transitions replay on the exact tick, and walls never rest — 55 low-speed wall bounces kept moving, which is what pins the normal to a ground-facing one.
Every fact on this page, with its tier
Grenade bounce law: v⁺ = 0.45 · reflect(v⁻, n) — BOTH components scale by 0.45 (full native response: sweep stop 1/32 u short, backoff = 2·dot + 1/32, ground branches)
Value
0.45
Confidence tier
VERIFIED + CAPTURE-EXACT on current build
How it was derived
Ratio derived over 983 bounces on 4 maps, then the full native response transcribed from the game binary and replayed against controlled current-build captures.
Evidence
Normal restitution 0.4500, tangential 0.4517; the 2026-07-21 landing-parity gate replays 90 captures tick-exact (median residual 0/bit-identical, clean max 5.1e-3 u), bounce counts and normals matched.
REFUTED for grenades on captured surfaces (was UNRESOLVED)
How it was derived
The current-build resolver was read directly and applies no surface term; the controlled replay then covers mirage corridor and floor, dust2 concrete and rock walls, floors and ceilings.
Evidence
Replay is tick-exact with flat 0.45 across every surface the matrix hits; the old ~0.53 was 2023 coarse-cadence noise. Surfaces outside the matrix inherit the no-override reading.
Smoke rest transition: a COLLISION on a qualifying normal (n.z > 0.1) whose post-clip-scaled speed is under 20 u/s zeroes velocity and sets MOVETYPE_NONE that same tick
A 90-case controlled throw matrix recorded on the live build and replayed through the float32 core, with every above-floor case classified rather than averaged away.
Evidence
Median residual 0, clean max 5.1e-3 u; all rest transitions on the exact tick; release law floors 1.5e-5 u/s and 0.014°.
Open questions — what is not known
The 0.1 normal gate is exact in code but only loosely bounded by data.
The captures bound it to somewhere in (0.0, 0.9614); the precise 0.1 comes from reading the binary, because no capture produced a low-speed contact on a normal between those bounds.
The contact-stop epsilon varies.
One classified capture exception is the native's own variable 0 to 3.3e-3 u contact-stop epsilon — small, real, and not modelled.
A degenerate second rest path exists and is unimplemented.
A grenade spawned inside solid geometry sleeps after nine zero-velocity ticks. It is unreachable from a real throw, so it is documented rather than ported.
Last updated 2026-07-21 — the date of the measurement, not of this
page's rendering. What the confidence tiers mean. Memorin is not affiliated
with or endorsed by Valve; Counter-Strike 2 is a trademark of Valve Corporation.