Stable

Latest version that is considered stable
v1.6.7978 1 week ago
Download

Alpha

Early version contains newest features and usually better performance but may be less stable
v1.6.7988 3 days ago
Download

1.6.7978

11 days ago

Bugfixes/Improvements

  • [SendInput] Fixed a problem where interchanging Delays/SendInputs could block each other. This is a bug that has been introduced in the last version.

1.6.7966

one month ago

New Release - 1.6 (RU/EN)

Most of the changes done in the last 3 months were revolving around scripting capabilities. We got new overlays, major improvements in NuGet packages and external assemblies integration, editor improvements and, finally Export and Live Import, which allow to use EA and your favourite IDE of choice together.

What is next ?

Packing - slimming down packs and sublicenses

Brinding 600+MB executable alongside 200KB scripts seems unnatural, especially considering overall direction with you, users, being able to publish licensed content. Showing new users UI with 100 of buttons/checkboxes and sliders is frigthening to say the least. Plus all the extra luggage which program carries around. In 2025 the goal will be to implement a system which will be automatically disabling those features of UI which are not used. Allow authors to hide EyeAuras UI, disable computer-vision or ML modules, etc. There are many technical challenges in this approach, but they all seem solvable. We'll see in the nearest future.

Memory reading API - DMA integration

DMA cards are small devices which allow to read memory of PC without OS involvement via direct hardware-2-hardware communications. This makes process of detection of such reads extremely difficult, which means very good level of security for end-users. Memory API which was added in November targets to unify the process of working with RAM via OS-level commands (ReadProcessMemory), those using drivers and, eventually DMA-cards. You develop something using easy-to-use and convenient RPM. Then switch to much safer DMA. By simply switching one line of code you will allow user to pick whatever level of security he wants to achieve.

UI performance

Became better in 2024 with the new UI framework overtaking older one in most parts of the program, but still have a long way to go, especially when we're talking about working with large number of auras (500+). Primary focus in 2025 will be making sure that Packs are loading as quickly as possible as this is the primary form of distribution of your scripts. Probably we'll get some slimmed down alternative UI which won't be as feature rich and will focus on just loading everything very quickly and efficiently.

Packing improvements

Now, after you've downloaded a pack from the website - be it a fishing bot for Throne&Liberty(1 or 2), Path of Exile Helper or any other one - you can now much-much easier track when it will be updated by the author. You will get a notification in the pack right away - for now it will be a small badge in the folder name. Afterwards, I may add some other form of notification.

Pack

Pack settings merging

But just getting updates is not everything thing feature brings. More often than not, when you started using someone elses pack, you do some changes in it - set up your own keybinds, change window name, change some image, etc. Now you won't be losing those changes even when new version of the pack gets released by the author - EyeAuras will pick your local changes, compare them with author's changes(remote) and will Merge them together. Best case scenario - you get all the new changes which author of the pack did AND you have your previously done changes intact. This mechanism is still fresh out of the oven and could have some problems in it, but now, when this feature finally came into play, those bugs will be discovered(and fixed!) much quicker.

Ideally, you won't have to think about that system ever. We'll see how it goes :-D

Merge

Rollback

Packs are developed by human beings, and we tend to make mistakes. All changes done by authors of the packs are versioned and stored as revisions. For now, you can reset your changes only to the current latest revision, this is equivalent of re-downloading the entire pack, but 1000 times faster. As soon as the mechanism will be polished enough, I will enable ability to switch between revisions.

Preview

Another tab allows you to see how the pack looks like without even downloading it. Check hotkeys, general logic, structure. In one of the future updates you'll be able to check out the code and Behavior Trees/Macros as well from that very same window.

Preview

Activity Log

And the very last tab is just another form of Event Log - it contains information about changes, current sync status and everything else around it.

Activity Log

Color Search - added Similarity Range selection

Added new feature - now you can specify Similarity range which is required for trigger to be Active. By default, trigger is active only if Similarity is above given threshold, e.g. MinSimilarity

Now you can specify range of Min/Max values for similarity, e.g. MinMaxSimilarity

In this case, even if Similarity would reach 100%, trigger still will be Inactive, because expected value must be in range 55.95 to 62.94 (inclusively)

BT/Macros - MouseMove - added Random offset

Added simple way of randomizing XY. Together with Input Smoothing, this should make inputs appear more humane.

Randomize

Version History

