Skip to content

Latest commit

 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BotCommander

Аддон для World of Warcraft 3.3.5a (WotLK) — панель управления ботами mod-playerbots.

Собрать группу нужного состава, подогнать её под свой уровень и отдавать приказы — не набирая команды в чате.

Серверный модуль не требуется. Аддон работает на стоковом mod-playerbots и говорит с ботами теми же каналами, что и вы вручную.


Что умеет

Набор. Кнопка на каждый класс: нажали — бот призван и сам вошёл в группу. Четыре готовых состава (классическая пятёрка, живучая, взрывной урон, поддержка) собираются одним кликом. Полоска внизу показывает текущий состав цветами классов.

Кнопка «Добрать до пятёрки» считает, кого не хватает, и призывает только их. Если в группе уже два ДД — придут танк, лекарь и один ДД; если танк с лекарем на месте — только три ДД. Под кнопкой всегда написано, кого именно она позовёт.

Галочка слева от каждого класса ограничивает выбор: снимите «Мага» — и автодобор с набором рейда его не тронут.

Рейд. Кнопка «Разложить по группам» пересортировывает подгруппы: танки в первую, лекари поровну по остальным, ДД заполняют места. После балансировки запускается сама.

Кнопка «Сбалансировать» приводит уже набранный рейд к выбранному составу: распускает лишних и призывает недостающих. Выгоняет в первую очередь мёртвых, офлайн и тех, кто сильнее отстал по уровню; вас и отмеченных живых игроков не трогает никогда.

Размер от 2 до 40 и четыре состава на выбор — «Классический», «Запас прочности», «Напролом», «Молот 40-х». У каждого показано, как он разложится на выбранный размер (танки / лекари / ДД). Кнопка переводит группу в рейд, если вы лидер, и призывает недостающих, соблюдая соотношение ролей и не сваливая рейд в двадцать магов. Призванные сразу получают боевую стратегию по своей роли.

Отряд. Список участников: класс, уровень, жив ли. Уровень подсвечивается жёлтым при расхождении с вашим на 5+, красным на 10+ — сразу видно, кого пора подтянуть. Клик по строке выделяет бота в игре, правый клик распускает. У каждой строки четыре быстрые кнопки.

Приказы. Сначала выбираете адресата (все / танки / лекари / ДД / дальний бой / ближний бой), затем приказ. Девять команд с иконками, шесть боевых ролей, поле для произвольной команды.

Экипировка. Шесть уровней качества гира — кнопки окрашены в цвет качества предмета. Обслуживание: заклинания, расходники, починка, таланты, воскрешение. Внизу — сводка по разбросу уровней в группе.

Настройки. Ваша роль в группе и роль каждого живого товарища — переключателем «танк / лекарь / ДД / авто». Плюс масштаб, прозрачность, пауза между командами и список живых игроков.

Полоса быстрых приказов. Шесть иконок поверх интерфейса — то, что нужно в бою, без открытия окна.


Установка

  1. Скачайте репозиторий.
  2. Скопируйте папку BotCommander (внутреннюю, ту, где лежит BotCommander.toc) в World of Warcraft/Interface/AddOns/.
  3. Путь должен получиться таким: Interface/AddOns/BotCommander/BotCommander.toc
  4. Перезапустите клиент. Если аддон не виден в списке — включите «Загружать устаревшие аддоны» на экране выбора персонажа.

Команды чата

Команда Действие
/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.lua

tests/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 BotCommander

Структура

BotCommander/
  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

About

Панель управления ботами mod-playerbots для WoW 3.3.5a. Чистый Lua-аддон, серверный модуль не требуется.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages