1.9.9774
Daily-driver build with the safest release cadence.
- Updated
- 18 weeks ago
- File Size
- 515.39 MB
- Release Notes
- Open notes
Stable is the recommended track for most users. Alpha gets you the newest capabilities first.
Daily-driver build with the safest release cadence.
Fastest release track with the newest features and experiments.
Every release stays linked here so you can inspect what changed before you switch versions.
Made it so only a subset of all Triggers is not available for selection as Enabling Conditions. Yes, that removes some flexibility from the system, e.g. you no longer can use Image analysis triggers. But. This also makes the system a bit simpler to understand, especially for new users.
Enabling conditions always meant to be global On/Off switches. If you want something more dynamic - use Trees/Macros or Auras with Triggers in them.
I continue to rework existing EA components 1-by-1 to leverage new UI framework capabilities. Newer version of folder properties editor not only loads faster, but is also more flexible.
Legacy version

New version.
For the first revision I just wanted to reach feature-parity with existing functionality.

Made it so you can set Target Window/Input Simulator for each tree/macro separately. Keep in mind that they also respect the normal properties hierarchy.
E.g. if you set Target Window on a folder, in which Tree is located, it will respect that. But will also allow you to override that by setting another value on the tree itself.

.NET — это платформа, на которой построен EyeAuras. Она влияет буквально на всё: запуск, выделение памяти, работу с данными — практически на каждый небольшой внутренний механизм программы.
.NET 8 — не самая новая версия (превью .NET 10 уже существует), но обновление платформы не делают «просто потому что можно» — для этого нужна конкретная причина. Я выбрал именно .NET 8 (а не .NET 9/.NET 10), потому что только для этой версии есть прототип нового механизма управления памятью, который, судя по текущим тестам, буквально превосходит всё, что у нас было в .NET с самого начала его существования.
Вот одна из ключевых характеристик этого нового механизма по сравнению с тем, что используется сейчас (workstation-sustainedlowlatency). По сути, это длительность тех самых «подвисаний», которые иногда случаются и в худших случаях становятся заметны пользователю.

При разработке систем почти всегда приходится искать компромисс: можно тратить меньше CPU, но ценой дополнительной памяти, или экономить память, но увеличивать нагрузку на процессор. EyeAuras почти всегда выбирал первый вариант — память дешёвая, а процессорное время на обычных пользовательских ПК дорогое (это, разумеется, моё личное мнение).
Но у такого подхода есть и обратная сторона: любые улучшения в самой основе системы управления памятью должны особенно сильно влиять на EyeAuras. И этот новый механизм выглядит для нас очень подходящим вариантом. Посмотрим, как всё пойдёт, но в ближайшем будущем я ожидаю заметный прирост производительности.
ScriptContainerExtension — позже будет отдельная статья. Пока это alpha-стадия.This feature lets you link another aura from a BT/macro if that aura contains a C# Script action. In programming terms, this is similar to referencing another project.
All classes and types defined in that script then become available for use in the BT.
The reference mechanism has technically existed for several months, but until now it was mostly hidden because it was incomplete and did not work the way I wanted.

You can now create a C# class that analyzes the game—through computer vision triggers or by reading memory directly—and provides the data your BehaviorTree needs to make decisions.
Instead of cluttering the tree with dozens of variables and checks, you can create a single class, for example TheGame, that encapsulates all data collection.
This bot uses exactly the approach described below. It understands its environment, its own stats and the stats of nearby monsters, can build an action plan, and so on.
So far, the only limitation I’ve run into with this approach is my own ceiling.

