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, которые используют эти значения.



Передать снимок в уже работающее дерево
Этот рецепт предполагает запущенный 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 посмотреть
IBlazorWindowBlazorReactiveComponent<T>IDialogWindowUnstableScriptingApiIWindowHandleIWindowSelectorIWindowMatcherIBehaviorTreeAccessorScriptVariable<T>IProcess
Чего избегать
- Больших панелей управления.
- Использования окна как слоя рендера для overlay.
- Скрытия ошибок привязки к процессу или чтения памяти.
- Сохранения сырых handle, id процесса или runtime-адресов.
Что почитать дальше
windows-subsystems/blazor-windows.mdwindows-subsystems/window-handles.mdmemory/processes.mdauras/overview.mdscripting/runtime.md