Added a Version History feature, allowing users to view and manage configuration snapshots saved over time. Users can now perform a Soft Reset to restore file states without altering history or a Hard Reset to fully revert to a specific commit, removing all changes made afterward.

p.s. RU version of the doc is available here Version History

Window Selector improvements - added filter-properties

Window Selector is that control which allows you to pick/specify Target Window. For many years, it has been filtering-out all windows, which were under EA control. This is now an optional feature, which could be disabled by adding [ownedBy=any] to the expression, e.g. My Window [ownedBy=any] will filter out and scan through ALL windows, which are present in the system, even if they were created by EyeAuras.

Another filter of a similar type which was added allows to capture so-called Tool windows, e.g. Overlays usually have this type. By default, such windows are ignored and can add them as potential candidates by appending [type=any] at the end of match expression, e.g. My Overlay [ownedBy=any][type=any] would capture any window/overlay which has title My Overlay.

Reminder - Replay in Capture triggers

Just want to highlight a feature that was added long time ago and is extremely useful in some niche situations, e.g. when you need to capture the color or image of some short-living buff or debuff. I've done several improvements in that part, so it should become more convenient to use.

You just press Replay, the program starts saving the footage into temporary video file. Replay

When done, just press Stop Stop

Preview window will now switch to mode which loads image data from the video file. You can now work with that footage just like if that would be the real captured image - pick pixels, copy regions to clipboard, etc. When no longer needed, just switch to default Image as is option in bottom right corner. from file

C# Scripting - Export/Import and Live Import are in public alpha

New major feature entering alpha phase - it is now possible to Export your C# Overlays/Actions (Triggers and Nodes are still not allowing that) into .sln solution.

How is it useful ?

Modern IDEs provide a lot of QoL features without which it is inconvenient to do any kind of serious development. EA script editor will never be able to close that gap between "text editor with syntax highlighting and autocompletion" and real IDEs. It is a tool for script development, that is it. But at that point set of features that EA SDK provides has gone far beyond what is required for usual scripting - you can create a full-blown program with NuGet packages

Export

Export

You can then open this solution in JetBrains Rider (recommended) or Microsoft Visual Studio.

Solution which you'll get will consist of one or multiple projects (depending on what you've exported). It is build-able and you can add unit-testshttps://www.jetbrains.com/help/rider/Getting_Started_with_Unit_Testing.html).

Built successfully

Export/Import

Import Export I've already briefly covered, importing changes back is as simple as selecting Solution file you've previously exported. EA will load changes in source code files which you've made in IDE. As solution can have multiple projects in it (e.g. unit-tests project), EA will try to match projects which you already have in the program (in a form of C# actions) to those in solution and will ignore those which it is not aware of.

Live Import

Live import Importing changes over and over and over again could be exhausting and is not even close to desired workflow. That is where another feature comes into play. Click on Live Import, select .sln and EA will start monitoring for any changes made in that directory where solution resides in. As soon as it will detect those changes, it will import them back to EA. Essentially, this make it so the code in C# action/overlay you're working on becomes live. This is especially noticeable for Overlays, which are inherently recompiled as soon as any changes are made. So as soon as you'll do some changes in Overlay code, it will be almost instantly picked up by EA, recompiled and loaded. Think of it as of ghetto spin-off of Hot Reload feature, but that works.

Monitoring

Integration with .git

Git is a golden standard of version control systems. EA internally uses it for many things such as configuration version control. So it was just natural to set exported projects as git repositories during export. Whenever you're exporting/importing changes back to EA, it automatically creates git repository OR commits changes you've made. This makes it easy to rollback the code in case something goes wrong. Git repo Git log

Debugging

For now, you cannot debug or run the project from IDE. This will be one of the improvements I'll be working on in 2025. Eventually, you should be able to use EA as a script runner. But to make it happen I still have to do some changes.

C# Scripting - added Blazor/Razor support

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.

What it already can do:

  • you can create custom UI components right there in that same text editor
  • full auto-completion for C# part of Razor component and partial - for Razor part
  • API which allows to create windows and manage with your components right from your code
  • thread-safety - in contrast with WPF/WinForms and even official MS Blazor integration, EA API is thread-safe, meaning you can update properties of the window from any thread and it is expected to be able to properly process those. No longer you have to worry about deadlocks and UI marshalling using Invoke/BeginInvoke.
  • API mimics native WPF API to make it easier to code something using ChatGPT

Example

C# Scripting - Overlay v3

Added new type of Overlay, which uses the latest version of EyeAuras scripting engine - same one, that is used in C# Actions/Triggers and BehaviorTrees. For the next few weeks old C# overlay and new one wil co-exist. As soon as I will releat Export/Import functionality, old one will go away as it is worse in everything - performance, flexibility, etc.

Aside from scripting engine changes, this new overlay is using recently added Blazor Windows, which should make overlays more responsive and just in general more pleasant to work/interact with.

IMPORTANT! The overlay is far from being completed - there are still a lot of rough edges which I will work on in the following weeks.

Some UI examples which are created in EA

GTA

Script editor improvements

C# Script Action editor (only Action for now, editor in BTs/Triggers/Overlays is still the same) got some love:

  • should popout much faster, usually takes ~1 second PopOut
  • added Topmost button which could be used to make it so code editor will stay on top of other windows - very useful when editing something in real-time TopMost
  • now popped out editor has EventLog similar to one that main app window has, but that log will contain only messages generated by the script. Should be easier to debug things EventLog
  • fixed few bugs here and there Restart

C# Scripting - Memory API - added pattern scanning

What is Pattern Scanning?

Pattern scanning is a method used to search for specific byte sequences in memory. It’s useful for finding functions, data, or code that doesn’t always stay at the same location when a program is running.

Why is it Needed?

  1. Dynamic Locations: Programs often load code and data into different places each time they run. Pattern scanning helps find what you’re looking for, no matter where it ends up.
  2. Unique Matches: Patterns are like fingerprints—they help identify specific areas in memory based on unique byte sequences.

BytePattern

The BytePattern class has been added to support multiple ways of defining patterns. These updates make it easier to work with different types of patterns commonly used in scanning memory.

Pattern scanning is available on any type implementing IMemory interface, e.g.

using var process = LocalProcess.ByProcessName("pathofexile"); //uses naive RPM under the hood
Log.Info($"Process: {process}");
var modules = process.GetProcessModules(); //enumerate all loaded modules

using var memory = process.MemoryOfModule("pathofexile.exe"); //memory implements IMemory
Log.Info($"Process memory: {memory}, base: {memory.BaseAddress.ToHexadecimal()}");

// will find a singular offset pointing at 4th byte in the sequence
var offset = memory.FindOffset(BytePattern.FromTemplate("55 8B ?? ^ EC 00")); 

// will return dictionary with all found offsets for all given patterns
var playerPattern = BytePattern.FromTemplate("55 8B ?? ^ EC 00");
var targetPattern = BytePattern.FromTemplate("BB AA ??");
var offsetsByPattern = memory.FindOffset(playerPattern, targetPattern);

// by using Get* instead of Find* the code will throw an exception in case pattern is not found
var criticalOffset = memory.GetOffset(BytePattern.FromTemplate("55 8B ?? ^ EC 00")); 

Supported Pattern Types

  1. Byte Arrays:

    • Define patterns using exact byte values.
    • Example:
    var pattern = BytePattern.FromPattern(new byte[] {0x55, 0x8B, 0xEC});
    

    matches exactly those bytes.

  2. C-Style Patterns:

    • Use escape sequences like \xAA\xBB\xCC, like in C-Style patterns.
    • Example:
    var pattern = BytePattern.FromTemplate("\x55\x8B\xEC");
    

    is equivalent to the byte array [0x55, 0x8B, 0xEC].

  3. Hexadecimal Strings with Wildcards:

    • Define patterns as hex strings with ?? for wildcards (any byte).
    • Example:
    var pattern = BytePattern.FromTemplate("55 8B ?? 83");
    

    matches any sequence starting with 55 8B, followed by any byte, and then 83.

  4. Masked Patterns:

    • Combine a byte array with a mask to specify which bytes are fixed (x) and which are wildcards (?).
    • Example:
      var pattern = BytePattern.FromMaskedPattern(new byte[] { 0x55, 0x8B, 0xEC, 0x00, 0x08 }, "xxx??");
      
      Matches any sequence starting with 55 8B EC, followed by any two bytes.
  5. Templates with Offsets:

    • Define patterns using a template and mark the match offset with ^.
    • Example:
    var pattern = BytePattern.FromTemplate("55 8B ?? ^ EC 00");
    

    sets the offset right before EC (skipping 3 bytes). That means after the pattern is found, final offset will be Offset + 3

C# Scripting - added ability to reference assemblies by path/name

