Bot Developer's Shopping List

Hello, I’ve been lurking on these forums for a while, and have to say that I’m very intrigued by the capabilities of this framework.
I’ve been privately developing/using my own, very successful, AHK bots for a few years and am thinking about converting over to Sanderling as I embark upon a new bot quest, carriers. (I’d probably start by adapting A-Bot) However, that is just the core of how the bot will make the ISK. My bots coordinate with each other and communicate. They even talk to each other in corp chat. Because of this, I have a number of things that I need to ensure are available before I decide to embark on a large task like this.

First, please do not misunderstand the point of my list. This is a list of considerations based on what my bots already do. I’m just looking to see if I can attain feature parity. It is not a list of demands. I’m not some irreverent jerk that thinks he’s entitled to everything I might want…
Second, I’m not even asking for help on where these things can be found in the BotEngine interface. I’m just looking for feedback on the current capabilities.

My chief consideration is whether I’d be able to continue using the bot if the current author(s) decided to disappear. I saw a forum post about a patch that caused bots to stop working until the core code was patched with the new memory configuration from an Eve patch. Could someone point me in the direction of what tools are used to find and remap these myself? What about adding new interface elements? I’d like to learn to do this, because I don’t do things half-assed. I just need to know how it is done efficiently.

Speed: Although I wouldn’t run it at full speed, so that it isn’t obvious that it is a bot, carriers require a much higher rate of interaction than anything else in the game. (I know that access speed shouldn’t’ be a problem, due to reading memory, but I have to ask in case…) Would it take more than half a second to query Local Pilots, Ship HP/Energy, Active Modules, Overview list contents?

(Again, only looking for short answers. I’m don’t want to impose. A simple “Available” or “Missing X” would be appreciated. This list is so specific because my bots can do all of this, except the new carrier stuff.)
The List:

  • General: Window positions, Active/Focused vs. Inactive vs. Closed, Current System

  • Ship Stats: Scrammed, Webbed, Damped, Targeting Range…

  • HUD: HP, Energy, Speed, Modules Active/Inactive

  • General Windows: Which is active/on top, Locations of inactive windows, Filter use or any text input areas (like PnP or Chat window) unmapped? Able to detect that text has been input into text area, in case of VM lag?

  • Tabs: Active/Inactive, change tabs

  • Lists: Any inaccessible lists?

  • Tables: Support for expandable entries, like PnP/Assets, changing sort?

  • Chat Window: Pilots List, Hostile/Friendly

  • Overview: Active/Inactive Tabs, Full table data like Column Header Name/Types (Any column data inaccessible?) Differentiation NPC-ID or How can I track the same target, or do I have to use Tag column still?

  • Inventory: I’d like to bring over my capability to restock items, switch ships and such, so anything missing here?

  • Probe Scanner Table: Anything missing?

  • Probe Scanning 3D Interface: Anything missing here, or would I need to keep my AHK code to make sure WHs don’t let in unwanted guests?

  • Inventory Window: Pretty sure I saw this in a tutorial.

  • States: Docked, Undocked, Warping, Dead

  • Drone Management Window: Get Names of Drones Deployed and their HP, Drones in Bay, Attacking/Idle?

  • Targeted Info: Names and HP of targets?

  • Fighter HUD: HP/NumRemaining, Speed, Modules Active/Inactive, Attacking/Idle, Webbed

So, yeah, that’s my list. LOL! But like I said, I already do things in AHK, so everything I do is a workaround. I’m just doing some fact finding to see what the landscape is. I’m just getting tired of some of the random problems that are inherent in screen scraping, and really trying to see if this could be a bit more stable.

Though my list above sounds huge, the way I see it is that the hard part is the logic of how to use the data to make good decisions. Well, I already have all that. (Like, that is what I’m really good at.) Porting it over to this language is just a matter of translation.

Well, if you’ve made it to the end, here, then I applaud you! Please, if you would be so kind, provide some brief feedback on my questions and such.

Thank you. :slight_smile:

1 Like

Welcome @Innominate,
good to learn from you about what is interesting for bot developers.

This sounds to me a bit like an all or nothing approach. I mean it sounds a bit like you want to avoid taking small steps, expanding your AHK bots to use Sanderling gradually. Have you encountered a problem using Sanderling memory reading in your AHK bots?

Yes you can, the Sanderling memory reading code is open source. I published guides about how sanderling memory reading works as well as sample code (see overview with links below) to get people interested in this up to speed.

Here is a summary of what happened:

To clarify, development of this fix did not require knowledge about an Eve patch. As you will see in the linked guide, we use snapshots of the actual game clients process as reference for memory reading development.

If you want to be informed about such breaking changes to the eve online client in advance, you can test the memory reading on the public test server Singularity (Sisi) for EVE Online.

Following are resources to learn about eve online memory reading:

Querying all this needs less than half a second.

I am going to take a look at the list later.

1 Like

I’ve been working with Innominate for over a year now on our AHK bots, I am also really intrigued by your capabilities. You mention a progressive approach whereby we could start to mix Sandeing memory measurement into our framework: how could we accomplish this or start working towards it? We have no issue taking small steps, in fact it’s entirely preferable. I think Innominate (and I) assumed that it would have to be all or nothing.

Thank you for responding!
Abbadon, glad you decided to chime in!

I’ll answer now, but please don’t let this cause you to forget about the list. :yum: Is there a way we could query Sanderling API to get information?
Honestly, there’s a few main reasons, and only one of which is imperative.

  1. Speed is the imperative one. Based on manual testing, Carriers will lose fighters quickly if left unattended for more than 2 seconds. My current infrastructure is single threaded, as AHK is mostly built to be single threaded, and based on my code benchmarks, in order to get the necessary speed necessary I’d need to create a separate process to run in parallel. (One that gets the data and another to interact with Eve. My code is no slouch. It remembers window coordinates so that it only has to check small areas in order to confirm that things have not moved, or adapt to those things. It can verify/find all of the window positions, Local, Overview stuff, and other necessary things above in a little over 1.25 seconds. But lag can regularly take that to 2-3 seconds, which isn’t optimal for keeping fighters safe.)

  2. OCR. I’ve done without it for the whole time, and don’t necessarily have to have it, but it is definitely a thing that is nice to have. I know I could have added it by incorporating Tesseract, but that would only slow down the code’s processing time.

  3. Situational awareness and the ability to recognize when something has changed, identify what it is, and get it out of the way. Well typical pop ups are easily handled, some of the other things like hover over tooltips and other random things get in the way sometimes. Like, the inventory window was a minefield!

Yes, you can use Sanderling API to read the eve online clients UI Tree: You give the Sanderling API the process ID of the eve online clients process and get back a memory measurement with the UI trees contents.

You can consume this API as .NET methods, calling into sanderlings dlls. I uploaded a simple application to demonstrate this. This demo app shows which dlls to use and which methods to call to get the memory measurement. You can find this demo app at Sanderling/src/Sanderling/Sanderling.Sample.Read at be5049c88f0a5b07fde2e54662d26f6a8809c1f0 · Arcitectus/Sanderling · GitHub

Interesting. 1.25 seconds are a lot for reading this stuff. If you would like to read this in 300 milliseconds, Sanderling can help :rocket:

If you don’t want to wait for Tesseract, you can take the Strings which Sanderling reads from the eve online clients UI Tree.
If you want to speed up OCR, you might be interested in knowing the regions of the screen where to search for characters. So querying Sanderling API to get those regions could be helpful too.

No problem. The Sanderling based mission running bot did this 12 hours straight without need for intervention.

For the reading part, this is not a problem when you read from the UI tree in memory.
Stuff which is occluded by a tooltip in a screenshot is still present in the UI tree. So it is still being read by Sanderling. Same for occlusion by windows.

Alright! As soon as I get back from vacation, I’ll start trying to convert our get/set functions. Thank you.

Dont need ocr because Sanderling can do it faster and way more reliably.

I’ve been looking through the forums and the git repo. I’m going to assemble some samples in the event that you don’t have everything we want parsed, and see if I can suss out how to get the data we want in a function that we can run from AHK and get the right return values. Is that what you were thinking of when you suggested integrating it?

I did not think that far, as I don’t have info about AHK.

First step I think of is to find out how to exchange data between AHK and the .NET side.

If AHK can call into the .NET methods and use their return value, that seems the preferable route so far.

In case that does not work, alternatives could be WinAPI calls or a HTTP based interface.

AHK can do DLL calls.

Would you mind providing a sample line API call to retrieve an Eve data element, coming from another app? That would help a lot!

I would try the following method, with project references set up as in the sample project from

string DemoOfHowToRetrieveSingleEveElement(Sanderling.Sensor sensor, int eveProcessId)
	return sensor.MeasurementTakeNewRequest(eveProcessId).MemoryMeasurement?.Value?.VersionString;