Builds

Available downloads

Stable is the recommended track for most users. Alpha gets you the newest capabilities first.

Stable 1.9.9740 Alpha 1.9.9740
Windows 10/11 x64 Administrator rights
Release Notes

Track recent changes

Every release stays linked here so you can inspect what changed before you switch versions.

Release

1.6.8202

Permalink one year ago

New Node - Color Check - Early prototype

Allows to check that the color of a specific pixel(or region) matches selected one. Probably one of the most useful nodes out there - fast, very easy to use and very flexible. ColorCheck

New Node - Image Search - Early prototype

Allows to find image somewhere on the screen/in a selected region. ImageSearch

New Node - IfThenElse

Added new node, which is intended to be used by those who are more comfortable with "classic" logic building. IfThenElse

Bugfixes/Improvements

  • [BT] Improved nodes removal UX
Release

1.6.8193

Permalink one year ago

New Node - MLSearch - prototype

MLSearchNode New node in BTs and Macros, which allows you to run ML search over a region of a screen/window. It is still missing a lot of options currently present in MLSearchTrigger such as Configende/IoU thresholds, inference method, number of threads etc - those will be added in the nearest future.

Note, that by itself this node does not do anything - you have to pair it with other nodes such as MLFindClass or MouseMove to get anything from it. By default, it will pick the very first object and make it available for click via MouseMove - for some very simple scenarios that will be enough, for more complex one - use MLFindClass

The node will return Success only if there is at least one found prediction.

New Node - MLFindClass - prototype

MLFindClass

This node must be used in pair with MLSearch and allows to pick some class(~object) from the output generated by MLSearch - you can set some filtering parameters such as class name(s), minimum confidence threshold, size restrictions, etc. Those predictions which do not match any of those, will be filtered out.

Out of those predictions which will be left after filtering, you can make the node pick exactly one of them - it could be the very first in the list or the one with the highest confidence or even the one that is currently closest to the cursor.

The node will return Success only if there is at least one found prediction that matches all the criteria.

Of course, both MLSearch and MLFindClass could be used in combination with all other nodes. Here is, for example, priority-based target selection PriorityTargetSelectionUsing

Bugfixes/Improvements

  • [BT] Fixed a problem with zero-timeout BTs - they ticked only once
Release

1.6.8185

Permalink one month ago

Новый узел — Pixel Search (ранний прототип)

В EyeAuras появился новый узел, доступный в Macros и BT.

Это первый узел из новой серии, ориентированной на компьютерное зрение. В будущем такие узлы станут прямой заменой триггеров, которые сейчас используются в Auras.

Переход займет много времени, и до полного соответствия возможностям текущих триггеров новые узлы, скорее всего, будут добираться еще несколько месяцев. Но постепенно мы к этому придем.

Обратите внимание: узлы не выполняются сами по себе. Захват изображения и анализ происходят ровно в тот момент, когда узел исполняется.
PixelSearch

Производительность

На старте производительность узлов может быть ниже, чем у прежних триггеров. Это связано с новыми механизмами, реализованными в Computer Vision API, на котором работают эти узлы.

Клики по найденным изображениям и пикселям в Macros и Behavior Trees

Новые узлы записывают результаты в Variables, которые доступны через Bindings.

Сейчас для этого используется одна переменная — CvLastFoundRegion. Она хранит последнюю найденную область. Это могут быть координаты найденного пикселя, координаты найденного изображения или ML-класс.
Variables

Узел MouseMove

В MouseMove появилась новая кнопка, которая позволяет быстро и удобно использовать эту переменную как источник координат.
MouseMove

Просто нажмите на кнопку, и при выполнении MouseMove попытается прочитать координаты из этой переменной.
Binding

Исправления и улучшения

  • [BT] Добавлена новая кнопка, позволяющая запускать BT/узел до остановки
  • [TextSearch] Исправлена проблема в TextSearch: IncludeTextSegments не сохранялся в конфигурации
Release

1.6.8184

Permalink one month ago

Улучшения Computer Vision API — кэширование

Реализован первый прототип системы, которая должна позволить использовать CV API в BT и макросах. Общая идея такая: методы вроде ImageSearch/ColorSearch и т. п. теперь кэшируют базовые механизмы захвата и обработки, за счёт чего последующие похожие вызовы из других частей программы становятся значительно дешевле. Речь буквально о секундах против миллисекунд.

