AI-рецепт бота на Memory API и Behavior Tree

Короткий рецепт по чтению памяти и передаче данных в автоматизацию Behavior Tree.

Бот на Memory API и Behavior Tree

ПолеЗначение
СложностьСредняя
ПримерPOE2 Helper
Конечная цельПрочитать небольшой набор значений из памяти, показать их пользователю и дать Behavior Tree использовать те же данные.
Ключевые технологииMemory API, Behavior Tree, окно Blazor, общие переменные скрипта

Когда использовать

  • Основная логика бота уже находится в Behavior Tree.
  • Скрипту нужно читать память и передавать несколько значений в это дерево.
  • Пользователю также нужно небольшое окно, где эти значения видны.
  • Полноценная панель бота на ImGui для такой задачи была бы избыточной.

Пример

Path of Exile 2 Helper - Auto HP/MP показывает этот подход: небольшое окно статуса и настроек, чтение памяти на C# и узлы Behavior Tree, которые используют эти значения.

Небольшое окно статуса и конфигурации

Значения из памяти передаются в Behavior Tree

Behavior Tree использует значения, полученные из памяти

Передать снимок в уже работающее дерево

Этот рецепт предполагает запущенный EyeAuras, созданное пользователем дерево и скрипт чтения в известной области переменных. Самостоятельного движка BT здесь нет: корень дерева зависит от контекста ауры, триггеров, состояния загрузки и планировщика хоста.

На вход чтению нужны выбранный PID, версия layout и абсолютный адрес HP либо проверенная цепочка указателей. Владелец открывает reader через загруженный MemoryModule и читает process.Memory.Read<int>(healthAddress). Это одно значение, поэтому байтовая упаковка не нужна. Чтение выполняют вне UI и публикуют вместе с признаком доступности, временем чтения и личностью подключения. Область и имя переменной должны быть одинаковыми у producer и узла-потребителя; совпадения короткого имени в разных папках недостаточно.

Дерево сначала проверяет, что снимок относится к текущему подключению и достаточно свежий, затем сравнивает HP с порогом и выполняет свою настроенную ветку. Blazor-окно показывает тот же снимок и статус чтения. Отсутствующая переменная не означает HP = 0: ScriptVariable<T>.Value может вернуть default, для различения отсутствия используйте TryGetValue и отдельный статус доступности.

Ожидаемый результат: дерево и окно принимают решение по одному опубликованному состоянию. При потере процесса автоматизация прекращает использовать старое значение. При остановке владелец отменяет цикл чтения, дожидается его завершения и закрывает reader; синхронное чтение не прерывается токеном. Конкретные offsets, период и ветки дерева — входы проекта, их нельзя восстановить по одному этому рецепту. Контракты памяти, переменных и stateful-корня сверены с EyeAuras 20fd3d4.

Общая схема

  • Читайте только те значения из памяти, которые действительно нужны Behavior Tree.
  • Сохраняйте или публикуйте эти значения в небольшом общем объекте значений или в переменных скрипта.
  • Показывайте те же значения в компактном окне Blazor.
  • Дайте узлам Behavior Tree читать эти значения и решать, что делать дальше.
  • Явно показывайте в интерфейсе потерю процесса или окна.

Что нужно решить заранее

  • Как пользователь будет выбирать процесс или окно.
  • Какие значения нужно передавать в Behavior Tree.
  • Какие значения нужны только для отображения.
  • Каким должно быть окно: обычным, поверх всех окон или компактным.
  • Будет ли Behavior Tree читать переменные скрипта или вызывать скрипт/сервис.

Какие API посмотреть

  • IBlazorWindow
  • BlazorReactiveComponent<T>
  • IDialogWindowUnstableScriptingApi
  • IWindowHandle
  • IWindowSelector
  • IWindowMatcher
  • IBehaviorTreeAccessor
  • ScriptVariable<T>
  • IProcess

Чего избегать

  • Больших панелей управления.
  • Использования окна как слоя рендера для overlay.
  • Скрытия ошибок привязки к процессу или чтения памяти.
  • Сохранения сырых handle, id процесса или runtime-адресов.

Что почитать дальше

  • windows-subsystems/blazor-windows.md
  • windows-subsystems/window-handles.md
  • memory/processes.md
  • auras/overview.md
  • scripting/runtime.md