Eve Online Anomaly Ratting Bot Release



So you’re assigning type by entering them in bot.config. Cool. You might want to add Destroyer because they are less likely to scram and may be worth differentiating.


As a further idea… is the icon the same for all classes of ships ?
if so then we already have a classification in the overview…

this is purely conjecture I have no inside knowledge whether this holds true apart from my limited tests
Texture0Id?.Id I have been grouping on this and so far I get the same ID’s for battleships,cruisers,and frigates

Parse.IOverviewEntry[] TestRatOverviewEntry => WindowOverview?.ListView?.Entry?.OrderBy(entry => entry?.DistanceMax ?? int.MaxValue)?.ToArray();
var TestRatTarget=TestRatOverviewEntry?.Where(t => t.MainIconIsRed ?? false ).Where(t=> !t.MeTargeted ?? false)?.GroupBy(target => target?.MainIcon?.Texture0Id?.Id)?.ToLookup(x => x.Key, x=> x.ToList());

I am assuming that Texture0ld?.Id is only unique with regards to icons
I have explored in overview and the Stargate Texture0ld?.Ids are equivalent
so It looks like we can classify ships by this… Now to code a classification routine using this info;


This would make you able to set priority without having to input each rat name matching string. Sounds much better!


I was study an scenario of Pimary Targhet like a “Player” so this is the scenario where I want go and reach:

The priority targhet is done by some facts: class type and ewar, each race use a different ewar so imagine to be in anomaly, we can give a primary just based on the class like a frigate, and then swtich because another class put on us ewar.

So the best way to determinate a primary to optimize the anomaly run is:

  1. Kill who put on us EWAR
  2. Kill who can put on us EWAR
  3. Kill per class (1. Frigates, 2 destroyers, 3 Cruiser etc) (why per class? because the smallest shit have more possibility to make damage on drones, fighters or track our ship)

Now… imagine to be in a capital (what Im working right now) and you want use the special attack, (yeah it’s possible I made the function yesterday) but… if the bot use the special attack on a frigate it’s fucking stupid… so we need to put the BOT in a condition to understand all this…

So… my logical solution is identify the priority by type name, the class name and type name for the NPC are equal, it’s possible retrieve the full list of NPC type name per race directly from the eve db dump, then with the various NPC reports on internet it’s possible find who of them use EWAR and give more priority then another NPC of the same class but without using ewar… and at last can be done a better “check” on the targhet and decide what attack do versus him.

So my solution is Make plus array per class type with priority based on using ewar Example

Blood Raider Frigates{ [Type= Elder Corpii Follower, Priority=1] , [Type= Blood Disciple, Priority=2] , [Type= Corpii Diviner , Priority= 3] }

In this example:

  • Elder Corpii Follower -> Use scrambler
  • Blood Disciple -> Use Webs
  • Corpii Diviner -> Use Tracking Disruptors

This kind of work permit us to optimize the anomaly, have a better choice on the primary preventing the EWAR on us… the only “bored” stuff is export the class types from eve dump and then creates the various array and giving the primary by type o ewar.

But if we done this, will be more effective then reconize by icons or other stuff… Yes Im a genious, I know ahahah (I joke) :stuck_out_tongue:


Sure, to modify the order, add calls to OrderBy on the sequence of targets.

So your function given to OrderBy which determines the rank of a given target returns an integer.

In the code you showed, you want to add these calls after the other ordering calls (OrderBy and ThenBy) because the last in the code is applied last.

For example, to order by distance, add this line:

?.OrderBy(entry => entry?.DistanceMax ?? int.MaxValue)



Im working on checking if the anomaly is already taken, my idea is to check if overview contains pilot in corp/ally/good standings/excellent standings, using the color backgrounds

something like:

var color = BotEngine.Interface.ColorORGB(0, 282, 389, 492);

			var listOverviewEntryFriends =
				memoryMeasurement?.WindowOverview?.FirstOrDefault()?.ListView?.Entry?.Where(entry => entry?.ListBackgroundColor == color).ToArray();

But I don’t know how to declare the ORGB color into the variable for after apply the filter “where”.

Can you help me on this?


No problem, you can declare it like this:
First, a function to decide friendliness for a given background color:

bool IsFriendBackgroundColor(ColorORGB color) =>
	your expression using color to compute friendliness here;

Then you can use it on all background colors of an overview entry and combine the friendliness results for all colors with disjunction.

var listOverviewEntryFriends =
	?.Where(entry => entry?.ListBackgroundColor?.Any(IsFriendBackgroundColor) ?? false)


I have done some research into ship classification and came up with this
Insert this into Sanderling’s Overview.cs file at or around line 56
This is a quick and dirty hack it probably needs to be in an Overview Extension class

This will classify probably 95 % of all deadspace rats
I used the static dump of Eve Chruker NPC Ships
and used the deadspace rats… there are a few rats that do not follow a naming convention that I am regex’ng on.

