What is the Ticker?
The ticker is a.vtest script file that runs every frame, calling specific aliases at precise intervals. It leverages CS2’s -testscript launch option to execute code outside the normal command queue.
Launch Option Requirement
From README.md installation (csafap/addons/.vtest:2):.vtest file continuously during gameplay.
The .vtest File
From csafap/addons/.vtest:How It Works
Test_WaitForCheckPoint frame_end: Synchronizes to frame end- Alias calls (e.g.,
W!,M1!,JT!): Execute in order - Repeated calls: Chain multiple alias substitutions in single frame
Test_Run: Loops back to beginning, running every frame
W!) is called twice because a single alias substitution can only change one level deep per frame. Calling twice allows chained state transitions.
Jumpthrow Implementation
Basic Jumpthrow
From csafap/addons/AveYo.cfg:4-7:+JumpThrow):
- Set
JT!toJT+1 - Next frame: Ticker calls
JT!→ executesJT+1→ callsM1>(release attack1), setsJT!toJT+2 - Next frame: Ticker calls
JT!→ executesJT+2→ callsM2>(release attack2), setsJT!toJT+3 - Next frame: Ticker calls
JT!→ executesJT+3→ activates+jump, clearsJT!
-JumpThrow):
- Set
JT!toJT-1 - Next frame: Ticker calls
JT!→ executesJT-1→ deactivates jump withjump -9999 f u, clearsJT!
W-Jumpthrow
From csafap/addons/AveYo.cfg:9-13:- Frame 1:
+forward - Frame 2: Release
M1> - Frame 3: Release
M2> - Frame 4:
+jump
- Frame 1: Cancel forward movement
- Frame 2: Cancel jump
Mouse Button Ticker Integration
Jumpthrow requires special mouse binds (csafap/addons/AveYo.cfg:15-20):M1> and M2> work:
- When you click mouse1,
+M1setsM1>to-attack - When jumpthrow calls
M1>, it executes-attack(releases grenade) - After release,
M1>is cleared back to empty
spec_next and spec_prev preserve spectator functionality when mouse buttons are released.
Null Movement Binds
From csafap/addons/AveYo.cfg:27-42:+nullWsetsW!toW+1- Next frame:
W+1callsW<(empty initially), setsW!toW+2 - Next frame:
W+2activates+forward, and setsS<andS>aliases:S<= cancel forward movementS>= activate forward movement
+nullStriggers similar chain- Calls
W<which now equalsforward -9999 f u(from S’s setup) - Cancels forward movement instantly
- Activates backward movement instead
Why Dual Aliases (< and >)
W</S</A</D<: Called by opposite key to cancel current movementW>/S>/A>/D>: Called on key release to restore previous movement state
Crouch Jump
From csafap/addons/AveYo.cfg:22-25:- Frame 1:
+duck - Frame 2:
+jump
- Frame 1: Cancel duck
- Frame 2: Cancel jump
Performance Impact
From csafap/addons/.vtest:28-29:- No
Test_RunFrame: Runs every frame (highest responsiveness, small FPS cost) - One
Test_RunFrame: Runs every 2nd frame (lower responsiveness, better FPS) - Multiple
Test_RunFrame: Further reduces frequency
Test_RunFrame for maximum responsiveness.
Ticker vs. Radio Wheel Binds
The CSAFAP package uses two different bind systems:| Feature | Ticker Binds | Radio Wheel Binds |
|---|---|---|
| Implementation | .vtest + AveYo.cfg | logic.cfg alias chains |
| Use Case | Frame-perfect timing | Multi-phase selection |
| Examples | Jumpthrow, null WASD | Line-up selection, pro crosshairs |
| Frame Precision | ✅ Yes | ❌ No |
| State Persistence | Cleared each frame | Persists across frames |
| Launch Option | Required | Not required |
Common Issues
Console Spam: Unknown command: W!...
From README.md Q20:
Cause: The ticker aliases (W!, M1!, etc.) aren’t initialized before the .vtest script starts.
Solution:
- Ensure
+exec csafap/mainis in launch options - Check for long alias commands that might break the exec queue
- Verify
.vtestfile has correct name (literally.vtest, notvtest.vtest)
Movement/Mouse Buttons Don’t Work
From README.md Q21: Cause: Same as console spam - ticker initialized before binds loaded. Solution:- Remove
-testscriptfrom launch options temporarily - Check console for errors after
exec csafap/main - Fix any alias that’s too long or malformed
- Add
-testscriptback once all aliases load successfully
Rapid Fire/Follow Recoil Not Working
From README.md Q18: Framerate dependency:- Default config requires 150+ FPS
- For <150 FPS: rename
rapid_followrecoil_lessthan150FPS.cfgtorapid_followrecoil.cfg
Technical Deep Dive
Why -9999 f u?
Commands like jump -9999 f u instantly deactivate the command:
- The
-9999is an extreme negative value f uare flags (exact meaning undocumented by Valve)- Together they force immediate deactivation, overriding any queued actions
Alias Substitution Depth Limit
CS2 only allows one level of alias substitution per frame. Example:.vtest calls each alias twice - the first call changes the alias, the second call executes the new value.
Frame Timing
frame_end: Ticker runs after game logic but before rendering- Render time: ~6-16ms at 60-165 FPS
- Ticker overhead: <0.1ms per frame
Advantages Over Multi-Input Binds
Valve patched multi-input binds (Oct 28, 2024) wherebind key "+action1; +action2" would only execute first action.
Ticker system bypasses this by:
- Storing state in aliases (e.g.,
JT!) - Ticker executing state machine steps across multiple frames
- Each frame issues only one
+action, legal per Valve’s rules