Builds

Available downloads

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

Stable 1.9.9774 Alpha 1.9.9801
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.7.8508

Permalink one year ago

ImGui integration EN / RU

Started working on native integration with ImGui - this is alternative approach to script/UI creation in EyeAuras. This should be the simplest one for those who only recently started coding - yes, some boilerplate code is requires to get things started, but after that it is very easy to understand. And ChatGPT can greatly help you.

Finally, it is possible to create truly 1-script mini-apps that incapsulate both UI and automation logic.

Demo

Bugfixes/Improvements

  • None that time
Release

1.7.8464

Permalink one year ago

Bugfixes/Improvements

  • [Scripting] Memory reading APIs are now case-insensitive by default
  • [Scripting] Memory reading APIs - Added ReadManaged<T> which is slower than Read<T>, but respects MarshalAs and managed structures
  • [Scripting] Memory reading APIs are now supporting both x86 and x64 as targets. Keep in mind that your own process is x64 anyways.
  • [UI] Fixed a problem with new Folder Editor selection
  • [Crash] Fixed nasty crash in a new Folder editor
Release

1.7.8411

Permalink 3 months ago

Улучшения DMA-интеграции

EyeAuras использует LeechCore — отличную библиотеку, разработанную Ulf Frisk, — для интеграции с DMA-устройствами. По сути, LeechCore является фактическим стандартом, с которым совместимо большинство подобных устройств.

Сейчас эта интеграция все еще находится на стадии alpha. Если хотите помочь с тестированием или вам интересно что-то разрабатывать в этом направлении — напишите мне.

На практике разработка с использованием FPGA-платы ничем не отличается от работы через ReadProcessMemory: EyeAuras берет на себя всю сложность управления LC API, переподключения, обработку ошибок и остальное. Вам остается только писать код.

Подробнее об этом здесь

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

  • [Scripting] Исправлена проблема, из-за которой FPGA-плата не освобождалась корректно при уничтожении скрипта
Release

1.7.8398

Permalink one year ago

Enabling conditions changes

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.

Folder properties editor rework

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 Legacy editor

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

Default properties in Trees/Macros

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.

Settings

Bugfixes/Improvements

  • Nothing in this version
Release

1.7.8392

Permalink 3 months ago

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

  • [Скрипты] Исправлен экспорт в .csproj
  • [UI] Исправлен сбой, который в некоторых случаях возникал при изменении размера окна
  • [UI] Улучшено логирование отмены скриптов: теперь выводится причина, по которой пользовательский скрипт был отменён, например активация главного окна
Release

1.7.8383

Permalink 3 months ago

Переход на .NET 8

.NET — это платформа, на которой построен EyeAuras. Она влияет буквально на всё: запуск, выделение памяти, работу с данными — практически на каждый небольшой внутренний механизм программы.

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

Вот одна из ключевых характеристик этого нового механизма по сравнению с тем, что используется сейчас (workstation-sustainedlowlatency). По сути, это длительность тех самых «подвисаний», которые иногда случаются и в худших случаях становятся заметны пользователю.

GC time

Память vs CPU

При разработке систем почти всегда приходится искать компромисс: можно тратить меньше CPU, но ценой дополнительной памяти, или экономить память, но увеличивать нагрузку на процессор. EyeAuras почти всегда выбирал первый вариант — память дешёвая, а процессорное время на обычных пользовательских ПК дорогое (это, разумеется, моё личное мнение).

Но у такого подхода есть и обратная сторона: любые улучшения в самой основе системы управления памятью должны особенно сильно влиять на EyeAuras. И этот новый механизм выглядит для нас очень подходящим вариантом. Посмотрим, как всё пойдёт, но в ближайшем будущем я ожидаю заметный прирост производительности.

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

  • [Scripting] Добавлен прототип ScriptContainerExtension — позже будет отдельная статья. Пока это alpha-стадия.
Release

1.7.8378

Permalink one year ago

C#-скрипты — Advanced — Ссылки на скрипты из BT/Макросов

Эта функция позволяет вам привязать из BT/макроса другую ауру, содержащую действие C# Script — это эквивалентно тому, как если бы вы «ссылались» на другой проект в программировании.
Все классы и типы, определённые в этом скрипте, станут доступны для использования в BT.

Механизм ссылок существует уже несколько месяцев, но ранее он был «спрятан» от глаз, так как был неполноценным и не работал так, как мне хотелось.

Ссылки


Зачем это нужно?

Теперь вы можете создать класс C#, который будет анализировать игру — через триггеры компьютерного зрения или напрямую читая память — и предоставлять BehaviorTree необходимые данные для принятия решений.
Вместо того чтобы загромождать дерево десятками переменных и проверок, вы просто создаёте один класс, например TheGame, который инкапсулирует всё получение информации.


