1.9.9774
Daily-driver build with the safest release cadence.
- Updated
- 14 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.
v7612 #EA-735 от Steamy: Index is equal to or greater than CountBehaviorSubjectLoop rewriter — вложенные классы обрабатывались некорректноBindings Editor — в некоторых случаях биндинги создавались для ранее выбранного элемента, а не для текущегоMajor upgrade in the scripting engine - it can now compile Razor components. Blazor (Razor components are part of Blazor infrastructure) is one of the best (my opinion - for desktop apps just the best) UI technology which allows to have full power of C# and at the same time great performance/convenience of Web (HTML/CSS/JS) world.
EyeAuras is also using it under the hood since 2023 and is gradually being rewritten from WPF to Blazor. At some point in the future is expected to become full Blazor-driven app. Parts which are using it - BT editor, Macro editor, EventLog, Bindings, AuraTree. If some part of the program feels snappy you can bet it is using Blazor.
Previously, if you wanted to develop your own user interface for your bot, the only viable option was to use WebUI Overlay which at this point is using very dated text editor and, more importantly, uses older version of the scripting engine (V2) back from April 2023(!). Of course, you could load up the project in your IDE of choice (like Visual Studio or Rider), but that was definitely not very convenient and took some extra steps.
At the same time, BTs, Macros and C# Action/Trigger have been using the newer iteration of scripting engine since Jan 2024, but they newer really had Razor support as it was technically challenging task to add it there without preparing some other systems first. And, finally, today we're getting the first prototype. This is not just new feature - allowing users to create windows straight from the code makes it possible to develop full-blown standalone bots.



Встречайте новый инструмент для создания автоматизации — Macros.
Прежде чем переходить к деталям, коротко разберём, какие инструменты уже есть в EyeAuras и чем они отличаются.
Изначально в системе были только ауры, которые состоят из Triggers и Actions. Идея простая: когда срабатывает триггер, выполняются ваши действия.
Это по-прежнему хороший вариант для простых сценариев вида «событие → реакция», например для отправки уведомлений в Telegram или автоматизации HP/MP-потов. Но как только логика становится сложнее, такой подход быстро становится неудобным в поддержке: приходится учитывать все возможные события и реакции, которые могут происходить одновременно.
Чтобы решить эту проблему, были добавлены скрипты, которые дают вам 100% контроль над ботом и его действиями. Их главный минус очевиден: пользователю нужно знать C# и уметь писать код.
Кроме того, в некоторых случаях код — просто не лучший инструмент. Например, если вы пишете ротацию в чистом C#, вам приходится самостоятельно отслеживать кулдауны, приоритеты и множество условий. Для таких задач нужен был более удобный инструмент.
Behavior Trees предлагают другой способ описания логики и отлично зарекомендовали себя в игровых движках, где их используют для поведения NPC.
BT также решают проблему одновременной обработки нескольких событий: действия выполняются последовательно, а пользователь может задавать приоритеты на основе условий. В ряде случаев — например, при построении ротации — BT дают лучший опыт.
Но у них есть и заметный недостаток: высокий порог входа. В сочетании с порогом входа самого EyeAuras это сделало BT слишком сложными для многих пользователей, особенно для тех, кто не программирует. В итоге таким пользователям чаще всего приходилось оставаться на аурах, несмотря на их ограничения.
Представляем четвёртый вариант, который должен стать основным стартовым инструментом для автоматизации.
Концепция простая: у вас есть последовательность команд, которые выполняются одна за другой. Эти команды могут проверять состояние других аур, нажимать кнопки, запускать скрипты и многое другое. Поддерживаются циклы, условия и всё, что обычно ожидаешь от подобного инструмента.
По умолчанию макросы не реактивны — они не запускаются сами по себе, в отличие от Auras, которые всегда что-то делают. Чтобы запустить макрос, нужно либо назначить ему горячую клавишу, либо настроить другое Enabling Condition. Когда условие выполнено, макрос либо отработает один раз, либо будет запускаться периодически.
Главная сила этого подхода — в возможности комбинировать все три способа построения логики. Например, у вас могут быть ауры, которые отслеживают изображения/цвета или выполняют инференс нейросети. Затем через IfThenElse вы проверяете состояние этих аур и, если условия выполнены, передаёте управление в Behavior Tree или запускаете скрипт.
Представим, что вы хотите, чтобы персонаж фармил мобов в определённой точке. Если он умирает — вы воскрешаетесь, пополняете ресурсы в городе и возвращаетесь обратно на спот. Если пытаться собрать всю эту логику только на BT, придётся постоянно учитывать, где вы сейчас находитесь — в городе или на месте фарма. С макросами это решается проще: можно сделать один большой цикл, который работает, пока бот включён. Внутри него легко проверить, находитесь ли вы в городе, чтобы выполнить закупку, или уже стоите на споте, чтобы запустить farming behavior tree. Так вы разбиваете логику бота на небольшие и удобные части и не обязаны постоянно учитывать вообще все возможные состояния сразу.
Макросы подходят для самых разных задач: от простых последовательностей нажатий клавиш (как action Send Sequence, только гораздо гибче)