For several months we've had the feature in scripts, which allows to reference nuget packages

#r "nuget: Coroutine, 2.1.5"

Log.Info("Hello, World!"); //you can use Coroutine classes in that script

The support has not been extended and you can reference assemblies in 2 other ways now. Important! This method of referencing assemblies is available only inside Script.csx which is equivalent of your Program.cs in "normal" C#

By assembly path - from file

Syntax is very similar.

#r "assemblyPath: D:\Work\EAExile\EAExileAgent.Shared.dll"

Log.Info("Hello, World!"); //you can use EAExileAgent classes in that script

By assembly name

This method of referencing assemblies allows you to reference those assemblies which are either:

  • already loaded by EyeAuras, but have not been included into default referenced assemblies list
  • were loaded using Assembly.Load or via any other means, but they are already part of AssemblyLoadContext/AppDomain
  • are in GAC

Historically, EA referenced A LOT of assemblies by default, more than 300 assemblies. This allows users to save some type on pre-configuring these dependencies on each and every C# action/BT node/etc, but this is not a good way long-term. Gradually, I'll be de-linking more and more default assemblies and will include a better auto-completion techniques which would allow to easily include those libraries which are needed for your script. In the future, this will make upgrading the program easier for everyone

#r "assemblyName: Grpc.Net.Client"

Log.Info("Hello, World!"); //you can use Grpc.Net.Client classes in that script

As a part of scripting subsystem improvements, there were some changes done in the engine, which now allow you to use NuGets which rely on native libraries, such as ImGui - a lot of programmers out there have experience with it an now you can leverage that knowledge and create ImGui overlays straight from the code.

This is an example of a live clickable ImGui overlay, which can contain any kind of data you want, running inside EA and being able to leverage any functionality - computer vision, neural networks, memory read, input emulation - anything.

C# Scripting - BlazorWindows - added NoActivate

Added very useful property called NoActivate, which, when set, makes it so the window will react to mouse clicks, but will not intercept user focus. Meaning you can have an overlay with a bunch of controls, allowing user to easily disable and enable some functionality of your bot while game window will remain active.

    /// <summary>
    /// Gets or sets a value indicating whether the window should NOT be activated when clicked
    /// </summary>
    bool NoActivate { get; set; }

C# Scripting - BlazorWindows - added ComplexFileProvider

Added to IBlazorWindow one new property and one method. Both of those could be used to provide custom providers for file data. You can pick whichever flavour you want - add your custom file provider either via RegisterFileProvider or by using AdditionalFileProvider and any file, which you will be referencing in your custom Blazor code, will have access to that file. It could be runtime-generated styles, could be images, video or anything you may need to create a really dynamic user interfaces.

For now, I would recommend to use built-in:

  • ComplexFileProvider - allows to combine multiple FileProviders together, resolution will happen in order of addition
  • InMemoryFileProvider - allows to store file data in-memory, files will be cached for better performance
  • InMemoryFileInfo - allows to create one in-memory file reference. The data is loaded as soon as FileInfo is constructed
  • LazyInMemoryFileInfo - allows to create lazy file reference, which will be loaded only when accessed

which allow you to easily add new content to your pages.


    /// <summary>
    /// Gets or sets additional file provider which will be used by Blazor
    /// </summary>
    IFileProvider AdditionalFileProvider { get; set; }

    /// <summary>
    /// Adds additional file provider which will be used by Blazor. Added to the end of the list.
    /// Removed on disposal
    /// </summary>
    IDisposable RegisterFileProvider(IFileProvider fileProvider);

Example of the code, which will load file from the disk and make it available for use in styles or HTML:

var fileProvider = new InMemoryFileProvider();
fileProvider.AddOrUpdate(new InMemoryFileInfo("hello.png", File.ReadAllBytes(@"D:\hello.png")));

Of course, you can generate the displayed data in runtime as well.

YoloEase - new version 0.1.65 released

Primary focus - fixed problems with auto-annotation and ensure that Google Collab now properly works. I'll post a video on this soon. Plus several improvements to performance, which are especially noticeable on mid+ sized datasets (5-10k of images).

Local Training

With Local Training you're training the model using your own hardware. Positive side - you're paying only for electricity, negative - you have to have everything setup and ready to go Local

Google Collab

With Google Collab you're using cloud infrastructure to do the training, meaning that the actual training code runs elsewhere. You can either use a free tier or a paid one, your choice. Collab

Bugfixes/Improvements

  • [Crash] Fixed crash which happened when Offset Width + Position/ContentAnchor were set in Overlays
  • [Crash] Fixed crash which happened when Offset+Anchor were used at the same time
  • [Crash] Changed how internal app channels are handled - should prevent one rare type of crashes
  • [Crash] Fixed crash which happened due to BehaviorSubject disposal
  • [Crash] Fixed crash which occurred if FramesPerSecond value was set to something very small like 1e-10

  • [UI] Tuned memory allocations a bit - the app should consume less memory on startup.
  • [UI] Minor changes for the first start - event log panel is larger, Macro gets created instead of an aura
  • [UI] Added two new actions - Execute Tree and Execute Macro which could be called from Auras. This is a "glue" which allows to wire together two automation approaches which exist in EA
  • [UI] Fixed a problem with C# Action being cancelled in some cases even if Ignore Cancellation is set.
  • [UI] Added SendText node, available in both BTs and Macros
  • [UI] Fixed effects counter #EA-753 Effects counter v7668 by Headway9016
  • [UI] Improvement in Bindings Editor - if binding fails, error will be shown
  • [UI] Fixed a problem with bindings BT-to-BT not working properly
  • [Scripting] Fixed problem with BlazorWindow Opacity not being set properly under some circumstances
  • [Scripting] Fixed a bug which lead to premature disposal of ScriptingAPIs, this would correspondingly lead to disposal of OSD/Windows/etc created by script
  • [Scripting] Exposed IPerformanceMetricsAddon - could be used to track performance of the app via scripting
  • [Scripting] Changed script compilation order - fixes a problem with Razor sometimes not being compiled correctly
  • [Scripting] Fixed a problem with CancellationToken rewriter - it was handling optional arguments incorrectly in some cases
  • [Scripting] Fixed a problem in error highlighting in the text editor - now it should properly underline erroneous lines as it was pre-Razor changes
  • [Scripting] Improved Log.Info/Debug/Warn formatting - now UI properly renders line breakes
  • [Scripting] Fixed problem in Loop rewriter - nested classes were not properly handled
  • [Scripting] CodeEditor improvements - changed how errors are highlighter plus added single-file Razor template + updated the template itself
  • [Scripting] Console.WriteLine now prints output to EventLog. Done this to improve usability of ChatGPT-generated scripts.
  • [Scripting] Fixed a problem with nuget packages in scripts - they were stripped by rewriters under some circumstances
  • [Scripting] Fixed a problem with new/removed files not always being displayed in UI
  • [Scripting] Changed how buttons behave when editor gets resized - now it is much easier to have small floating panel with the script somewhere on the screen, while you're editing the code in IDE
  • [Scripting] Editor performance tweaked - should switch between files faster
  • [Scripting] Fixed a problem with INotifyPropertyChanged implementation in scripting
  • [Capture] In effects and in Color Search fixed a problem with Color picker not working correctly with Replay
  • [Capture] Fixed a problem where WGCS tried to capture the image before window is visible (Argument out of range)
  • [SendInput] Improved how keypresses/mousemove logs look like
  • [SendInput] Improved performance of Windows Message API in multi-window scenarios
  • [Sync] Fixed error in auras merge mechanism v7612 #EA-735 by Steamy Index is equal to or greater than Count
  • [Bindings] Fixed problem in Bindings Editor - in some cases bindings were created to previously selected item rather than current one
  • [BehaviorTrees] BT improvements - made it so empty BT does not throw exceptions when Ticked
  • [BehaviorTrees] Added new bindings to KeyPress and MouseMoveRel nodes

1.5.7968

16 days ago

Mostly hotfixes of NY release.

Bugfixes/Improvements

  • [Crash] Fixed a problem with SendSequence in some cases leading to crashes ("Window activation failed")
  • [UI] Made it so if there is some disconnect from the server, NetworkMessages try to re-connect with more aggressive strategy
  • [WebUI] Fixed compatibility bug with IEyeContext - should fix a problem with older overlays not working properly
  • [Scripting] Minor Memory API changes - addded MemoryOfModule (which accept module name OR module descriptor) to IProcess
  • [Scripting] Memory API improvements - better logging and formatting

1.5.7965

one month ago

C# Scripting - BlazorWindows - added NoActivate

