Maintained fork by Pablo Santillán (@lexicon06)
This fork was created after repeated server crashes were traced back to Charger movement handling during active charges in live production servers.
Multiple independent crash reports consistently pointed to the same engine function:
server_srv.so!CPlayerMove::RunPreThink(CBasePlayer*) + 0x27b
These crashes occurred during live gameplay and were reproducible under load, most commonly when Chargers were actively strafing while charging.
The following crash signatures were recorded across multiple incidents:
AXJ4-VZFS-GS5A LCG2-V3FR-H2B2 UWQE-BNSY-AGEI MXYT-MPXQ-HZNO PNGS-NJWM-P67F A2ZO-JJVY-5AFO TIDV-YU3M-34YO FVOC-QBOI-BFVA
All resolved to the same engine location:
server_srv.so!CPlayerMove::RunPreThink(CBasePlayer*) + 0x27b
The original implementation applied lateral movement using
TeleportEntity during OnPlayerRunCmd.
While functional, this approach forcefully rewrites player origin and velocity
inside the engine movement pipeline.
When executed repeatedly during CPlayerMove::RunPreThink, this can:
- Break internal physics assumptions
- Cause velocity stacking or invalid state transitions
- Trigger undefined behavior inside the movement system
- Lead to hard server crashes
This fork completely removes the use of TeleportEntity during active
Charger charge movement.
Instead, lateral movement is applied by directly updating the Charger’s velocity
using SetEntPropVector on m_vecVelocity.
This keeps all movement changes within the engine’s expected physics flow and
avoids forcefully relocating the entity mid-frame.
Additional runtime checks were added to ensure that:
- The client is valid and alive
- The Charger is actively charging
- The player is grounded
These changes preserve the original gameplay intent while significantly improving server stability.
This fork exists to address a real-world stability issue observed in production servers. The changes are conservative, targeted, and focused on preventing engine-level crashes without altering core gameplay behavior.
Charger Steering (FOX Fork) is a maintained fork of the original [L4D2] Charger Steering plugin by SilverShot, updated and adapted by Pablo Santillán (@lexicon06).
-
TeleportEntity usage removed
The original strafing logic that usedTeleportEntityhas been completely removed. Strafing is now applied by updatingm_vecVelocitydirectly, preventing physics corruption, desynchronization, and engine instability. -
FOX ConVar namespace
All ConVars use thefox_prefix to avoid conflicts and clearly identify this fork. -
Additional runtime validation
Extra client and state checks were added to improve reliability during charge handling. -
Fork actively maintained
This repository reflects ongoing maintenance and stability-focused fixes beyond the original release.
This project is based on the original [L4D2] Charger Steering plugin by SilverShot.
- Original thread: AlliedMods – Charger Steering
- Allows Chargers to turn using mouse movement while charging
- Optional strafing support during charge
- Configurable access for humans, bots, or both
- Configurable hint messages (chat or hint box)
- Game mode filtering (Coop, Versus, Survival, Scavenge)
- Translation support
- Game: Left 4 Dead 2 only
- Language: SourcePawn
- SourceMod: 1.8 or newer
- Dependencies:
- <sourcemod>
- <sdktools>
During strafing, this fork modifies the Charger’s velocity using
SetEntPropVector instead of forcefully teleporting the entity.
This keeps all movement updates inside the engine physics pipeline and avoids
corrupting internal state during RunPreThink.
- Compile the plugin using the SourceMod compiler
-
Copy the compiled
.smxfile into:addons/sourcemod/plugins/
- Restart the server or change the map
Pablo Santillán
GitHub: @lexicon06
- Original author: SilverShot
- Fork maintenance and stability fixes: Pablo Santillán
This project is licensed under the GNU General Public License v3.0 or later.