Пример бота

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

Ссылка


Аура со скриптом внутри

Посмотрим на "Shared"-ауру и её файлы.

TheGame.cs

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}");
    }
}

Класс готовит всё для логики: инициализация триггеров, чтение из памяти, создание OSD — всё, что нужно. Когда вызывается Refresh, происходит обновление состояния.


Script.csx

[Inject] IAuraTreeScriptingApi AuraTree {get; init;}

Log.Info("Bot is being started!");

var tree = AuraTree.GetBehaviorTreeByPath("./New tree");
var game = GetService<TheGame>();
tree["TheGame"] = game;

Так мы передаём объект TheGame в BT через переменные. Это ключевая часть, которая раньше отсутствовала. Теперь передаваемые через переменные объекты доступны полностью и без ограничений.


Behavior Tree

Пример структуры дерева: BT


Обновление данных

var game = Variables.Get<CheatCrescendo.TheGame>("TheGame").Value;
game.Refresh();

В этом узле вызываем Refresh, который обновляет состояние игры. Переменная "TheGame" к этому моменту уже инициализирована — либо скриптом, либо другой нодой.


Отрисовка OSD

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;
    }
}

Это пример создания OSD, который визуализирует текущее значение IntValue. Используется новая возможность — IEnumerator<NodeStatus>, позволяющая "разбивать" жизненный цикл ноды. В первом запуске создаётся OSD, далее оно просто обновляется.


Логика игры

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

Например, хотите получить HP напрямую из памяти? Напишите метод в TheGame — вызывайте его из BT-ноды. Нужна проверка по цвету через ColorSearch? То же самое. Даже движение между локациями можно вынести в метод: открыть портал, выбрать опцию, кликнуть — всё в TheGame, один вызов из BT.


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

Добавлено множество улучшений, влияющих на производительность. Если заметите проблемы — сообщайте.


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

  • [Behavior Trees] Прототип параллельной загрузки узлов — должно ускорить загрузку больших деревьев
  • [Scripting] Пространство имён PoeShared.Blazor.Controls, содержащее элементы управления, теперь доступно из скриптов по умолчанию
Release

1.7.8356

Permalink one year ago

Bugfixes/Improvements

  • [Behavior Trees] Fixed PopOut crash
  • [Behavior Trees] Fixed Action nodes not invoking linked Childs
  • [Behavior Trees] Fixed "Toggle Nodes" not working properly
  • [UI] Drag/Resize improvement - should feel a bit more "snappy" now
  • [DMA] Changed DLL loading order - should fix a problem with LeechCore not initializing properly on some OSes/PCs
Release

1.7.8353

Permalink one year ago

Behavior Trees - Action Nodes now have outputs

All 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.

Output

Bugfixes/Improvements

  • [Behavior Trees] Fixed a bug - CTRL+A sometimes selected more than it should've
Release

1.7.8348

Permalink one year ago

Performance - Macros UI optimizations

Done some major changes in how Macros are rendered, the overall UX should be better. Please, report any inconsistentices you may notice. There will be more changes in the following weeks, trying to address initial (first) rendering performance.

C# Scripting - Razor namespaces declaration

Probably it will be easier to show, lets take, for example a very basic Razor component created via : New Component

That is what we get as a result

UserComponent.razor

@namespace GameGrind
@inherits BlazorReactiveComponent
<!-- your Razor/HTML markup here -->

UserComponent.cs

namespace GameGrind;

public partial class UserComponent : BlazorReactiveComponent {
    //some code here
}

Note that random namespace (GameGrind, in this case) which previously was automatically inserted whenever you added a new Razor Component. This is minor, but very inconvenient technical requirement that the scripting system had. One of such inconveniences would be the fact that such code could not be easily copy-pasted to another EyeAuras script - you either had to change the namespace OR had to deal with the fact that you have multiple different non-related namespaces in your code. None of those are good thing to have. From now on, namespace declaration is not a requirement anymore - you can omit namespace declaration in BOTH .razor and .cs files and EyeAuras will automatically insert them during compilation. Less code = less headache = better life.

Bugfixes/Improvements

  • [Overlays] Changed how overlay is rendered on the screen (Hide/Show order during startup) - should make things appear on the screen a bit faster
  • [UI] Improved responsiveness of drag'n'drop in Macros/BTs
  • [Macros] Fixed a problem with Repeat/IfThenElse - drag'n'drop was not working properly
  • [Macros] Fixed a problem with Cloning - from now, the entire hierarchy will be preserved and not only the selected node