Let’s look at the "Shared" aura and its files.
public sealed class TheGame {
public TheGame(IFluentLog log){
Log = log;
}
public IFluentLog Log {get;}
public int IntValue { get; private set; }
public void Refresh()
{
IntValue++; // в реальности здесь может быть чтение из памяти или обновление триггеров
Log.Info($"Refreshed the state, value: {IntValue}");
}
}
This class prepares everything needed by the logic: trigger initialization, memory reads, OSD creation—whatever is required.
When Refresh is called, the state is updated.
[Inject] IAuraTreeScriptingApi AuraTree {get; init;}
Log.Info("Bot is being started!");
var tree = AuraTree.GetBehaviorTreeByPath("./New tree");
var game = GetService<TheGame>();
tree["TheGame"] = game;
This is how the TheGame object is passed into the BT through variables.
This is the key part that was missing before. Objects passed through variables are now fully available, without restrictions.
Example tree structure:

var game = Variables.Get<CheatCrescendo.TheGame>("TheGame").Value;
game.Refresh();
In this node, we call Refresh, which updates the game state. By this point, the "TheGame" variable has already been initialized—either by the script or by another node.
return Run();
public IEnumerator<NodeStatus> Run(){
using var osd = GetService<IOnScreenCanvasScriptingApi>().Create();
var game = Variables.Get<CheatCrescendo.TheGame>("TheGame").Value;
var textOsd = osd.AddHtmlObject();
while (!cancellationToken.IsCancellationRequested){
textOsd.Html = $"{game.IntValue}";
yield return NodeStatus.Success;
}
}
This is an example of creating an OSD that displays the current IntValue.
It uses the new IEnumerator<NodeStatus> capability, which lets you split a node’s lifecycle into stages.
On the first run, the OSD is created; after that, it is simply updated.
Under the selector, you can place as many nodes as you want that check the current state.
All you need to do is access TheGame and call its methods.
For example, want to read HP directly from memory? Add a method to TheGame and call it from a BT node.
Need a color check via ColorSearch? Same idea.
Even movement between locations can be moved into a method: open a portal, select an option, click—everything lives in TheGame, and the BT just makes one call.
A number of performance-related improvements were added. If you notice any issues, please report them.
PoeShared.Blazor.Controls namespace, which contains UI controls, is now available in scripts by defaultAll action nodes (Wait, MouseMove, KeyPres, etc. - all of them) now have Outputs as well. Logic is exactly the same as it was with other nodes - linked node gets executed only if current node succeeded.

Мы внесли крупные изменения в то, как отрисовываются Macros, поэтому общий UX должен стать лучше. Если заметите какие-либо несоответствия или странности — пожалуйста, сообщите о них. В ближайшие недели будет еще несколько изменений, в том числе направленных на ускорение первоначального рендера.
Проще всего показать это на примере. Возьмем самый базовый Razor-компонент, созданный через:

На выходе получаем следующее.
@namespace GameGrind
@inherits BlazorReactiveComponent
<!-- your Razor/HTML markup here -->
namespace GameGrind;
public partial class UserComponent : BlazorReactiveComponent {
//some code here
}
Обратите внимание на случайный namespace (GameGrind в этом примере), который раньше автоматически вставлялся при добавлении нового Razor-компонента.
Это было небольшое, но очень неудобное техническое ограничение системы скриптинга. Например, такой код было неудобно копировать в другой скрипт EyeAuras: приходилось либо менять namespace, либо мириться с тем, что в одном коде у вас оказывалось несколько разных, никак не связанных между собой пространств имен. Оба варианта так себе.
Теперь объявление namespace больше не является обязательным — его можно не указывать и в .razor, и в .cs файлах, а EyeAuras автоматически подставит его во время компиляции. Меньше кода = меньше головной боли = лучше жизнь.
In one of the latest changes in 1.6 I've introduced a bug, which made switching between BTs/Macros excruciatingly slow in some cases. Especially if you had multiple macros with a large number of nodes in them.
This patch fixes this. I'll be closely monitoring the situation.
Please report any kind of UI slowness you notice.
Major addition to our library of tools. More details here.
Following the feedback, this patch fixes a problem which was found in auto-update system - with Security Measures option enabled, the app was not updating properly and reverted to the previous version upon restart.
Unfortunately, for obvious reasons I cannot just release an update which will fix that. There are two solutions:
Security Measures in Settings, update the app and enable it again.Please keep reporting found problems!
Была проделана большая работа, чтобы сделать Behavior Trees и всю систему скриптов более гибкими — теперь мы наконец можем создавать ботов, используя только Macros и Behavior Trees, без необходимости прибегать к Auras. Сочетание двух сложных систем (Auras и BT) усложняло понимание логики, добавленные ноды должны улучшить ситуацию.
Но, конечно, это ещё не все — в ближайшем будущем будет еще много изменений в новых нодах, особенно в часть предпросмотра.
На протяжении многих лет во всех триггерах типа Capture (Image/Color/Text/ML) требовался параметр Target Window — EyeAuras работала только с окнами.
Начиная с этой версии мы пробуем иной подход:
Target Window не указан, EA будет захватывать главный (Primary) экран.Target Window фактически прекращала работу триггеров. Теперь она лишь переключает режим на захват главного экрана. Я настоятельно рекомендую использовать Enabling Conditions, чтобы контролировать захват. Это важно! Проверьте старые триггеры, чтобы убедиться, что нет “тестовых” или “забытых” триггеров — они начнут потреблять CPU.Target Window не требуется.ВАЖНО! Конфигурации с несколькими мониторами пока не поддерживаются. Захватывается только главный экран. Поддержка будет расширена в будущем.

