If you’re practicing aim, map movement, or utility lineups, the right bot difficulty keeps sessions efficient and fun. This guide shows every reliable way to change bot difficulty in CS2, why it sometimes “doesn’t stick,” and how to automate your setup so you can jump straight into practice.
TL;DR (Quick answer)
- Enable the developer console (Settings → Game → Enable Developer Console → Yes).
- Press ~ (tilde) in-game.
- Set difficulty:
bot_difficulty 0 // easy
bot_difficulty 1 // normal
bot_difficulty 2 // hard
bot_difficulty 3 // expert
- Apply it: either mp_restartgame 1, or bot_kick; bot_add_t; bot_add_ct to respawn bots at the new difficulty.
- If the game keeps changing difficulty, run:
sv_auto_adjust_bot_difficulty 0
What “bot difficulty” actually does (and the only valid values)
In CS2, bot_difficulty accepts values 0–3:
- 0 = Easy
- 1 = Normal
- 2 = Hard
- 3 = Expert
Tip: Typing bot_difficulty alone shows the current value. The default on many local lobbies is often 2 (hard).
You may see guides claim levels up to 4 or 5. That’s not how bot_difficulty works—it tops out at 3 (expert). There is also custom_bot_difficulty used by certain modes and scripts; if you experiment with that, keep your expectations separate from bot_difficulty and stick to its documented range for consistent results.
Step-by-step: change bot difficulty offline (practice/with bots)
- Create a local match (Play → Practice).
Open console (~) and set your level:
bot_difficulty 3
- Respawn bots so the new difficulty applies:
- Fast restart: mp_restartgame 1, or
- Hard refresh: bot_kick; bot_add_t; bot_add_ct
- Fast restart: mp_restartgame 1, or
Why respawn? Difficulty is applied when bots join/respawn. If you don’t restart or re-add, some or all bots may still run at the old difficulty.
“It keeps changing back!” — stop the auto-adjust
CS2 can automatically tweak bot difficulty during play. To lock your chosen level, add this before (or right after) setting difficulty:
sv_auto_adjust_bot_difficulty 0
bot_difficulty 2 // for example
mp_restartgame 1
If you still see inconsistent behavior, do a hard refresh:
bot_kick
bot_add_t
bot_add_ct
Add the exact number of bots you want
Pair difficulty with the right amount of opponents:
bot_quota 10 // total bots allowed
bot_quota_mode fill // keep the server filled up to bot_quota
bot_difficulty 1 // set level
mp_restartgame 1
Useful adds/removals:
bot_add_t // add a T bot
bot_add_ct // add a CT bot
bot_kick // remove all bots
bot_kick name // remove one bot by name
Other handy lobby protections:
mp_limitteams 0
mp_autoteambalance 0
Want a clean 1vX scenario? Kick all bots, set quota/mode, then add only the side you want to fight.
Change difficulty mid-match without leaving
Set your new value:
bot_difficulty 3
Apply it via quick restart or re-adding bots:
mp_restartgame 1
// or
bot_kick; bot_add_t; bot_add_ct
Power-user setup: one-key difficulty toggles (binds)
If you practice often, create aliases and binds. Paste this in your console to try it now; then put it in autoexec.cfg to make it permanent (see next section):
// Lock difficulty auto-adjusting and apply chosen level
alias bd0 “sv_auto_adjust_bot_difficulty 0; bot_difficulty 0; mp_restartgame 1”
alias bd1 “sv_auto_adjust_bot_difficulty 0; bot_difficulty 1; mp_restartgame 1”
alias bd2 “sv_auto_adjust_bot_difficulty 0; bot_difficulty 2; mp_restartgame 1”
alias bd3 “sv_auto_adjust_bot_difficulty 0; bot_difficulty 3; mp_restartgame 1”
bind “F6” “bd0” // Easy
bind “F7” “bd1” // Normal
bind “F8” “bd2” // Hard
bind “F9” “bd3” // Expert
You can also bind bot counts:
alias b5 “bot_quota 5; bot_quota_mode fill; mp_restartgame 1”
bind “F5” “b5”
Make it permanent with autoexec.cfg
- Create autoexec.cfg in your CS2 cfg folder (Steam → CS2 → right-click → Manage → Browse local files → game\csgo\cfg\).
Add your preferred defaults, for example:
// — My bot practice defaults —
sv_auto_adjust_bot_difficulty 0
bot_difficulty 2
bot_quota 10
bot_quota_mode fill
// optional quality-of-life
mp_limitteams 0
mp_autoteambalance 0
- Launch option: add +exec autoexec.cfg to CS2 Launch Options so it always runs.
Dedicated/community servers (RCON / server.cfg)
On a server you control, place these in server.cfg:
sv_auto_adjust_bot_difficulty 0
bot_difficulty 1
bot_quota 10
bot_quota_mode fill
Changes during a live match usually need a round restart:
mp_restartgame 1
On servers you don’t own, you’ll need admin/RCON rights; otherwise your client commands won’t override server cvars.
Troubleshooting (read this if your changes don’t stick)
“bot_difficulty shows 3 but bots feel easy.”
Restart the round or re-add bots (mp_restartgame 1 or bot_kick; bot_add_t; bot_add_ct). Difficulty applies on (re)spawn.
“Difficulty keeps drifting during play.”
Add sv_auto_adjust_bot_difficulty 0 before or after setting difficulty.
“Command not found / blocked.”
You might be on a community server without permissions. Test in an offline Practice lobby or ask for admin/RCON.
“Do I need sv_cheats 1?”
No for bot_difficulty, bot_quota, etc. Some training helpers like bot_mimic or certain freeze/debug commands do require it—keep those separate from your difficulty setup.
“What about 4 or 5?”
Stick to 0–3 for bot_difficulty. If you’re experimenting with custom_bot_difficulty, treat it as a different system and don’t expect bot_difficulty behavior from it.
Bonus: helpful bot commands for practice sessions
Use sparingly (some require cheats for sandbox-style drills):
bot_stop 1 // freeze bots (0 = unfreeze)
bot_defer_to_human_goals 1 // let you drive round objectives
bot_dont_shoot 1 // safe dry-runs
mp_respawn_on_death_t 1 // continuous reps (T)
mp_respawn_on_death_ct 1 // continuous reps (CT)
mp_roundtime_defuse 60 // long rounds for utility practice