Аддон для World of Warcraft 3.3.5a (WotLK) — панель управления ботами mod-playerbots.
Собрать группу нужного состава, подогнать её под свой уровень и отдавать приказы — не набирая команды в чате.
Серверный модуль не требуется. Аддон работает на стоковом mod-playerbots и говорит с ботами теми же каналами, что и вы вручную.
Набор. Кнопка на каждый класс: нажали — бот призван и сам вошёл в группу. Четыре готовых состава (классическая пятёрка, живучая, взрывной урон, поддержка) собираются одним кликом. Полоска внизу показывает текущий состав цветами классов.
Кнопка «Добрать до пятёрки» считает, кого не хватает, и призывает только их. Если в группе уже два ДД — придут танк, лекарь и один ДД; если танк с лекарем на месте — только три ДД. Под кнопкой всегда написано, кого именно она позовёт.
Галочка слева от каждого класса ограничивает выбор: снимите «Мага» — и автодобор с набором рейда его не тронут.
Рейд. Кнопка «Разложить по группам» пересортировывает подгруппы: танки в первую, лекари поровну по остальным, ДД заполняют места. После балансировки запускается сама.
Кнопка «Сбалансировать» приводит уже набранный рейд к выбранному составу: распускает лишних и призывает недостающих. Выгоняет в первую очередь мёртвых, офлайн и тех, кто сильнее отстал по уровню; вас и отмеченных живых игроков не трогает никогда.
Размер от 2 до 40 и четыре состава на выбор — «Классический», «Запас прочности», «Напролом», «Молот 40-х». У каждого показано, как он разложится на выбранный размер (танки / лекари / ДД). Кнопка переводит группу в рейд, если вы лидер, и призывает недостающих, соблюдая соотношение ролей и не сваливая рейд в двадцать магов. Призванные сразу получают боевую стратегию по своей роли.
Отряд. Список участников: класс, уровень, жив ли. Уровень подсвечивается жёлтым при расхождении с вашим на 5+, красным на 10+ — сразу видно, кого пора подтянуть. Клик по строке выделяет бота в игре, правый клик распускает. У каждой строки четыре быстрые кнопки.
Приказы. Сначала выбираете адресата (все / танки / лекари / ДД / дальний бой / ближний бой), затем приказ. Девять команд с иконками, шесть боевых ролей, поле для произвольной команды.
Экипировка. Шесть уровней качества гира — кнопки окрашены в цвет качества предмета. Обслуживание: заклинания, расходники, починка, таланты, воскрешение. Внизу — сводка по разбросу уровней в группе.
Настройки. Ваша роль в группе и роль каждого живого товарища — переключателем «танк / лекарь / ДД / авто». Плюс масштаб, прозрачность, пауза между командами и список живых игроков.
Полоса быстрых приказов. Шесть иконок поверх интерфейса — то, что нужно в бою, без открытия окна.
- Скачайте репозиторий.
- Скопируйте папку
BotCommander(внутреннюю, ту, где лежитBotCommander.toc) вWorld of Warcraft/Interface/AddOns/. - Путь должен получиться таким:
Interface/AddOns/BotCommander/BotCommander.toc - Перезапустите клиент. Если аддон не виден в списке — включите «Загружать устаревшие аддоны» на экране выбора персонажа.
| Команда | Действие |
|---|---|
/bc |
открыть или закрыть панель |
/bc маг |
призвать бота (русские и английские названия классов) |
/bc party |
собрать классическую пятёрку |
/bc fill |
добрать группу недостающими ролями |
/bc raid 25 |
набрать рейд на 25 (состав — выбранный на вкладке) |
/bc balance |
привести состав рейда к выбранному |
/bc role tank |
своя роль; /bc role Пётр heal — товарищу, auto — сброс |
/bc sort |
разложить рейд по подгруппам |
/bc gear |
подогнать всех ботов под ваш уровень |
/bc bar |
показать или скрыть полосу приказов |
/bc human Пётр |
отметить как живого игрока |
/bc follow |
любая команда бота уходит группе как есть |
/bc reset |
вернуть окна в центр экрана |
/bc help |
список команд |
Разбор протокола mod-playerbots по исходникам (src/Bot/PlayerbotAI.cpp,
июль 2026). Три факта, определившие архитектуру:
1. Команды нельзя слать через SendAddonMessage.
PlayerbotAI::HandleCommand первой же строкой делает
if (type == CHAT_MSG_ADDON) return; — всё, что пришло скрытым
addon-каналом, молча отбрасывается. Рабочие каналы для команд —
только WHISPER боту и PARTY/RAID.
2. Ответы бот шлёт машиночитаемо. Если команда помечена префиксом
#a , ответ приходит как CHAT_MSG_PARTY с language = LANG_ADDON
(PlayerbotAI.cpp:3005). Клиент получает такое сообщение событием
CHAT_MSG_ADDON — то есть оно не засоряет окно чата. Поэтому запросы
состояния уходят с #a , а команды — без.
3. Серверный мост не нужен. Известный аддон MultiBot-Chatless требует
mod-multibot-bridge; здесь этого нет — всё держится на стоковом ядре.
Из первого факта следует главное инженерное ограничение: команды идут
обычным чатом, а на чат распространяется антиспам-защита сервера.
Поэтому в Comm.lua очередь с паузой (по умолчанию 0.35 с) — пачка
из десяти призывов не уходит одним кадром, иначе часть потеряется.
.playerbots bot remove — это на самом деле logout: в
PlayerbotMgr.cpp:715 команда remove сводится к logout, а
BotLogoutGroupCleanupOperation (PlayerbotOperations.h:417) только
сохраняет бота в базу — из группы его не исключает. Бот уходил в
офлайн, но продолжал висеть в рейде и занимать место.
Поэтому аддон сначала выгоняет его клиентским UninviteUnit (опкод
CMSG_GROUP_UNINVITE, GroupHandler.cpp:419 — снимает по GUID из
состава, присутствие в мире не требуется, так что офлайн-ботов тоже
убирает), и только потом логаутит.
Менять подгруппу может лидер или помощник, и только если в целевой
подгруппе есть свободный слот — иначе опкод молча отбрасывается
(GroupHandler.cpp:677). Поэтому переносы идут по одному через ту же
очередь, что и команды: слоты освобождаются по мере выполнения
предыдущих переносов, и пачка, отправленная одним кадром, потерялась бы.
Клиент 3.3.5a не сообщает специализацию чужого персонажа: талантов в
данных группы нет, а UnitGroupRolesAssigned появился только в
Cataclysm. Догадка по классу тут не работает — рыцарь смерти бывает и
танком, и ДД, друид умеет всё сразу.
Поэтому роль, под которую бот призван, запоминается по имени и имеет приоритет над догадкой. Без этого набранный правильно рейд (2 танка, 5 лекарей) при следующем пересчёте выглядел как 0 танков и 8 лекарей: ДК-танк читался как ДД, друид-танк как лекарь — и добор «исправлял» несуществующую нехватку.
Роль назначается и на сервере: танк получает +tank assist, лекарь —
+heal, ДД — +dps assist.
Для себя и живых товарищей роль задаётся вручную — в настройках или
командой /bc role. Это нужно гибридам: друид-танк по классу выглядел
бы лекарем, а паладин-танк тоже лекарем. Заданная руками роль не
сбрасывается при выходе персонажа из группы, в отличие от роли бота.
Отличить бота от живого игрока. Сервер отдаёт их клиенту одинаково — никакого признака «это бот» в данных нет. Поэтому «бот» здесь означает «любой участник группы кроме вас», а имена товарищей вносятся вручную в настройках. На сервере для двоих это не создаёт неудобств.
Узнать имя нового бота заранее. Его выбирает сервер. Автоподгонка
гира устроена так: после призыва аддон ждёт появления в группе нового
участника нужного класса и шлёт init=auto уже ему.
Заставить работать init= на случайных ботах мира. Это ограничение
ядра (PlayerbotMgr.cpp:741), а не аддона — команда работает только на
ботах, призванных через addclass.
Аддон не выводит в интерфейс команды, помеченные авторами модуля как
нерабочие или ломающие сервер, и предупреждает, если такую ввести
вручную: initself реролит вашего персонажа, rndbot grind крашит
сервер, rndbot revive удваивает ботов.
Аддон прогоняется на эмуляции клиентского API — без запуска WoW:
lua tests/run.luatests/wow_stub.lua намеренно не определяет SetShown, IsInRaid и
IsInGroup: этих функций в 3.3.5a нет, их обеспечивает Compat.lua.
Если код вызовет их в обход совместимости, тест упадёт.
Покрыто: загрузка всех файлов в порядке .toc, построение интерфейса,
переключение вкладок, очередь и троттлинг команд, выбор канала
(PARTY/RAID/WHISPER), фильтры адресатов, диалог подтверждения,
автоподгонка гира новичкам, слэш-команды, отрисовка при пустой группе и
рейде на 39 ботов, свёртка регистра кириллических имён, планирование
добора по ролям, ограничение классов галочками, соотношения всех
пресетов рейда на всех размерах, лидерство и конвертация в рейд,
пакетный призыв с назначением ролей.
Мёртвому персонажу клиент запрещает писать в /say, а консольные
команды (.playerbots bot addclass ...) идут именно этим каналом.
Серверу канал безразличен — команду он перехватывает по точке в начале
строки, причём раньше проверки на смерть, — поэтому в мёртвом
состоянии аддон отправляет её шёпотом самому себе.
Приказы ботам это не затрагивает: канал /party клиент у мёртвого не
блокирует, они работают как обычно.
Русский клиент 3.3.5a выводит текст шрифтом с кодировкой CP1251.
Символы, которых в CP1251 нет, рисуются как случайные буквы: знак
умножения × (U+00D7) превращается в «Ч», стрелка → тоже. Тире,
кавычки-лапки и middot в CP1251 есть и работают нормально.
Проверка вынесена в отдельный скрипт:
lua tests/check_glyphs.lua BotCommanderBotCommander/
BotCommander.toc порядок загрузки
BotCommander.lua инициализация, отправка приказов
Modules/
Compat.lua заплатки под 3.3.5a
Config.lua SavedVariables
Const.lua классы, приказы, уровни гира
Comm.lua очередь команд и приём ответов
Roster.lua состав группы
Theme.lua палитра и отрисовка
Widgets.lua кнопки, слайдеры, диалоги
UI_Main.lua каркас окна и вкладки
Composition.lua подсчёт состава и планирование добора
Raid.lua лидерство и конвертация в рейд
UI_Recruit.lua вкладка «Набор»
UI_Raid.lua вкладка «Рейд»
UI_Squad.lua вкладка «Отряд»
UI_Orders.lua вкладка «Приказы»
UI_Gear.lua вкладка «Экипировка»
UI_Settings.lua вкладка «Настройки»
Bar.lua полоса быстрых приказов
Slash.lua команды чата
tests/
wow_stub.lua эмуляция API клиента
run.lua прогон
Новая вкладка добавляется файлом UI_*.lua с
ns.RegisterPage{ title, build, refresh } и строкой в .toc.
Логика проверена тестами на эмуляции API. В живом клиенте 3.3.5a аддон ещё не запускался — визуальная отладка вёрстки предстоит.
MIT