EVE Online Anomaly Ratting Bot Release

This message looks like it is trying to enable the info panel for the current system. This info panel is needed for the bot to operate.
Maybe detection of that info panel depends on localization, so if this info panel is already visible in the client, next try to switch the eve online client to english language.

Hi @raphael.mca
Well I was in your shoes not long ago, luckily there are several helpful people here to assist.
@Viir helped me through the process and you can see how do get setup here: Building A-Bot

Read through my comments in this thread first to see that you need to get visual studio setup first.

@ivar85
You should be able to use them in both, but its not a complete botting solution at the moment.
It will go to any site even though there is someone there along with not orbiting out of the box (I got help setting that up as you can see in this thread though), won’t activate armor/shield repairs on it’s own and probably more things other paid for solution can provide.
But this framework has the potential to be much better if someone knows how to code in the missing functions.

1 Like

@Viir

Im trying to click on the fightersSquadron “LaunchAllButton”

In Combat.cs I added:

var fightersSquadron = memoryMeasurement?.ShipUi.SquadronsUI;

			var Launch_Figthers = fightersSquadron?.LaunchAllButton;

			yield return Launch_Figthers?.MouseClick(BotEngine.Motor.MouseButtonIdEnum.Left);

I tryied more time in different way to wrap the Motion to Bot.cs then delcare Motion into the BotTask.cs

But nothing I get always this error:

“Cannot implicitly convert type ‘Sanderling.Motor.MotionParam’ to ‘Sanderling.ABot.Bot.IBotTask’. An explicit conversion exists (are you missing a cast?)”

Can you show me the code to make mouseClick usable into the Combat.cs ?

Is it possible to get this bot to loot and salvage ?

I guess, you should create new task for this. Something like this (not tested):

    public class LaunchFigthers: IBotTask
	{
		public Bot bot;

		public IEnumerable<IBotTask> Component => null;

		public IEnumerable<MotionParam> Effects
		{
			get
			{
                var launchFigthers = bot?.MemoryMeasurement?.ShipUi.SquadronsUI?.LaunchAllButton;
				if (launchFigthers==null)
					yield break;

				yield return launchFigthers?.MouseClick(BotEngine.Motor.MouseButtonIdEnum.Left);
			}
		}
		
	}
1 Like

Already done, after some coffe and cigarettes ahahah :smiley:

I was studying the priority order of targhets.

I saw A-Bot go to order by ewar and then by distance, I want to do the same but between the ewar and the distance I want specificy the ship type order, like:

  1. Frigates
  2. Cruiser
  3. BS
  4. Others

this is the function to sort the primary:

var listOverviewEntryToAttack =
				memoryMeasurement?.WindowOverview?.FirstOrDefault()?.ListView?.Entry?.Where(entry => entry?.MainIcon?.Color?.IsRed() ?? false)
				?.OrderBy(entry => bot.AttackPriorityIndex(entry))
				?.ThenBy(entry => entry?.DistanceMax ?? int.MaxValue)
				?.ToArray();

but I not find how modify it.

The order I want apply is:

First: Ships With Ewar
Second: By ShipType → (from the smallest to the biggest)
Third: By Distance

Can you help me? @Viir @Terpla :smiley:

I have only one idea: read hinttext from overview and sort by it:

As far as I know, hinttext is not yet available, but Viir is working on it.

@Terpla @Viir

I studied more the “priority” stuff, and I finded another logical way to do it right now, but I need help.

This is the way:

A-Bot retrieve the “Type” column and this is indicixed into array per each entry, the Type of NPC are always the same per class, this mean it’s possible create an array per each type like:

“Blood Raiders Frigate”
“Blood Raiders Destroyers” etc

and after order it like with the distance.

I can export easy and fast the full npc ship’s type per each race, but I need a little bit of help on build the function.

1 Like

Abbadon and I use the different icons as well to differentiate between NPC types, so the hintText would be great, since that allows bots to prioritize targets by type regardless of the rat names.

On this note: is there a reason why the icon is not present in the Overview? I couldn’t find it, and it contains a lot of information (type, whether it’s locked, whether it’s yellow/red-boxed you, etc.). If anyone knows where to find this info, it would be a great benefit.

About priority targhet, I found a logical solution, me and another dev are already on working on it, stay tuned lol

1 Like

I wrote a function for sorting and a small example for a console application.

using System;
using System.Collections.Generic;
using System.Linq;

namespace SortedList
{
    class Program
    {
        public class OverviewEntry
        {
            public int RowNumber { get; set; }
            public string TypeColumn { get; set; }
            public int SortedPriorityForTest { get; set; }
        }

        static string[] configListOfTargets = {
             "F","C","BC","BS"
        };

        static void Main(string[] args)
        {
            var overview = new OverviewEntry[7]
            {
                new OverviewEntry { RowNumber = 8, TypeColumn = "BS", SortedPriorityForTest = 3},
                new OverviewEntry { RowNumber = 6, TypeColumn = "F" , SortedPriorityForTest = 0},
                new OverviewEntry { RowNumber = 5, TypeColumn = "BS", SortedPriorityForTest = 3 },
                new OverviewEntry { RowNumber = 9, TypeColumn = "C", SortedPriorityForTest = 1 },
                new OverviewEntry { RowNumber = 3, TypeColumn = "BC", SortedPriorityForTest = 2 },
                new OverviewEntry { RowNumber = 2, TypeColumn = "F", SortedPriorityForTest = 0 },
                new OverviewEntry { RowNumber = 1, TypeColumn = "C", SortedPriorityForTest = 1 }
                };

            var result = SortByOrder(configListOfTargets, overview, x => x.TypeColumn);

            foreach (var s in result)
            {
                Console.WriteLine(s.SortedPriorityForTest+". row: "+ s.RowNumber + " -  " + s.TypeColumn);
            }

            Console.ReadLine();
        }

        private static IEnumerable<TO> SortByOrder<T, TO>(T[] order, IEnumerable<TO> objects, Func<TO, T> getter)
        {
            var ordering = order.Select((x, i) => new { Class = x, Order = i }).ToDictionary(_ => _.Class, _ => _.Order);

            return objects.OrderBy(x => ordering[getter(x)]);
        }
    }
}

configListOfTargets - array of strings with rats name. You can add new parameter for bot.config like SetAnomalyEnabledNamePattern. In this example it’s mean ship type “F”- frigate, “C” - cruiser etc.

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)

@Viir

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 =
	memoryMeasurement?.WindowOverview?.FirstOrDefault()?.ListView?.Entry
	?.Where(entry => entry?.ListBackgroundColor?.Any(IsFriendBackgroundColor) ?? false)
	?.ToArray();
1 Like