Footstep sounds in Neotokyo Rebuild were inconsistent: crouch walking made noise, looking around while crouch walking made noise, a stray step played when dropping into a crouch, crouched steps played louder than running, and other players heard different steps than the stepping player. This paper traces each case to its cause across ten instrumented play passes, reviews how the current rule came about, and proposes one footstep formula that every client evaluates the same way, without changing movement. Sections 1 and 2 state the problem and the proposal; sections 3 to 5 add the per-change breakdown, the supporting data and the references.
Footsteps sounded inconsistent compared with other games in the genre. What a player heard from their own feet, what the server sent, and what other players heard often disagreed. Loudness was inconsistent too: some quieter ways of moving played louder steps than running.
Each footstep is decided separately in three places. Each one runs UpdateStepSound, then IsMakingFootstepSounds decides whether the step is silent. The marks show where each defect sits.
PlayerMove runs the step timerPlayStepSound sends to players who can hear the stepper but cannot see them originC_BasePlayer::Simulate estimates speed from position updatesEvery audible step plays the surface's quiet or loud volume, picked by comparing speed with a fixed run speed: 80 u/s crouched, 220 u/s standing. Crouched steps are then scaled to 65%. Those two numbers come from the Source SDK, which crouches at a third of run speed. NEO's speeds sit on the wrong side of both.
| Movement | Expected | Master, concrete | Why |
|---|---|---|---|
| Walk, aim with +walk | silent | silent | silent movement threshold |
| Crouch walk | silent | 0.325 | above 80, so the loud volume, at 65% |
| Run | quiet | 0.2 | under 220, so the quiet volume |
| Crouch sprint | between a run and a sprint | 0.325 | above 80, so the loud volume, at 65% |
| Sprint, recon with a 0.85 weapon | loudest | 0.5 | 229.5, above 220 |
| Sprint, recon with a slower weapon | loudest | 0.2 | 216 with a 0.8 weapon, less with the rifles, under 220 |
| Sprint, assault | loudest | 0.2 | 217.6 at most, with a 0.85 weapon, under 220 |
So a crouch walk was about 1.6 times as loud as a run, and a sprint was only loud for a recon carrying a 0.85 weapon. Support cannot sprint. Section 3.5 has the fix, and 4.3 the test log counts.
The BALC is the only weapon with no slowdown (1.0), and only the Juggernaut carries it. A Juggernaut sprint reaches 256 u/s and was loud on master. This paper leaves the Juggernaut mode out of the sprint figures; it will be reviewed separately.
The first row is engine behavior inherited from the Source SDK. Each later step was a reasonable answer to the problem in front of the team at the time. Together they explain why master's rule depends on the aim and walk keys, and why some questions were deliberately left open.
| When | Decision | Goal | Left open |
|---|---|---|---|
| 2019-05 SDK import, 4508d865 |
Inherit the SDK step volume rule. A step is quiet below a run speed of 80 u/s crouched or 220 u/s standing and loud above it, and crouched steps are scaled to 65% (fvol *= 0.65). |
Stock engine behavior. The SDK crouches at a third of run speed (about 63 u/s), so its crouched steps stayed under 80 and were the quietest steps. | Never retuned. NEO crouches at 0.75 of run speed, so every crouch walk passed 80 and played at 0.325, louder than a standing run at 0.2. |
| 2024-06 #275, #363 |
Follow the original Neotokyo: footsteps decided by speed alone, above 90 u/s standing and 60 u/s crouched. | Parity with the original game, after a report that crouching still made footsteps. | Nothing at the time. |
| 2025-02 #877 |
Implement those limits: standing above 90, crouched above 60. | Parity. | Every crouch walk speed (102 to 150 u/s) is above 60, so crouch walking made footsteps, as in the original. |
| 2025-07 #1097, from #992 |
Let the walk key decide: holding +walk is silent below a raised limit, so bunny hopping still makes noise. Walking speed was raised to at least 90. | Players could not tell whether they were moving quietly. A held key gives a predictable answer, without a new HUD element. | The code comment already named turning and changing direction as ways to gain speed. Raising walk speed changed movement. |
| 2025-10 #1431 |
Make aiming silent too, set the limit per class (0.7 × run speed, or 0.7 × crouch speed while crouched), and return walk speeds to parity. | Aiming moved slower than walking yet made footsteps, and the walk speed change had altered movement. | Parity against key-based sneaking was deferred to a later discussion. 90° turns made footsteps, and a higher limit was suggested. Slow analog movement without a key stayed audible, and a speed-only check was suggested. |
| 2026-09 #2151 |
Move the check into IsMakingFootstepSounds and let water splashes follow footsteps. |
Sneaking players can enter and leave water silently. | No change to the rule itself. |
Under the original game's 60 u/s crouched limit, a crouch walk makes footsteps. Under this proposal it is silent. #1431 deferred the parity discussion; this proposal takes a position for crouching, and that choice is worth discussing on its own.
#1097 also links a Discord thread and a change document, which are not summarised here.
Make every footstep follow one formula, decided the same way by the server, the stepping player and everyone listening. Movement speed and feel do not change; only whether and when a step sound plays.
1Quiet is opt-in. Crouching, walking and aiming are silent at their normal speed, for every class and weapon. Moving faster than that still makes noise: sprinting, sliding, being pushed. Outside those three, every step at 50 u/s or faster is heard, so a runner passing through walk speed stays audible.
2Pressing crouch, walk or aim holds back your next footstep. If you settle into that mode, it is dropped. If you let go too early, it plays right away. Jumping or grabbing a ladder forgets it, and landing from a jump always makes a step.
3Looking around while crouch walking or walking does not count as speeding up. Turning widens the threshold, and one brief switch of movement keys is forgiven.
4Footstep volume follows how you move. Sprinting is the loudest, running keeps its volume, and a crouch sprint is 65% of a sprint: louder than a run, quieter than a standing sprint.
The same shared code decides a footstep in three places: the server, the stepping player's own client, and every other client that can see them. The terms come in three groups: speeds, turning and timers. Each group gets one picture, and the formulas reuse the same letters.
sound threshold = GetNormSpeed * weapon scale * SILENT_MOVE_THRESHOLD actual speed = GetNormSpeed * weapon scale * stance modifier
Both sides carry the weapon, so the gun cancels out: a quiet mode is silent whenever its stance modifier is at or below SILENT_MOVE_THRESHOLD, 0.825. Crouch and walk are 0.75 and aim is 0.6, so all three qualify with every gun; sprinting multiplies by 1.35 or 1.6 and never does. On master the threshold was GetNormSpeed * 0.7 with no weapon term, so the headroom changed with the gun.
GetNormSpeed) times the weapon's speed scale, so 1.0 is your run speed with that weapon. The threshold and every stance carry the same two factors, so one picture is exact for every class and weapon. Green band: silent. Dashed band: extra room while turning, which sprinting never gets. Red marks make footsteps, at the volume on the right. Below 50 u/s no posture makes footsteps.| Class | Run | Crouch | Walk | Aim | Silent limit | Crouch sprint | Sprint |
|---|---|---|---|---|---|---|---|
| Recon | 200 | 150 | 150 | 120 | 165 | 202.5 | 270 |
| Assault, VIP, Juggernaut | 160 | 120 | 120 | 96 | 132 | 192 | 256 |
| Support | 160 | 120 | 120 | 96 | 132 | cannot sprint | cannot sprint |
Units per second with no weapon slowdown. Multiply every column by your weapon's speed scale, from 0.675 (PZ) to 0.85 (SRM, knife, pistols); section 4.2 lists every gun. Crouch sprint is faster than a run: by 1.25% for recon and 20% for the others.
GetNormSpeed × weapon speed scale (assault with an SRM: 136). The silent threshold is SILENT_MOVE_THRESHOLD, 0.825, of it.GetNormSpeed. Master's limits are multiples of it; the new rule multiplies it by the weapon first, which gives w.sound threshold = GetNormSpeed * 0.7 actual speed = GetNormSpeed * weapon scale * stance modifier quiet modes = aim, walk loud if speed is over a fixed cutoff
sound threshold = GetNormSpeed * weapon scale * SILENT_MOVE_THRESHOLD actual speed = GetNormSpeed * weapon scale * stance modifier quiet modes = crouch, walk, aim loud if sprinting
Both use the same quiet and loud volumes, and crouched steps are 65% of either. Ladders are always audible: climb speed is a fixed 200 u/s whether crouched or not, and horizontal speed is near zero while climbing. The turning speed curve comes from a movement simulation; every other number is a constant in the code.
| Scenario | Before | After |
|---|---|---|
| Crouch walking | audible, louder than a run | silent |
| Crouch walking with +walk or aim | silent until a turn | silent |
| Crouch sprinting | audible, 0.325 | audible, 0.325: between a run and a sprint |
| Sprinting as assault, or as recon with most weapons | as quiet as a run | loudest step |
| Slide from a run | audible | audible |
| Pushed while crouched | audible | audible |
| Turning while crouch walking | audible | silent |
| Wiggle walking crouched | audible | first step forgiven, repeats audible |
| Wiggle walking standing | audible | first step forgiven, repeats audible |
| Walking with the BALC | audible | silent |
| Dropping into a crouch from a run | one running step leaks | silent |
| Tapping crouch, walk or aim | steps unchanged | steps unchanged, at most 100 ms later |
| Crouched ladder climbing | audible | audible |
| Landing from a jump or a drop | audible, up to 0.5 s late | audible on the landing tick, in any posture |
Each change in the order a footstep meets it: first the formula's two parts, then the fixes that make other players hear the same answer.
Formula part 1, crouched line. Crouching used to be silent only while also aiming or holding +walk, so a plain crouch walk was audible. The threshold is now the player's own crouch walk speed plus 10%, including weapon slowdown. That is the same limit as 0.825 of run speed in the formula.
// neo_player_shared.cpp, IsMakingFootstepSounds
if (GetFlags() & FL_DUCKING)
{
if ((IsInAim() || IsWalking()) &&
speed <= GetCrouchSpeed() * 0.7f)
return false;
}
if ((GetFlags() & FL_DUCKING) && !isOnLadder)
{
float crouchSilentGrace = 1.1f;
// plus turn headroom, see Turning below
// ground speed: other clients see vertical
// speed when a player steps up stairs
if (groundspeed <=
GetCrouchSpeed_WithActiveWepEncumberment()
* crouchSilentGrace)
return false;
}
Every weapon slows its holder, by 0.675× (PZ) to 1.0× (BALC). The threshold first used the class crouch speed alone, so a recon crouch sprinting with a 0.725× rifle (147 u/s) stayed under 165 and made no sound. The threshold now uses the crouch speed with the active weapon applied, which keeps the same 10% margin for every weapon.
Formula part 2. Side-stepping at normal speed and pressing crouch often plays one more footstep. The game only counts a player as crouched once the 0.4 s crouch animation finishes, and a running step fires every 300 ms, so one step almost always lands in between. Walking settles in about 50 ms and is rarely affected, but follows the same rule so both keys behave alike.
CalculateSpeed checks the same crouched flag (FL_DUCKING, set at TIME_TO_DUCK, gamemovement.cpp:4767).| Event | Result |
|---|---|
| Press crouch, walk or aim while moving on the ground, not already crouched | Armed: the next step the timer fires is held. Each key arms from its own press, so crouch pressed while still aiming arms too |
| Step timer fires while armed | Held, nothing plays yet |
| Settled: the mode that armed the step has taken effect, and not loud | Held step dropped |
| Still loud 0.1 s after crouch, walk or aim takes effect (slide, sprint, push) | Held step plays now |
| Arming key released while a step is held | Held step plays now |
| Arming key released within one step interval of the drop, no other quiet mode held | Dropped step plays now |
| Leaving the ground, or on a ladder | Held step forgotten: a landing makes its own step, and ladders are always audible |
| Key released later than that | Nothing extra; normal rules continue |
| Another loud step while settling into the crouch | Joins the held step |
| A held step plays | At the volume for how you move when it plays, so a step held while standing plays at the crouched 65% once you have crouched. The next step keeps its timing, at least 100 ms later |
Without that rule, a player could repeat crouch, settle, release about every 0.7 s. They would move at full speed for most of each cycle, since the crouch animation keeps run speed, and drop one step per cycle. Giving the step back on an early release means a dropped step always costs a real step's worth of crouched movement. Tapping crouch can only delay a step, never remove it.
The rule only decides whether and when a step sound plays. Speeds, acceleration, the crouch animation and hull sizes stay exactly as they are. Only one step is ever held, and anything still loud after settling plays as before.
Each of the three footstep deciders runs this rule itself, so each needs to know when crouch, walk or aim is held. Walk and aim already are: m_fIsWalking and m_bInAim are sent to every client in NEO (hl2mp_player.cpp:112, neo_player.cpp). For crouch, the engine already defines FL_ANIMDUCKING, "in the process of crouching" (public/const.h:150), inside the m_fFlags every client receives. Nothing in this codebase set it before. The branch sets it while crouch is held (CGameMovement::Duck), which needs no new network data.
Other clients see press and release about one snapshot late, so a penalty step can sound a few tens of milliseconds later for them than for the player. A second step before settling plays the earlier held one and holds the new one, so a crouch that never settles cannot skip a step either.
Holding a movement key while turning the view, or switching keys such as W+D to W+A, really raises ground speed: acceleration builds toward the new direction faster than friction removes the old one. The gain reaches about 50% of crouch walk speed, more than the 10% headroom, so looking around while crouch walking made footsteps. The turning chart in section 2.1 shows the threshold against the simulated gain.
float crouchSilentGrace = 1.1f;
// crouch sprinting stays audible while turning
if (!m_fIsSprinting)
crouchSilentGrace += 0.45f *
Min(m_flFootstepTurnRate / 180.f, 1.f);
The turn rate comes from the view yaw, which every client receives, keeps its peak and fades over 0.25 s.
Switching keys does not turn the view, so turn headroom cannot see it. The first crouched step over the threshold is skipped when the player has been crouched on the ground for 0.5 s, is not sprinting and is no faster than 1.55 c. It comes back after 1 s under the threshold.
| Test pass | Before | After |
|---|---|---|
| Crouch walking while turning (recon, c = 127.5) | 13 footsteps at 140.5 to 156.5 u/s, turn rates up to 3,000°/s | none from turning; crouch sprinting still audible at up to 483°/s |
| Wiggle walking crouched | about 30 footsteps at 142.8 to 165.1 u/s, turn rate under 41°/s | first step forgiven in each of 7 bursts, the rest audible |
The SDK picks a quiet or loud step volume by comparing speed with a fixed run speed, 80 u/s crouched and 220 u/s standing, then scales crouched steps to 65%. Those numbers fit the SDK's own crouch, a third of run speed (about 63 u/s), so its crouched steps stayed under 80 and quiet. NEO crouches at 0.75 of run speed, so every crouch walk passes 80 and gets the loud volume. Standing, an assault sprint stays under 220 with every weapon and a recon sprint only passes it with a 0.85 weapon, so most sprints get the quiet one.
| Movement, concrete | Master | This branch |
|---|---|---|
| Walk, aim with +walk | silent | silent |
| Crouch walk | 0.325 | silent |
| Run | 0.2 | 0.2 |
| Crouch sprint | 0.325 | 0.325 |
| Sprint, recon with a 0.85 weapon | 0.5 | 0.5 |
| Sprint, recon with a slower weapon | 0.2 | 0.5 |
| Sprint, assault | 0.2 | 0.5 |
A crouch walk played about 1.6 times as loud as a run, and a sprint was only loud for a recon carrying a 0.85 weapon. With master's crouched rule restored, a crouch walk sounded louder than a run.
Choose the volume from the movement mode. Sprinting is loud and everything else is quiet, for every class and weapon. Crouched steps keep the SDK's 65%, so a crouch sprint is 0.325: louder than a run, quieter than a standing sprint. Crouch walking is silent, so the quiet crouched volume (0.13) only plays on landings and on steps over the threshold.
// neo_player_shared.cpp bool CNEO_Player::IsQuietFootstep() const { return !m_fIsSprinting; } // baseplayer_shared.cpp, UpdateStepSound fvol = pNeoPlayer->GetSurfaceStepVolume(psurface, bQuietStep); // 0.2 or 0.5 on concrete if (GetFlags() & FL_DUCKING) fvol *= NEO_FS_CROUCH_VOLUME_SCALE; // 0.65
Other surfaces keep their own quiet and loud pair, such as dirt at 0.25 and 0.55. The step interval still follows speed, so step timing does not change. The sprint state and the crouch flag reach every client, so the server, the stepping player and everyone listening pick the same volume.
A flat jump falls too slowly for the engine's landing sound, which needs 350 u/s of fall. The footstep players hear on landing is the regular step whose timer ran out in the air, firing on the first tick back on the ground. Two things had broken that. Since #2151 UpdateStepSound restarted the step timer even in the air, so the first step after landing came at a random phase up to half a second later. And with crouching a quiet mode, a crouched landing at walk speed made no sound at all.
Crouch-jumps and drops landed silently, and standing landings had a step somewhere in the next half second rather than on impact.
The step timer waits at zero while off the ground, as in the SDK, so after a jump the step lands on the landing tick. A landing after at least 0.1 s in the air marks the next step decision as never silent, which also covers short drops whose timer has not run out.
A standing jump in place still makes nothing, since speed is under 50 u/s on landing, as before. The engine's hard-landing sound is unchanged.
In NEO builds, the only line that set feet sat inside #ifndef NEO, after #2151 removed the unused locals around it. The server then chose recipients from an uninitialized position.
Move VectorCopy( vecOrigin, feet ); out of the #ifndef NEO block. Upstream PR #2230 makes exactly this change. The branch carries a local copy until it merges.
Behavior change: players who are out of sight but within hearing range get the server's footsteps again, as in the stock SDK.
Reference numbers, test data and branch state behind the parts above.
Top ground speed for each class, posture and gait on flat ground, and whether a step at that speed is silent. Speeds come from CalculateSpeed capped by the movement code's per-gait limit. The right-hand column gives the silent movement threshold.
| Standing | Crouched | Silent threshold | |||||
|---|---|---|---|---|---|---|---|
| Class | +walk | normal | sprint | +walk | normal | sprint | crouch, walk, aim |
Top ground speed in u/s with each weapon held, from CalculateSpeed: class speed × weapon speed scale, then × 0.75 for crouching or for standing with +walk. Crouch and +walk come out equal for every class and gun. What differs is the silent movement threshold each one is measured against.
CanBePickedUpByClass).NEO_BUILD_WEAPON_PBK56S, which is off by default.| Gun | Scale | Recon (200) | Assault (160) | Support (160) | VIP (160) | Juggernaut (160) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Run | Crouch | +walk | Run | Crouch | +walk | Run | Crouch | +walk | Run | Crouch | +walk | Run | Crouch | +walk | ||
| BALC | 1.0 (none) | – | – | – | – | – | – | – | – | – | – | – | – | 160 | 120 | 120 |
| Knife | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – | – | – | – |
| Milso | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Tachi | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Kyla | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| MPN45 | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| SRM | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| SRM-S | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Frag grenade | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Smoke grenade | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Detpack | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Ghost | 0.85 (−15%) | 170 | 127.5 | 127.5 | 136 | 102 | 102 | 136 | 102 | 102 | 136 | 102 | 102 | – | – | – |
| Jitte | 0.8 (−20%) | 160 | 120 | 120 | 128 | 96 | 96 | 128 | 96 | 96 | 128 | 96 | 96 | – | – | – |
| Jitte scoped | 0.8 (−20%) | 160 | 120 | 120 | 128 | 96 | 96 | 128 | 96 | 96 | 128 | 96 | 96 | – | – | – |
| ZR68-C | 0.8 (−20%) | 160 | 120 | 120 | 128 | 96 | 96 | 128 | 96 | 96 | 128 | 96 | 96 | – | – | – |
| SMAC | 0.8 (−20%) | 160 | 120 | 120 | 128 | 96 | 96 | 128 | 96 | 96 | 128 | 96 | 96 | – | – | – |
| PBK56S * | 0.8 (−20%) | 160 | 120 | 120 | 128 | 96 | 96 | 128 | 96 | 96 | 128 | 96 | 96 | – | – | – |
| ZR68-S | 0.775 (−22.5%) | 155 | 116.2 | 116.2 | 124 | 93 | 93 | 124 | 93 | 93 | 124 | 93 | 93 | – | – | – |
| Mosok (M41) | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| Mosok Silenced | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| Mosok Scoped | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| MX | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| MX Silenced | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| ZR68-L | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| SRS | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| AA13 | 0.725 (−27.5%) | 145 | 108.8 | 108.8 | 116 | 87 | 87 | 116 | 87 | 87 | 116 | 87 | 87 | – | – | – |
| Supa-7 | 0.7 (−30%) | 140 | 105 | 105 | 112 | 84 | 84 | 112 | 84 | 84 | 112 | 84 | 84 | – | – | – |
| PZ252 | 0.675 (−32.5%) | – | – | – | 108 | 81 | 81 | 108 | 81 | 81 | 108 | 81 | 81 | – | – | – |
Four play passes on a listen server. One bot mirrored the host's inputs (bot_mimic 1) so every step could be compared as the stepping player, the server, and another client heard it. neo_footstep_debug logged each footstep decision, and chat messages marked what was heard in game.
| Pass 1, before | Server footsteps | With no recipients | Example origin |
|---|---|---|---|
| Bots and host, one round | 811 | 811 | (0.0 6.47e36 0.0) |
| Scenario | Before | After (pass 4) |
|---|---|---|
| Crouch walk | 54 server steps at 65 to 139 u/s | 0 steps, yours and the bots' |
| Crouch sprint | audible | 30 steps at 172 to 222 u/s |
| Sprint into crouch | audible | steps while above the threshold (168 to 186 u/s) |
| Other clients' estimate of a crouch walker | n/a | no false steps; all 98 crouched bot steps match the server |
| Server steps, master's crouched rule | Steps | Volume | Speed, u/s |
|---|---|---|---|
| Standing run | 351 | 0.20 | about 100 to 170 |
| Crouch walk | 21 | 0.32 | about 96 to 128 |
| Crouched, under 80 u/s | 11 | 0.13 | 51 to 80 |
| Standing sprint, over 220 u/s | 5 | 0.50 | 223 to 236 |
| Pass, assault | Audible steps | Forgiven |
|---|---|---|
| Walk straight | 0 | 0 |
| Walk in a circle | 0 | 0 |
| Walk wiggle, 0.85 weapon | 18 | 1 |
| Walk wiggle, MX (0.725) | 29 | 2, one per burst |
| Aim wiggle, no +walk | 0 | 0 |
| Crouch walk | 0 | 0 |
| Pass | Result |
|---|---|
| Crouch pressed just before a ladder, climb | ladder steps audible |
| Aim held, press crouch, release aim, 10 times | 0 steps heard; 19 held then dropped |
| Crouch to stand and aim, 5 times | 0 steps |
| Crouch-jump, hold-crouch jump, walk off a box crouched | one step on every landing, at 0.13 |
| Running jumps | step on the landing tick |
sv_cheats 1; neo_bot_quota 1
neo_footstep_debug 1; neo_footstep_debug_bots 1
con_logfile footsteps.log
nb_stop 1 // walk up to the bot
nb_stop 0; bot_mimic 1
Reported as footsteps while turning quickly in place. Every movement tick was sampled while turning. Speed stayed at exactly 0 and no footstep played, locally or as other clients hear it.
net_fakelag 80 and 2% loss: standing, leaning, and all three classes.| Commit | Change | Branch |
|---|---|---|
| 16dd7ef1 | Fix footstep sounds playing from an unset origin (copy of PR #2230) | base |
| c2b93eb0 | Silence crouched footsteps below the player's crouch walk speed | footsteps/sound-consistency |
| d71c60f3 | Allow for speed gained by turning or switching keys while crouched | footsteps/sound-consistency |
| 124ac092 | Pick footstep volume by movement mode instead of speed | footsteps/sound-consistency |
| 6737d239 | Share one silent movement threshold across crouch, walk and aim | footsteps/sound-consistency |
| 73291af2 | Hold the first footstep after pressing crouch, walk or aim | footsteps/sound-consistency |
| 5e81a24c | Keep the step on landing audible in every posture | footsteps/sound-consistency |
| 068ab898 | Start other players' ground surface trace clear of floors and walls | -docs only |
| 4b403dc4 | neo_footstep_debug instrumentation | -docs only |
| 596c994d | An experimental crouched threshold setting | -docs only |
footsteps/sound-consistency-docs sits on top of the PR branch with the ground surface trace fix, the logging, the experiment and these docs.