Added very useful property called NoActivate, which, when set, makes it so the window will react to mouse clicks, but will not intercept user focus. Meaning you can have an overlay with a bunch of controls, allowing user to easily disable and enable some functionality of your bot while game window will remain active.

    /// <summary>
    /// Gets or sets a value indicating whether the window should NOT be activated when clicked
    /// </summary>
    bool NoActivate { get; set; }

C# Scripting - BlazorWindows - added ComplexFileProvider

Added to IBlazorWindow one new property and one method. Both of those could be used to provide custom providers for file data. You can pick whichever flavour you want - add your custom file provider either via RegisterFileProvider or by using AdditionalFileProvider and any file, which you will be referencing in your custom Blazor code, will have access to that file. It could be runtime-generated styles, could be images, video or anything you may need to create a really dynamic user interfaces.

For now, I would recommend to use built-in:

  • ComplexFileProvider - allows to combine multiple FileProviders together, resolution will happen in order of addition
  • InMemoryFileProvider - allows to store file data in-memory, files will be cached for better performance
  • InMemoryFileInfo - allows to create one in-memory file reference. The data is loaded as soon as FileInfo is constructed
  • LazyInMemoryFileInfo - allows to create lazy file reference, which will be loaded only when accessed

which allow you to easily add new content to your pages.


    /// <summary>
    /// Gets or sets additional file provider which will be used by Blazor
    /// </summary>
    IFileProvider AdditionalFileProvider { get; set; }

    /// <summary>
    /// Adds additional file provider which will be used by Blazor. Added to the end of the list.
    /// Removed on disposal
    /// </summary>
    IDisposable RegisterFileProvider(IFileProvider fileProvider);

Example of the code, which will load file from the disk and make it available for use in styles or HTML:

var fileProvider = new InMemoryFileProvider();
fileProvider.AddOrUpdate(new InMemoryFileInfo("hello.png", File.ReadAllBytes(@"D:\hello.png")));

Of course, you can generate the displayed data in runtime as well.

Bugfixes/Improvements

  • [Scripting] Fixed problem with BlazorWindow Opacity not being set properly under some circumstances

1.5.7960

one month ago

Packing improvements

Now, after you've downloaded a pack from the website - be it a fishing bot for Throne&Liberty(1 or 2), Path of Exile Helper or any other one - you can now much-much easier track when it will be updated by the author. You will get a notification in the pack right away - for now it will be a small badge in the folder name. Afterwards, I may add some other form of notification.

Pack

Pack settings merging

But just getting updates is not everything thing feature brings. More often than not, when you started using someone elses pack, you do some changes in it - set up your own keybinds, change window name, change some image, etc. Now you won't be losing those changes even when new version of the pack gets released by the author - EyeAuras will pick your local changes, compare them with author's changes(remote) and will Merge them together. Best case scenario - you get all the new changes which author of the pack did AND you have your previously done changes intact. This mechanism is still fresh out of the oven and could have some problems in it, but now, when this feature finally came into play, those bugs will be discovered(and fixed!) much quicker.

Ideally, you won't have to think about that system ever. We'll see how it goes :-D

Merge

Rollback

Packs are developed by human beings, and we tend to make mistakes. All changes done by authors of the packs are versioned and stored as revisions. For now, you can reset your changes only to the current latest revision, this is equivalent of re-downloading the entire pack, but 1000 times faster. As soon as the mechanism will be polished enough, I will enable ability to switch between revisions.

Preview

Another tab allows you to see how the pack looks like without even downloading it. Check hotkeys, general logic, structure. In one of the future updates you'll be able to check out the code and Behavior Trees/Macros as well from that very same window.

Preview

Activity Log

And the very last tab is just another form of Event Log - it contains information about changes, current sync status and everything else around it.

Activity Log

YoloEase - new version 0.1.65 released

Primary focus - fixed problems with auto-annotation and ensure that Google Collab now properly works. I'll post a video on this soon. Plus several improvements to performance, which are especially noticeable on mid+ sized datasets (5-10k of images).

Local Training

With Local Training you're training the model using your own hardware. Positive side - you're paying only for electricity, negative - you have to have everything setup and ready to go Local

Google Collab

With Google Collab you're using cloud infrastructure to do the training, meaning that the actual training code runs elsewhere. You can either use a free tier or a paid one, your choice. Collab

Bugfixes/Improvements

  • [UI] Tuned memory allocations a bit - the app should consume less memory on startup.

1.5.7930

one month ago