Механизм старается отслеживать, какие части программы используют разные части CV API, и кэшировать их соответствующим образом. Следите за потреблением памяти! Такие системы обычно склонны к утечкам памяти. И нередко серьёзным. Особенно пока всё ещё не до конца отстроено.

Само API пока ещё довольно сырое, и в следующих релизах оно будет дорабатываться.

WithoutCaching()

Этот метод теперь является частью Computer Vision API и позволяет полностью обойти механизм кэширования, если он вам не нужен — например, если вся программа состоит из одного C#-скрипта. В таком случае нет особого смысла полагаться на механизмы кэширования EA и платить за них дополнительную, пусть и небольшую, цену.

Исправления и улучшения

  • [Crash] Исправлен краш, возникавший в BT после последних изменений ("Already cancelled")
  • [Macros] Улучшена отзывчивость drag'n'drop в дереве
  • [Scripting] В MiniProfiler добавлен метод Clear()
  • [Scripting] Немного оптимизировано использование памяти (disposal AuraScript)
  • [Scripting] В aura исправлена ошибка, из-за которой выполнение Script могло не запускаться, если aura деактивировалась слишком быстро
Release

1.6.8179

Permalink one month ago

Изменения в Macros — узлы BT в Macros временно отключены

В последней версии я включил узлы Cooldown / Selector / Sequence для использования в Macros. Предполагалось, что это упростит создание ротаций и заодно принесёт в Macros некоторые возможности из BT.

Первые тесты показали, что этой функциональности ещё нужно время на доработку: она вызывает слишком много вопросов, особенно вокруг drag'n'drop.

Поэтому пока эти узлы снова отключены. Они вернутся позже, как только UX вокруг них будет готов.

Исправления и улучшения

  • [Macros] Улучшена отзывчивость drag'n'drop в дереве
Release

1.6.8174

Permalink one year ago

Крупные изменения в макросах

Система макросов получила серьёзное обновление: стало больше возможностей и поддерживаемых операций. На практике деревья поведения нередко оказывались довольно сложными для освоения, тогда как макросы изначально задумывались как промежуточный вариант между очень простыми аурами и более продвинутыми behavior trees. Эти изменения не только укрепляют эту роль, но и переносят в макросы многие сильные стороны и аур, и деревьев.

Разберём по порядку.

OnEnter / WhileActive / OnExit

Это базовая концепция из системы аур. Когда что-то происходит, срабатывает триггер. После этого в ауре последовательно вызываются следующие блоки:

  • OnEnter — вызывается сразу в момент активации триггера.
  • WhileActive — вызывается повторно, пока триггер остаётся активным.
  • OnExit — вызывается один раз в момент деактивации триггера.

Такое сочетание блоков позволяет описывать множество ситуаций и автоматизировать геймплей. Но ему часто не хватало гибкости — например, нельзя было добавлять дополнительные условия внутри блоков или повторять действия несколько раз. Для аур это и не было основной задачей, а вот для макросов такие возможности принципиальны.

Макросам не хватало только одного: возможности проверять собственное текущее состояние — понимать, должны ли они быть активны в данный момент.

Новая операция — CheckIsActive

Именно для этого добавлен новый узел CheckIsActive. Его единственная задача — позволить телу макроса проверить, активен ли макрос сейчас. Уже одного этого узла достаточно, чтобы макросы могли воспроизводить ту же логику, которую ауры использовали годами.

Вариантов, как может выглядеть такой макрос, много. Вот один из примеров:

Aura-like macro

Идея простая:

  • Первый блок (OnEnter) выполняется при входе.
  • Второй блок (WhileActive) на самом деле представляет собой цикл Repeat, который выполняется каждые 250ms, пока макрос остаётся активным.
  • Когда макрос деактивируется, цикл останавливается, и управление переходит к третьему блоку (OnExit), где выполняется логика выхода.

В ближайшем будущем появятся и дополнительные улучшения, которые сделают создание макросов в стиле аур ещё проще.

Вот ещё один пример — макрос, который ждёт деактивации и выполняет действие только при выходе. Это повторяет поведение ауры, в которой используется только OnExit.

OnExit


Узлы из Behavior Trees теперь доступны и в макросах

Целый набор узлов, который раньше был доступен только в Behavior Trees, теперь поддерживается и в макросах:

Примечание: первые три узла (Selector/Sequence/Cooldown) особенно полезны внутри блока Repeat — именно там они раскрываются лучше всего.