до сложных цепочек действий, в которых вместе используются скрипты, behavior trees и auras

На основной веб-странице появилась новая кнопка, которая позволяет скачать архив с самой свежей версией. Это полностью портативная сборка с конфигурацией, отделённой от основной установки приложения. Такой механизм уже несколько месяцев тестировался в Packs и должен работать без серьёзных проблем.

Реализована тестовая поддержка моделей машинного обучения на базе Yolo 10. Yolo 10 — это передовая технология для детекции объектов в реальном времени.

В Behavior Trees появилась новая возможность: теперь поддеревья можно помечать как shared. После этого из toolbar можно создавать узлы, которые напрямую ссылаются на конкретное поддерево.

Этот узел теперь доступен в Macros и BTs.
Есть два варианта узла: для абсолютного перемещения мыши и для относительного перемещения, которое учитывает текущую позицию курсора.
Как и в Send Sequence, теперь можно привязывать X и Y, связывать ауры и точно управлять тем, куда именно кликать по найденному изображению или объекту. Есть два режима редактирования: простой и расширенный.

Расширенный режим выглядит так (да, элементов управления тут действительно многовато):

Теперь узел KeyPress также умеет отправлять ввод, связанный с мышью. Пока я не на 100% уверен, что наличие нескольких input-узлов действительно улучшит UX, но посмотрим, как это покажет себя на практике.

Одна из ключевых возможностей EyeAuras — это движок C#-скриптов, который позволяет компилировать, загружать и выполнять ваш код в реальном времени. Он используется в actions, triggers и behavior trees. Поскольку ограничений на код почти нет, пользователи нередко допускают ошибки, которые приводят к крашам, deadlock'ам и другим типичным проблемам программирования. Я уже упоминал это в changelog 7060.
В этой версии я добавил механизм, который расширяет ваш код, чтобы уменьшить последствия распространённых ошибок. Например:
TaskThread.Sleep вместо метода Sleep из EyeAuras, который заметно точнее и умеет отменятьсяwhile(true){} вместо while(!cancellationToken.IsCancellationRequested){}Этот механизм сможет отловить только часть ошибок, и основная ответственность всё равно остаётся на авторе скрипта. Но в целом такая система должна немного упростить жизнь.
Если заметите что-то необычное — обязательно сообщайте.
Макросы можно использовать просто для отправки последовательностей нажатий клавиш:

А можно строить полноценную логику rebuff/target/farm с условиями, циклами и скриптами:

По сравнению с BT этот инструмент гораздо проще и понятнее. По сути, вы собираете программу из небольших блоков, поэтому он намного доступнее для новых пользователей, которые хотят делать собственную автоматизацию.
В свойства папки добавлен выбор Input Smoother. Input Smoother определяет, как именно мышь перемещается из точки A в точку B и на сколько шагов разбивается это движение.
Как и другие настройки, этот параметр распространяется на все элементы внутри папки — узлы, actions, triggers и т. д.

Выходит новая версия редактора ссылок. Он появляется везде, где вы что-то связываете, например в AuraIsActive или Enabling Conditions.

Новый редактор гораздо гибче и должен упростить внесение изменений. Когда эта версия станет стабильнее, я добавлю “Recent”, “Favourites” и другие улучшения, которые уже запланированы. Если увидите проблемы или захотите предложить улучшения — обязательно сообщайте. Первая реализация может содержать баги, но я надеюсь, что она довольно быстро превзойдёт старый вариант.

Ожидание чего-либо — критически важная часть автоматизации. EyeAuras занимается этим постоянно: таймауты между нажатиями клавиш, поддержание стабильного FPS захвата, пользовательские таймауты в скриптах. Стандартные методы операционной системы, такие как Thread.Sleep и Task.Delay, недостаточно точны, поэтому я реализовал комбинацию подходов, которая обеспечивала лучшую точность.
Этот механизм позволял делать ожидания с точностью меньше миллисекунды и хорошо работал 5–6 месяцев. Но у высокой точности есть цена, а для большинства операций такая точность просто не нужна.
Поэтому в ближайшие месяцы мы будем тестировать третью версию Sleep(), которая должна найти баланс между точностью и производительностью. В среднем ожидаемая точность — в пределах 0.5 - 5ms.
То есть если вы задаёте ожидание 1ms, фактическое время будет примерно в диапазоне 1 - 1.5ms, чего более чем достаточно для большинства сценариев. Для более длинных таймаутов, например 100ms, диапазон составит 100 - 105ms.
В обмен на небольшую потерю точности вы получите лучшую производительность. Посмотрим, как это покажет себя в реальных условиях.