C# Scripting - Export/Import and Live Import are in public alpha

New major feature entering alpha phase - it is now possible to Export your C# Overlays/Actions (Triggers and Nodes are still not allowing that) into .sln solution.

How is it useful ?

Modern IDEs provide a lot of QoL features without which it is inconvenient to do any kind of serious development. EA script editor will never be able to close that gap between "text editor with syntax highlighting and autocompletion" and real IDEs. It is a tool for script development, that is it. But at that point set of features that EA SDK provides has gone far beyond what is required for usual scripting - you can create a full-blown program with NuGet packages

Export

Export

You can then open this solution in JetBrains Rider (recommended) or Microsoft Visual Studio.

Solution which you'll get will consist of one or multiple projects (depending on what you've exported). It is build-able and you can add unit-testshttps://www.jetbrains.com/help/rider/Getting_Started_with_Unit_Testing.html).

Built successfully

Export/Import

Import Export I've already briefly covered, importing changes back is as simple as selecting Solution file you've previously exported. EA will load changes in source code files which you've made in IDE. As solution can have multiple projects in it (e.g. unit-tests project), EA will try to match projects which you already have in the program (in a form of C# actions) to those in solution and will ignore those which it is not aware of.

Live Import

Live import Importing changes over and over and over again could be exhausting and is not even close to desired workflow. That is where another feature comes into play. Click on Live Import, select .sln and EA will start monitoring for any changes made in that directory where solution resides in. As soon as it will detect those changes, it will import them back to EA. Essentially, this make it so the code in C# action/overlay you're working on becomes live. This is especially noticeable for Overlays, which are inherently recompiled as soon as any changes are made. So as soon as you'll do some changes in Overlay code, it will be almost instantly picked up by EA, recompiled and loaded. Think of it as of ghetto spin-off of Hot Reload feature, but that works.

Monitoring

Integration with .git

Git is a golden standard of version control systems. EA internally uses it for many things such as configuration version control. So it was just natural to set exported projects as git repositories during export. Whenever you're exporting/importing changes back to EA, it automatically creates git repository OR commits changes you've made. This makes it easy to rollback the code in case something goes wrong. Git repo Git log

Debugging

For now, you cannot debug or run the project from IDE. This will be one of the improvements I'll be working on in 2025. Eventually, you should be able to use EA as a script runner. But to make it happen I still have to do some changes.

Bugfixes/Improvements

  • [UI] Minor changes for the first start - event log panel is larger, Macro gets created instead of an aura
  • [Scripting] Fixed a bug which lead to premature disposal of ScriptingAPIs, this would correspondingly lead to disposal of OSD/Windows/etc created by script

1.5.7913

one month ago

Bugfixes/Improvements

  • [Scripting] Changed how buttons behave when editor gets resized - now it is much easier to have small floating panel with the script somewhere on the screen, while you're editing the code in IDE
  • [Scripting] Editor performance tweaked - should switch between files faster
  • [Scripting] Added Restart button which... well, restarts the script. More convenient than stop-starting every time. Keep in mind that this is NOT needed in C# Overlays - they operate in always-live mode by default. Restart

1.5.7904

one month ago

MouseMove - added Random offset

Added simple way of randomizing XY. Together with Input Smoothing, this should make inputs appear more humane.

Randomize

Bugfixes/Improvements

  • [UI] Added two new actions - Execute Tree and Execute Macro which could be called from Auras. This is a "glue" which allows to wire together two automation approaches which exist in EA
  • [Scripting] Changed how assemblies are loaded - fixes a problem with transitive dependencies
  • [Scripting] Exposed IPerformanceMetricsAddon - could be used to track performance of the app via scripting
  • [Scripting] Changed script compilation order - fixes a problem with Razor sometimes not being compiled correctly

1.5.7895

one month ago

C# Scripting - added ability to reference assemblies by path/name

For several months we've had the feature in scripts, which allows to reference nuget packages

#r "nuget: Coroutine, 2.1.5"

Log.Info("Hello, World!"); //you can use Coroutine classes in that script

The support has not been extended and you can reference assemblies in 2 other ways now. Important! This method of referencing assemblies is available only inside Script.csx which is equivalent of your Program.cs in "normal" C#

By assembly path - from file

Syntax is very similar.

#r "assemblyPath: D:\Work\EAExile\EAExileAgent.Shared.dll"

Log.Info("Hello, World!"); //you can use EAExileAgent classes in that script