Пример: ротация на макросах

Соберём простую ротацию с двумя скиллами и базовой атакой, используя макросы:

BT

Здесь ничего необычного: проверяем кулдауны, затем доступность умений, после чего используем их по порядку. Если скиллы недоступны, выполняется базовая атака.

А вот точно та же самая логика, но уже оформленная внутри макроса:

Macros

Логика почти идентична, но теперь ротация строится прямо внутри макроса с помощью цикла, а для управления потоком используется Selector.

Небольшое замечание: судя по этому скриншоту, я немного переборщил с иконками и оформлением — выглядит слишком «шумно». Постараюсь это упростить.

И наконец — в обозримом будущем макросы также можно будет редактировать в графическом виде. Эта функция всё ещё находится в разработке, но для многих пользователей такой формат может быть заметно понятнее и удобнее.

Graph


Исправления / улучшения

  • [BTs] Теперь макросы должны корректно останавливаться, когда активным становится главное окно программы.
Release

1.6.8162

Permalink one year ago

C# Scripting - Keybinds prototype

New instrument which allows to initialize hotkeys right from scripts.

[Keybind("p")] // Simple example - triggers when 'p' is pressed
[Keybind("Ctrl+2")] // Triggers only when 'Ctrl + 2' is pressed
[Keybind("Ctrl+2", IgnoreModifiers = true)] // Triggers on ANY combination containing 'Ctrl + 2' (e.g., 'Ctrl + Alt + 2')
public void OnKey(){
    Log.Info("Key pressed");
}

[Keybind(Hotkey = "4", SuppressKey = false)] // Handles the key, but it will still pass through to other apps
public void HandleKeyWithInjectedServices(IAuraEventLoggingService loggingService){
    Log.Info("Key pressed");
    loggingService.LogMessage(new AuraEvent(){ Text = "Message", Loglevel = FluentLogLevel.Info });
}

C# Scripting - Dependency Injection improvements

If you're using GetService somewhere in the code - you're already using DI system in EyeAuras. I've made some improvements in that part which should simplify the scripts

Here is how exactly same script looks like in 3 different forms:

Current approach - get APIs via GetService

var sendInput = GetService<ISendInputScriptingApi>();
sendInput.MouseMoveTo(200, 100); // Moves the mouse to X200 Y100
sendInput.MouseRightClick(); // Performs a right mouse click

Now two new approaches which you could(and should!) start using in your scripts. I am thinking about automatically injecting current APIs (such as SendInput) into your scripts - this would simplify and generalize the code. E.g. for ISendInputScriptingApi the name would be SendInput (like in example below), for IPlaySoundScriptingApi - PlaySound, for ComputerVision that could be something like IComputerVisionExperimentalScriptingApi Cv { get; init; } I will publish this as a separate update.

ISendInputScriptingApi SendInput { get; init; } // Automatically initialized when the script starts

SendInput.MouseMoveTo(200, 100); // Moves the mouse to X200 Y100
SendInput.MouseRightClick(); // Performs a right mouse click

Now

[Dependency] ISendInputScriptingApi SendInput { get; set; }

SendInput.MouseMoveTo(200, 100); // Moves the mouse to X200 Y100
SendInput.MouseRightClick(); // Performs a right mouse click

Bugfixes/Improvements

  • [Scripting] Improved performance of scripts first start a bit (3-5%)
Release

1.6.8148

Permalink one year ago

Computer Vision API prototype

This is kinda huge. Implemented new experimental scripting API, which allows to work with EyeAuras Computer Vision without using Auras at all. All you have to do is write a few lines of code and all the tools built throughout the years are right at your disposal - image search, color search, neural networks, etc.

Note that this API is straight out of oven and is subject to change, not even mentioning bugs and problems - please send your reports

Getting started

This is how your work with that new API could look like. For starters, lets find and image which is somewhere on the screen.

var cv = GetService<IComputerVisionExperimentalScriptingApi>()
    .ForScreen() //search through entire screen, could be ForWindow - see below
    .EnableOsd(fps: 10); //optional, with enabled on-screen-display refreshed @ 10 fps

var position = cv.ImageSearch(targetImagePath);
if (position.IsEmpty)
{
    Log.Info($"Found @ {position}");
} else {
    Log.Info($"Image not found");
}