Этот эффект очень полезен для анализа: он переводит изображение в чёрно-белый вид, что сильно упрощает дальнейшие проверки. Например, вместо красной полоски HP с разными оттенками можно получить чёрно-белое изображение, где белый цвет обозначает заполненную часть полосы.
Ещё одна техника упрощения изображения. Color Quantization уменьшает общее количество цветов на изображении. Сам по себе эффект не слишком полезен, но в сочетании с другими эффектами может быть очень кстати.
Триггер TextSearch теперь отдаёт текстовые сегменты и их расположение. Сейчас эта возможность доступна только через C# scripts и позволяет кликать по конкретным словам.
Пример можно посмотреть здесь: https://wiki.eyeauras.net/ru/scripting/examples/basic/click-on-text
В будущем аналогичная функциональность будет доступна и через UI.
Для некоторых редких сценариев в скриптах добавлена новая опция — "Include All Matches". По умолчанию ImageSearch находит лучший возможный матч и отслеживает его перемещение, не сканируя всё изображение заново на каждом кадре. Новая опция отключает эти оптимизации, поэтому при каждом tick выполняется полное сканирование изображения. Плюс в том, что вы получаете доступ сразу к нескольким кандидатам и их похожести. Минус — серьёзное влияние на производительность.
Чтобы получить доступ ко всем найденным объектам, используйте TemplateMatches, который возвращается как часть результата ImageSearchTrigger.Refresh:
public interface IImageSearchDetectionResult : ICaptureTriggerDetectionResult
{
...
/// <summary>
/// Contains an array of all successful template matches and their bounds/similarity.
/// Will contain more than one element only if Include All Matches is enabled in ImageSearchTrigger.
/// </summary>
public ImmutableArray<TemplateMatchResult> TemplateMatches { get; init; }
...
}

Это крайне тяжёлая задача для CPU. На 1920x1080 вы, скорее всего, получите максимум 2-3 FPS при полном сканировании. Это огромная разница по сравнению с ML search, который на той же задаче и том же разрешении может дать до 60 FPS. Поэтому если вам действительно нужно детектировать несколько экземпляров одного и того же объекта, я очень рекомендую посмотреть в сторону обучения модели Yolo и использовать её вместо этого.
Load from preview pane теперь не копирует debug-данныеSystem.InvalidCastException: Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.Windows.FrameworkTemplate' by Mintrok #EA-655T в Nullable of T (например, int в int?) #EA-660 v7569 by GwynoddessaxScriptVariable добавлен Listen() — теперь можно использовать его вместо WatchCurrentValueISendInputUnstableScriptingApi добавлен TargetWindow — это позволяет использовать Windows Message API и отправлять ввод в фоновые окнаCancellableMethodStatementRewriter, из-за которого некоторые скрипты не компилировалисьoddessaxYOLO11 — это последняя версия серии Ultralytics YOLO для детектирования объектов в реальном времени.

Cannot access a disposed object. #EA-687 v7598 by ganyaWorked on stability - should solve those problems which crashed server under peak load. Now it should just slow down :D Thanks everyone who became part of that pleasant problem, welcome aboard :)
Added new button to main web page which allow to download archive with the most recent version. It will be fully portable with a config that is separate from the main app. This mechanism has already been tested for a few months in Packs, so should work without major issues.
p.s. Please note that portable version is not available for Stable yet, it will be available right after I will push alpha to stable in the next few days.

System.InvalidCastException: Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.Windows.FrameworkTemplate' by Mintrok #EA-655T в Nullable of T (например, int в int?) #EA-660 v7569 by GwynVery useful for analysis as it allows to split image to black and white which makes further checks much more simple. E.g. instead of having red HP bar with a lot of shades, you can convert it to black/white image where white is filled area of the bar.
Another image simplification technique, allows to reduce total number of colors in the image. By itself it is mostly useless, but can help in combination with other effects.
Made is to IsMaximized in ExecuteScriptNode is stored in the node itself
Load from preview pane avoids copying debug dataОжидание чего-либо — обязательная часть любой автоматизации. EyeAuras постоянно с этим работает: задержки между нажатиями клавиш, поддержание стабильного FPS захвата, пользовательские таймауты в скриптах. Стандартные инструменты операционной системы и базовые методы вроде Thread.Sleep, Task.Delay и некоторых других недостаточно точны, поэтому в какой-то момент пришлось реализовать комбинацию подходов, которая обеспечивала лучшую точность.
Этот механизм позволял делать ожидания с точностью до долей миллисекунды и использовался последние 5–6 месяцев. К сожалению, такая точность имеет свою цену, и для большинства операций она попросту не нужна.
Поэтому в ближайшие несколько месяцев мы будем тестировать 3-ю версию Sleep(), которая должна стать компромиссом между точностью и затратами по производительности. В среднем ожидаемая точность — до 0.5 - 5ms.
Это значит, что если вы задаёте ожидание 1ms, фактическая задержка будет примерно в диапазоне 1 - 1.5ms, чего более чем достаточно для большинства сценариев. Для более длинных таймаутов, например 100ms, фактическое время может быть в диапазоне 100 - 105ms.
Взамен снижения точности вы получите заметно лучшую производительность. Посмотрим, как это покажет себя в реальных сценариях.
В рамках разработки этой функции я также добавил интеграционный слой, который позволит использовать тот механизм Sleep(), который лучше подходит именно под ваш сценарий. Подробнее об этом расскажу позже.

ExecuteScriptNode свойство IsMaximized теперь сохраняется в самом узлеMaximized) или нетScriptVariable добавлен Listen() — теперь его можно использовать вместо WatchCurrentValue