The most feature-rich custom bot script for Dota 2. Play against bots that actually fight, farm, push, and use items intelligently.
To play: Create a Custom Lobby and select Local Host as the server location. Bots should have names ending with ".OHA" when installed correctly.
Steam Workshop | GitHub | Feature Requests
- 127 heroes supported on Patch 7.41/7.41a - including Largo, Kez, Ringmaster, Invoker, Techies, Meepo, Lone Druid, and more
- Bots actually play the game - they lane, gank, push towers, defend, farm jungle, take Roshan, and use active items
- Dynamic difficulty (FretBots mode) - bots get unfair bonuses that scale with difficulty for a real challenge
- Bots communicate - they announce pushes, defends, Roshan, and respond to your pings with "On my way!" (in 4 languages)
- 10+ Game modes supported - All pick, Turbo, All random, Captain mode, 1v1 mid, All Random Deathmatch, etc.
- Customizable everything - bot names, roles, hero picks, bans, item builds, skill builds, and more
- AI Chatbot - bots chat like real (toxic) players (requires FretBots mode)
- All roles supported - deterministic position 1-5 lane assignment
- Subscribe on Steam Workshop
- Create a Custom Lobby with Local Host server
- Start the game - bots auto-pick and play
For FretBots mode (harder bots, neutral items, chatbot): Manual installation guide
| Command | Description |
|---|---|
!pos X |
Swap your role with a bot (e.g., !pos 2 for mid) |
!Xpos Y |
Reassign bot positions (e.g., !3pos 5 = 3rd bot plays pos 5) |
!pick HERO |
Pick a hero (!pick sniper, or /all !pick sniper for enemy) |
!ban HERO |
Ban a hero from being picked |
!sp XX |
Set bot language (en, zh, ru, ja) |
Use internal hero names if short names overlap (e.g., !pick npc_dota_hero_keeper_of_the_light). Batch commands work too: !pick io; !ban sniper.
Lobby slot order = position assignment (1-5):
| Position | Lane |
|---|---|
| Pos 1 (Carry) + Pos 5 (Hard Support) | Safe Lane |
| Pos 2 (Mid) | Mid Lane |
| Pos 3 (Offlane) + Pos 4 (Soft Support) | Offlane |
Customize picks, bans, and roles in Customize/general.lua.
| What | Where |
|---|---|
| General settings (picks, bans, names, roles) | Customize/general.lua |
| Per-hero settings (items, skills) | Customize/hero/viper.lua |
| FretBots difficulty tuning | FretBots/SettingsDefault.lua |
Permanent customization (survives Workshop updates): Copy the Customize folder to <Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/game/Customize>.
Supports most game modes (10+) . See full compatibility discussion.
You can start a bot game directly from the console without network or clicking UI buttons — useful for offline play, LAN parties, or quick testing. See play offline setup guide.
This project uses Claude Code for AI-assisted development. The CLAUDE.md file provides task-specific instructions for common operations like patch updates, hero fixes, and adding new heroes.
| Document | Description |
|---|---|
| docs/ARCHITECTURE.md | Complete codebase architecture, file map, naming conventions, all systems explained |
| docs/PATCH_UPDATE_GUIDE.md | Step-by-step runbook for updating when a new Dota 2 patch drops |
| docs/BOT_API_REFERENCE.md | Comprehensive Valve bot scripting API reference with examples |
| CLAUDE.md | AI coding assistant guide - common tasks, rules, and workflows |
Dota 2 bot scripts use internal code names for heroes, items, and abilities. These are different from the display names you see in-game. When updating builds or fixing bugs, always verify against authoritative sources:
| Resource | What It Contains |
|---|---|
| Liquipedia Cheats Page (Item Names) | Authoritative list of item_* internal names for all items including neutral items |
| d2vpkr npc_abilities.txt | All ability internal names and KV data |
| Dota 2 Patch Data API | Official patch notes in machine-readable format |
| Modifier Names (Valve Wiki) | modifier_* names for buff/debuff detection |
root: <Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts>
|
+-- bots/ All bot Lua scripts
| +-- hero_selection.lua Hero picking/banning
| +-- bot_generic.lua Per-bot entry point
| +-- ability_item_usage_generic.lua Ability/item usage for all heroes
| +-- item_purchase_generic.lua Item purchase state machine
| +-- mode_*_generic.lua Mode scripts (farm, push, defend, roam, etc.)
| +-- mode_assemble_generic.lua Human ping response
| |
| +-- BotLib/ Per-hero builds (items, skills, ability logic)
| | +-- hero_axe.lua, hero_crystal_maiden.lua, ...
| |
| +-- FunLib/ Core libraries and utilities
| | +-- jmz_func.lua Main utility library
| | +-- aba_item.lua Item system
| | +-- aba_skill.lua Skill/ability system
| | +-- aba_push.lua Push logic
| | +-- aba_defend.lua Defend logic
| | +-- localization.lua Chat translations (en/zh/ru/ja)
| |
| +-- FretBots/ Enhanced difficulty mode
| | +-- SettingsDefault.lua Difficulty tuning
| | +-- SettingsNeutralItemTable.lua Neutral items + enchantments
| |
| +-- Customize/ User-editable settings
| +-- general.lua Team-level settings
| +-- hero/ Per-hero overrides
|
+-- typescript/ TypeScript source for TS-generated Lua files
| +-- bots/ TS versions (compiled to bots/ via tstl)
| +-- post-process/ Post-compilation scripts
|
+-- game/ Valve defaults + permanent customization location
| +-- Customize/ Copy your Customize/ here to survive updates
|
+-- docs/ Developer documentation
+-- ARCHITECTURE.md
+-- PATCH_UPDATE_GUIDE.md
+-- BOT_API_REFERENCE.md
- Contributions welcome on GitHub
- Custom item/skill builds don't need PRs - just tweak locally
- Future development is in TypeScript for better maintainability
- Open feature requests
- Current bot playstyle is limited by Valve's API. We need ML/LLM bots like OpenAI Five!
- Planned improvements:
- Smarter laning, pushing, ganking
- Stronger spell casting (Invoker, Rubick, Morphling, etc.)
- Better support for bugged heroes (Dark Willow, IO, Lone Druid, Muerta, etc.)
- Full game mode support + ongoing patch fixes
- Feedback to Valve Dota2 bot team
| Resource | Description |
|---|---|
| Dota2 AI Development Tutorial | Comprehensive guide by adamqqq |
| Valve Bot Scripting Intro | Official Valve documentation |
| Lua Bot APIs (moddota) | Community API docs |
| Liquipedia Cheats (Internal Names) | Item/hero/ability code names |
| npc_abilities.txt | Ability metadata |
| Enums & APIs (moddota) | Enum reference |
| Modifier Names | Buff/debuff modifier names |
- Contribute on GitHub
- Or buy me a coffee
Built on top of Valve's default bots + contributions from many talented authors:
- New Beginner AI (dota2jmz@163.com)
- Tinkering About (ryndrb)
- Ranked Matchmaking AI (adamqqq)
- fretbots (fretmute)
- BOT Experiment (Furiospuppy)
- ExtremePush (insraq)
- And all other contributors who made bot games better