public bool? IsFrigate => Name.RegexMatchSuccessIgnoreCase(@"coreli|centi|alvi|pithi|corpii|gistii");
public bool? IsBattleship => Name.RegexMatchSuccessIgnoreCase(@"core\s|centus|alvus|pith\s|corpus|gist\s");
public bool? IsDestroyer => Name.RegexMatchSuccessIgnoreCase(@"corelior|centior|alvior|pithior|corpior|gistior");
public bool? IsCruiser => Name.RegexMatchSuccessIgnoreCase(@"corelum|centum|alvum|pithum|corpum|gistum");
public bool? IsBattleCruiser =>Name.RegexMatchSuccessIgnoreCase(@"corelatis|centatis|alvatis|pithatis|copatis|gistatis");


bool IsFriendBackgroundColor(ColorORGB color) =>
	your expression using color to compute friendliness here;

@Viir what is not clear to me is how pass the value, I know the ORGB value is= 0,282,389,492

But I don’t know how structure it into the variable

if I do for example:

bool IsFriendBackgroundColor(ColorORGB color) =>

it’s wrong, so what I want know it’s how you delcare the ORGB value into the variable

var listOverviewEntryToAttack =
				memoryMeasurement?.WindowOverview?.FirstOrDefault()?.ListView?.Entry?.Where(entry => entry?.MainIcon?.Color?.IsRed() ?? false)
				?.OrderBy(entry => bot.AttackPriorityIndex(entry))
				?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"coreli|centi|alvi|pithi|corpii|gistii")) //Frigate
				?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"corelior|centior|alvior|pithior|corpior|gistior")) //Destroyer
				?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"corelum|centum|alvum|pithum|corpum|gistum")) //Cruiser
				?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"corelatis|centatis|alvatis|pithatis|copatis|gistatis")) //Battlecruiser
				?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"core\s|centus|alvus|pith\s|corpus|gist\s")) //Battleship
				?.ThenBy(entry => entry?.DistanceMax ?? int.MaxValue)

@Maniac I applied it directly on my A-Bot and this work, good job +1


On phone, but you might as well add the capital types for GTFO criteria…
Dread: dreadnaught


I guess somethink like that:

				ColorORGB color= new ColorORGB(0, 282, 389, 492);


If you want to check for equality of all four properties, you can structure it like this:

bool IsFriendBackgroundColor(ColorORGB color) =>
	color.OMilli == 0 && color.RMilli == 282 && color.GMilli == 389 && color.BMilli == 492;

If equality comparison on instances of ColorORGB works too, then you can construct your reference value as Terpla has shown in his post.

Keep in mind that the O property is for Opacity and a value of 0 means it is transparent.


Is there a way to jump between systems? Go to the next system on a list or something. Anomaly ratting in just one system is not really profitable in highsec. Or maybe i am just to stupid to set it up properly.



It’s more better if you skill an alt and you go to do it in null sec



I feel kinda stupid to ask that but this make me crazy lol

I explain fast I did the function where the bot check if the anomaly is already taken or not, if is already taken he go to ingnore the current anomaly result and go to warp to the next, else he start the combat… BUT I have a little problem, he run the check everytime, so if currently the anomaly someone enter, the bot will consider it “alreadyTaken” and go to ignore the result and warp to the next LOL.

So… now… I placed this variable into Combat.cs under:

public class CombatTask : IBotTask

The variable is declare in this way:

public bool OwnAnomaly { private set; get; }

This is the check always in Combat.cs:

if (OwnAnomaly != true)
if (listOverviewEntryFriends.Length > 0)
yield return bot.SkipAnomaly(memoryMeasurement);
yield return new AnomalyEnter { bot = bot };
OwnAnomaly = true;
yield return bot.LaunchFighters(memoryMeasurement?.ShipUi?.SquadronsUI);

and when the anomaly is finished I assign to the “OwnAnomaly” the value “False”

But happen what I explaind before… so I think everytime he go to reset the value, so I need to place the variable declaration outside Combat.cs but I don’t know where lol

This value have to be reseted only if is a new anomaly or if the anomaly it’s finished, can you tell me where place the variable declaration so the Combat.cs not reset it everytime it’s running? xD


As i understand, every time you create a new CombatTask you create a new object with new properies.Therefore, either you need to transfer data when you create CombatTask or get data from the object to a higher level.

Maybe you should create new property in bot class?



I have already fixed that, now work, Im working right now on improve combat task actions, however thx ^^


What about the approach suggested by Terpla?:



trying to figure out exactly what is going on but I downloaded the most-recent github release 17.05.03 and I just keep getting the message “Diagnostic: “no suitable anomaly found. waiting for anomaly to appear.”(BotTask->AnomalyEnter->DiagnosticTask)” when there’s literally 23 combat sites in the system, and I can eve see them listed in the Last Measurement window in the WindowOther[0].LabelText list. Am I doing something wrong? I followed the configuration steps listed in the readme but so far I cant get it to take me to a site.