That is it - no auras, no triggers, no actions. Everything is right there in these few lines of code. Under the hood, EA will try to optimize all your calls as much as possible, e.g. cache images, cache models, pre-load everything, etc. There is a lot of performance optimization work yet to be done in that area, but even the current state should be more than enough for most tasks.

Features

Here is what we get from the get go:

  • supports loading images/models from local file system or URLs.
  • PixelSearch - could be used to either find the pixel of specific color/shade OR check whether pixel at a specific location matches expected color
  • ImageSearch - finds the image, plain and simple
  • TextSearch - recognizes text in a specified region of the screen/window. Currently not very customizable, will be extended in the nearest future
  • MLSearch - gets predictions from ML model - this call is mostly equivalent of the old Refresh()
  • OnScreenDisplay (OSD) - if enabled, will visualize each and every call to this API right on your screen. You can also set FPS of that OSD to lower the load on the system, 5-10 is more than enough to see what is going on under the hood
  • A LOT of new tools which will help you with usage of this API - window/region/point/color selectors, more on them below

Potential applications

  • more granular control over EA - you can control each and every CPU tick spent on computer vision
  • using Computer Vision straight from Macros/BTs. Soon we'll get Nodes that will be using that same API and will allow to avoid using AuraIsActive everywhere
  • small portable scripts that could be shared via forum - easier to understand what is happening when you do not have to go through multiple auras

Planned enhancements - only after current version stabilizes

  • making that API respect Bindings - that would allow to easier integrate APIs into trees and Macros
  • allow to "peek" into Triggers which are under the hood of that API - just like you can Preview these triggers in Auras
  • editor improvements - pre-load images (preview right in the editor) and better autocompletion in that part
  • loading embedded files - you put models/images right into the script and load them on-demand

This is an example of a bot which tracks and clicks on image (using AimTrainer) Things to note on OSD:

  • blue blinking rectangle - captured window
  • (optional) large yellow rectangle - captured area inside that window
  • small rectangle - successfull image match p.s. I've slowed everything down to get more meaningful demonstration, if tuned properly, the script can achieve up to 60-80 hits/second :D Example
//this is an example of a script
//which uses image search to find and follow a specific image inside a window
//It uses 2-times probing for optimization - if we know the previous location of the image
//it makes sense to repeat the search in that specific region first

//picking a window
var windowSelector = GetService<IWindowSelector>();
windowSelector.TargetWindow = "Aim Trainer";
var targetWindow = windowSelector.ActiveWindow ?? throw new InvalidOperationException("Window not found");

//this API is used to do Computer Vision stuff (image/text/color/ml search)
var cv = GetService<IComputerVisionExperimentalScriptingApi>()
    .ForWindow(targetWindow)  //for a specific window
    .EnableOsd(fps: 10); //with enabled on-screen-display refreshed @ 10 fps

//this API is used to generate mouse movements
var sendInput = GetService<ISendInputScriptingApi>();
sendInput.TargetWindow = targetWindow; //for a specific window

//could be either local file or URL
var targetImagePath = @"C:\Users\Xab3r\Documents\ShareX\Screenshots\2025-03\uupb4m3RQkfHa8sv.png";

//repeat until script is stopped
while (true)
{
	  //try to find the image
    var position = cv.ImageSearch(targetImagePath); 
    if (position.IsEmpty)
    {
        //not found
        continue;
    }

    Log.Info($"Found @ {position}");
    
    //found the image - moving the mouse to the center and clicking on object
    sendInput.MouseMoveTo(position.Center());
    sendInput.MouseClick();
}

or, alternatively, this is how the same loop could look like using neural network. ML is expected to be used by more experienced users, currently the method returns raw result in a form of WindowImageProcessedEventArgs - it provides maximum possible amount of control over extracted data

//as with the image, model path could be local or could point to remote file
var mlModelPath = @"https://s3.eyeauras.net/media/2025/03/AimLab_20240213193604OOBfW2f00U5K.onnx";
while (true)
{
    //get predictions from the model
    var result = cv.MLSearchRaw(mlModelPath); 
    if (!result.Detected.Predictions.Any())
    {
        //not found
        continue;
    }

    var currentPosition = result //WindowImageProcessedEventArgs
      .Detected //get detection results 
    	.Predictions //get predictions
    	.First() //more specifically, first one
      .Rectangle //get bounding box of that prediction IN LOCAL(aka World) coordinates
      .Transform(result.ViewportTransforms.WorldToWindow); //transform World coordinates to Window coordinates
    Log.Info($"Found via ML @ {currentPosition}");

    if (!currentPosition.IsEmpty)
    {
        //found the image - moving the mouse to the center
        sendInput.MouseMoveTo(currentPosition.ToWinRectangle().Center());
        sendInput.MouseClick();
    }
}