By assembly name

This method of referencing assemblies allows you to reference those assemblies which are either:

  • already loaded by EyeAuras, but have not been included into default referenced assemblies list
  • were loaded using Assembly.Load or via any other means, but they are already part of AssemblyLoadContext/AppDomain
  • are in GAC

Historically, EA referenced A LOT of assemblies by default, more than 300 assemblies. This allows users to save some type on pre-configuring these dependencies on each and every C# action/BT node/etc, but this is not a good way long-term. Gradually, I'll be de-linking more and more default assemblies and will include a better auto-completion techniques which would allow to easily include those libraries which are needed for your script. In the future, this will make upgrading the program easier for everyone

#r "assemblyName: Grpc.Net.Client"

Log.Info("Hello, World!"); //you can use Grpc.Net.Client classes in that script

Bugfixes/Improvements

  • [Scripting] Fixed a problem with CancellationToken rewriter - it was handling optional arguments incorrectly in some cases

1.5.7881

one month ago

C# Scripting - added pattern scanning

What is Pattern Scanning?

Pattern scanning is a method used to search for specific byte sequences in memory. It’s useful for finding functions, data, or code that doesn’t always stay at the same location when a program is running.

Why is it Needed?

  1. Dynamic Locations: Programs often load code and data into different places each time they run. Pattern scanning helps find what you’re looking for, no matter where it ends up.
  2. Unique Matches: Patterns are like fingerprints—they help identify specific areas in memory based on unique byte sequences.

BytePattern

The BytePattern class has been added to support multiple ways of defining patterns. These updates make it easier to work with different types of patterns commonly used in scanning memory.

Pattern scanning is available on any type implementing IMemory interface, e.g.

using var process = LocalProcess.ByProcessName("pathofexile"); //uses naive RPM under the hood
Log.Info($"Process: {process}");
var modules = process.GetProcessModules(); //enumerate all loaded modules

using var memory = process.MemoryOfModule("pathofexile.exe"); //memory implements IMemory
Log.Info($"Process memory: {memory}, base: {memory.BaseAddress.ToHexadecimal()}");

// will find a singular offset pointing at 4th byte in the sequence
var offset = memory.FindOffset(BytePattern.FromTemplate("55 8B ?? ^ EC 00")); 

// will return dictionary with all found offsets for all given patterns
var playerPattern = BytePattern.FromTemplate("55 8B ?? ^ EC 00");
var targetPattern = BytePattern.FromTemplate("BB AA ??");
var offsetsByPattern = memory.FindOffset(playerPattern, targetPattern);

// by using Get* instead of Find* the code will throw an exception in case pattern is not found
var criticalOffset = memory.GetOffset(BytePattern.FromTemplate("55 8B ?? ^ EC 00")); 

Supported Pattern Types

  1. Byte Arrays:

    • Define patterns using exact byte values.
    • Example:
    var pattern = BytePattern.FromPattern(new byte[] {0x55, 0x8B, 0xEC});
    

    matches exactly those bytes.

  2. C-Style Patterns:

    • Use escape sequences like \xAA\xBB\xCC, like in C-Style patterns.
    • Example:
    var pattern = BytePattern.FromTemplate("\x55\x8B\xEC");
    

    is equivalent to the byte array [0x55, 0x8B, 0xEC].

  3. Hexadecimal Strings with Wildcards:

    • Define patterns as hex strings with ?? for wildcards (any byte).
    • Example:
    var pattern = BytePattern.FromTemplate("55 8B ?? 83");
    

    matches any sequence starting with 55 8B, followed by any byte, and then 83.

  4. Masked Patterns:

    • Combine a byte array with a mask to specify which bytes are fixed (x) and which are wildcards (?).
    • Example:
      var bytes = ;
      var mask = ;
      var pattern = BytePattern.FromMaskedPattern(new byte[] { 0x55, 0x8B, 0xEC, 0x00, 0x08 }, "xxx??");
      
      Matches any sequence starting with 55 8B EC, followed by any two bytes.
  5. Templates with Offsets:

    • Define patterns using a template and mark the match offset with ^.
    • Example:
    var pattern = BytePattern.FromTemplate("55 8B ?? ^ EC 00");
    

    sets the offset right before EC (skipping 3 bytes). That means after the pattern is found, final offset will be Offset + 3


Bugfixes/Improvements

  • [UI] Minor layout fix in popped-out C# editor