Крупные изменения в Macros: значительно расширена гибкость макросов.
Новые узлы на базе CV: узлы компьютерного зрения, являющиеся эквивалентами триггеров. Для простых ботов триггеры больше не нужны!
-- MLSearch в связке с MLFindClass — работает с ML-моделями и позволяет фильтровать результаты ML-поиска. В сочетании с улучшениями MouseMove можно за минуты собрать point-and-click-бота!
-- PixelSearch — находит пиксель заданного цвета.
-- ImageSearch — находит изображение.
-- ColorCheck — проверяет, соответствует ли цвет пикселя/области ожидаемому.
Новые узлы логики: позволяют управлять потоком выполнения
-- Interrupter — условное прерывание уже запущенных узлов.
-- Timeout — задаёт максимальное время, в течение которого дочерний узел может оставаться в состоянии Running.
-- CheckKeyState — проверяет текущее состояние указанной клавиши.
-- IfThenElse — if..then..else в форме узла BT — полезно для тех, кто только знакомится с BT-инфраструктурой.
Отмена/повтор в BT: теперь можно отменять/повторять добавление и удаление узлов с помощью Ctrl+Z / Ctrl+Y.
Активация по хоткею: BT и Macros можно запускать напрямую горячими клавишами.
Login Widget: простой виджет, который можно использовать в мини-приложениях для авторизации на базе EyeAuras.
PopOut View: всплывающее окно с BT/Macro в режиме «только чтение» для тестирования/отладки.
Поддержка BT-переменных: узлы вроде MouseMove могут использовать CvLastFoundRegion из CV-поисков.
.css, .js, .md, .dll) через IScriptFileProvider.[Keybind].[Dependency] или init-свойствам для сервисов вроде SendInput.AppStarted, позволяющие автоматизировать процессы без отображения UI EA.Программируемый интерфейс для Image Search, Pixel Search, ML Detection, Text OCR с OSD-оверлеем. Подробнее здесь.
IBlazorWindow появилось новое свойство TitleBarViewType, позволяющее полностью заменить заголовок окна.Clear() в MiniProfiler.WindowImageProcessedEventArgs добавлена матрица WorldToWindow, упрощающая вычисление координат в окне после Refresh().string в WindowMatchExpression.Percentage для обозначения процентных значений (например, 0.1 = 10 %).Opacity.LoginWidget.AuraScript).SendInput переведён из SendInputUnstableScriptingApi в SendInputScriptingApi — за год не менялся, достаточно стабилен.@Rowenor за находку!IncludeTextSegments не сохранялся в конфиге.Event Log.CodeEditor в развёрнутом окне.