New coding tools

Alongside the new api, we needed more convenient tools which would allow to work with it. The main idea of those is that you use them to get some values which could then be inserted into the code, be it coordinates, color, window title or process name. This should greatly speedup process of development, especially for smaller scripts.

The list includes:

  • Color selector - allows to select a color Color selector
var pixelLocation = cv.PixelSearch(Color.FromArgb(26, 26, 26)); //<- Color.FromArgb(26, 26, 26) inserted by Color selector
  • Window Selector - allows you to pick a window and inserts the appropriate Window Match Expression - window title, process name, etc
var cv = GetService<IComputerVisionExperimentalScriptingApi>().ForWindow("l2.bin"); //<- "l2.bin" inserted by Process selector
  • Region selector - allows to pick region of window/screen
cv.MLSearchRaw(mlModelPath, new Rectangle(719, 406, 988, 584)); //<- new Rectangle(719, 406, 988, 584) inserted by Region selector
  • Point selector - allows to pick a specific point of window/screen
sendInput.MouseMoveTo(new Point(190, 393)); //<- new Point(190, 393) inserted by Point selector

Absolute/Relative coordinates

When you work with coordinates, do not forget that those could be either absolute(screen) or relative(window). Depending on use-case, one or another could be preferential. New tools support both - there are 2 different kinds of instruments, use at your own discretion. Tools

Bugfixes/Improvements

  • [Scripting] SendInput API is promoted from SendInputUnstableScriptingApi to SendInputScriptingApi - there were no changes for almost a year, looks stable enough
  • [Scripting] Error line numbers should now be properly highlighted/displayed in case of compilation errors
  • [Scripting] Added implicit conversion from string to WindowMatchExpression
  • [Scripting] Added new struct Percentage which could be used to denote that the value is in % (e.g. 0.1 = 10%)
  • [Scripting] All OSD objects now have Opacity
  • [Scripting] Added WorldToWindow transformation matrix to WindowImageProcessedEventArgs - this allows to very easily calculate in-window coordinates after Refresh()
  • [ColorSearch] Minor optimization - should be less memory-hungry and work a bit (~2-3%) faster
  • [OSD] Fixed a bug with OSD Rectangles coloring - R and G color channels were swapped
Release

1.6.8135

Permalink one month ago

Исправления и улучшения

  • [UI] Исправлена неприятная проблема с авторизацией: в некоторых случаях даже авторы паков не могли отправить обновление и получали ошибку Non-authorized users are not allowed to update shares
Release

1.6.8123

Permalink one year ago

Performance optimizations - ALPHA

Major changes in how EyeAuras manages memory for the images. May make things better, may break everything - we'll see.

ML Search Trigger - Added default models download

For a demonstration purposes and for some quick testing, added selector which allows you to download one of well-known Yolo models, including those which feature Segmentation and Classification. Selector is available only when model is NOT loaded.

E.g. here are results of Yolo 8 Small - Segmentation Yolo 8 Segmentation

and here are results of the latest Yolo 12 Turbo - Small - notice that even Turbo version nowadays not only yields more reliable results, but it also is able to detect more objects(person in the car) on the scene. Thank you, progress :) Yolo 12 Turbo - Small

ML Search Trigger - Changed Resize Method - Breaking change

When you're using ML model, it usually has hard-coded resolution, e.g. 640x640. When ML model gets fed with an Image, that image must be resized to accomodate model's resolution - there is no other way around it. Depending on how the training process is done, usually it is either Letterboxing (adding black bars without changing aspect ration) or Stretching.

Previously, EyeAuras was trying to "guess" the best method depending on model type and version, but this introduced more confusion than helped.

That is why, from now on, default resize method is Stretching and if you want to change that - just throw in Resize effect and pick whichever method fits your model best.

  1. Open Effects window Effects

  2. Added Resize Effect and setup it accordingly to your model resolution/type Letterbox

Bugfixes/Improvements

  • [Capture] Fixed a problem with region-selection in Preview window when Resize/Rescale effects were applied