The CSAFAP Config Package uses AveYo’s ticker system to execute alias chains every frame, enabling binds that require frame-perfect timing. This system is critical for jumpthrow binds, null movement, and rapid-fire mechanics.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/FNScence/CSAFAP-config-package/llms.txt
Use this file to discover all available pages before exploring further.
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