Pikacuq is tweaking A-Bot :)

Hello, new improved build available. It’s still considered as beta, but tested intensively.
Feel free to drop me an private message if anything.
Best PQ

v.2.1.3b
// 18.08.2018
Added:
- new config for Dreadnought spawns, allow you to define if you are brave and want to save your drones and like a champ go to next site, or fuck them and warp to safe like litle girlie
- FrigatePriority fully tested and verified (set your drones to passive)

Changes:
- optimized emergency ewar check
- slightly changed Dread retrieval, which now should be few seconds faster (let's monitor that)
- completely rewamped configuration for better system performance
- removed faction wreck definition from config as obsolete

Fixes:
- random issue during drone refilling which might caused not closing info window

trial code valid for today: trialKEkvcefssqAq1O

https://ufile.io/n4tfc

Just tried the new V 2.1.3b
errors out on startup I used old .config file

here is a clipboard save.
with leaves 0 s ago at 8:19:07 AM
---- Exception ----
System.NullReferenceException: Object reference not set to an instance of an object.
at Sanderling.ABot.Bot.Bot.d__75.MoveNext() in D:\Repos_NullException\src\Sanderling.ABot\Bot\Bot.cs:line 174
at Bib3.Extension.d__351.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()
at Sanderling.ABot.EnumerableExtension.d__01.MoveNext() in D:\Repos\_NullException\src\Sanderling.ABot\EnumerableExtension.cs:line 12 at System.Linq.Buffer1…ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable1.d__1.MoveNext()
at System.Linq.Enumerable.LastOrDefault[TSource](IEnumerable1 source) at Sanderling.ABot.Bot.BotExtension.TakeSubsequenceWhileUnwantedInferenceRuledOut(IEnumerable1 listTaskPath) in D:\Repos_NullException\src\Sanderling.ABot\Bot\BotExtension.cs:line 47
at Sanderling.ABot.Bot.Bot.StepOutputListTaskPath() in D:\Repos_NullException\src\Sanderling.ABot\Bot\Bot.cs:line 81
at Sanderling.ABot.Bot.Bot.Step(BotStepInput input) in D:\Repos_NullException\src\Sanderling.ABot\Bot\Bot.cs:line 126

well this is error when you mess up config.
check if you are not missing " " somewhere or , at the end of line

1 Like

@pikacuq
How do you run multiple clients with your bot?

v.2.1.4

Added:
- tested release 2.1.3b 
- more specific messages in case of some interaction needed

Changes:
- added more specific naming for Towers/Sentries as some of them colided with NPC names

Fixes:
- when droneWindow is not recognized, you will be informed and so you can restart EVE

Trial key and download link are valid for today only: trialKEYxzQ2ssqAq1O
PM me for own key if interested.

https://ufile.io/27rv8

Hello i’d be really interested to try your bot :slightly_smiling_face:

Could you pass me the variable that defines the “armorHitPoitns” so that it checks the armor of my ship?

Because I do not have this code.

you mean memory reading?
sure, here you go

var armorhitpoints = memoryMeasurement?.ShipUi?.HitpointsAndEnergy?.Armor;

this is a very good and stable bot
and thx for the hard work

At the end of summer holidays and on first September we do have new release to unleash! :slight_smile:

This is quite big update with a lot of stuff, been intensively tested past days and seems to be running flawlessly.

So here we go:

 v.2.2
// 01.09.2018

Added:
- Target Painting targets if your ship is equipped with it
- Cruise Missile Launcher and Vestment reconstructers are now recognized (no need to have them in AlwaysOnModules)
- Drone control range variable added to config. So He will not force drones to attack targets which are further then drone reach
- Few more messages for you to know if anything important is happening.
- Statistics for sites,neuts,escalation,time etc. can be toggled on/off via config
- "Humanizer" :) - set of functions to act more randomly, will be extended in next releases indeed!, on/off via config
- - Min-Max Runtime can be defined after which there will cooldown occur.
- - Variable timespan of cooldown after runtime was exceeded -> he will dock and wait given timespan
- - Variable timespan of cooldown after flexible amount of sites finished -> he will dock and wait given timespan
- - Variable timespan when or if to quit EVE before downtime.
- - Dock + Wait when no suitable anomalies are found in current system.
- - after each timers/counts are updated and next cooldown will occur at different timespan and for different timeperiod than before

Changes:
- improved readings of optimal/max ranges for painters/weapons/missiles
- redesigned variables names/types to be more descriptive and managable, new approach to time/percentual intervals (see new config example!!!!)
- completely got rid of non-standard keyboard shorcuts, now we are working only with game defaults (reset your shortcuts to defaults! - MANDATORY)
- completely rewritten Blue pilots detection for maximum accurancy
- some readings which leads to non-emergency retreat (like lost drones) are now compared with two following memory readings to avoid unwanted errors in readings
- polished Dreadnought spawns safe procedure from v.2.1.3b
- poilshed Frigate priority switch from v.2.1.3b
- better check for Align and several variables are now added into the memory reading instead of parsing them during bot run
- memory reading now reliably reads unknown modules in slightly optimized way

Fixes:
- He should not be stucked on InfoPanel submenu after undocking when undock took longer than usual
- whole bunch of nullexceptions there and there are now fixed
- no more lurking on Havens with Save Location, He will start Orbit (if allowed) and wait till rats spawns.
- no more false Retreat while launching drones.
- overall reliability improved

Valid download for 7days with valid trial till 3.9.2018
https://ufile.io/n1u8j

Enjoy
If anything, let me know :wink:

1 Like

Mate, I got the A-BOT and added some functions reading the topics here from the forum, I’m not aware of programming but I’m trying hard and I’ve already been able to do a lot of implementation in BOT so that it works the way that works for me.

The only implementation that I could not add was for him to jump to the next anomaly if I enter is already occupied by an ally.

I’ve tried countless times and asked several other users here in the forum, but so far I have not been able to get this feature to work.

Could you please help me?

My codes are …

combat.cs

					if (bot?.OwnAnomaly != true) // MEU
					{
						if (listOverviewEntryFriends.Length > 0)
						{
							yield return bot.SkipAnomaly(memoryMeasurement);
							yield return new AnomalyEnter { bot = bot };
						}
						else
						{
							bot?.SetOwnAnomaly(true);
						}
					}

module.cs

	public class SkipAnomalyF : IBotTask
	{
		public Sanderling.Parse.IMemoryMeasurement MemoryMeasurement;
		public IEnumerable<IBotTask> Component => null;
		public static bool ActuallyAnomaly(Interface.MemoryStruct.IListEntry scanResult) =>
			scanResult?.CellValueFromColumnHeader("Distance")?.RegexMatchSuccessIgnoreCase("km") ?? false;
		public static bool AnomalySuitableGeneral(Interface.MemoryStruct.IListEntry scanResult) =>
			scanResult?.CellValueFromColumnHeader("Group")?.RegexMatchSuccessIgnoreCase("combat") ?? false;
		public IEnumerable<MotionParam> Effects
		{
			get
			{
				//var altKey = VirtualKeyCode.MENU;
				var pKey = VirtualKeyCode.VK_A;

				//yield return altKey.KeyDown();
				yield return pKey.KeyDown();
				//yield return altKey.KeyUp();
				yield return pKey.KeyUp();

				//yield return altKey.KeyDown();
				yield return pKey.KeyDown();
				//yield return altKey.KeyUp();
				yield return pKey.KeyUp();

				var probeScannerWindow = MemoryMeasurement?.WindowProbeScanner?.FirstOrDefault();
				var scanActuallyAnomaly =
					probeScannerWindow?.ScanResultView?.Entry?.FirstOrDefault(ActuallyAnomaly);

				if (null != scanActuallyAnomaly)
				{
					var menuResult = MemoryMeasurement?.Menu?.ToList();
					if (null == menuResult)
					{
						yield return scanActuallyAnomaly.MouseClick(MouseButtonIdEnum.Right);
					}
					else
					{
						menuResult = MemoryMeasurement?.Menu?.ToList();
						var menuResultToUse = menuResult[0].Entry?.ToList();
						if (menuResultToUse[2].Text == "Ignore Result")
						{
							yield return menuResultToUse[2].MouseClick(MouseButtonIdEnum.Left);
						}
					}
				}
			}
		}
	}
}

What happens is that when I enter an anomaly that already has an alido, my BOT does nothing, it follows normally, instead of jumping to the next anomaly.

your skipanomaly looks unnecessary complicated - do not try to put everyting in one class, it will be mess as fuck
Here is partial code I was using

combat.cs you should have something like

					// is it ours?
					if (bot?.AnomOwn != true)
					{
						var listOverviewEntryFriends = listOverviewEntry?.Where(entry => entry?.ListBackgroundColor?.Any(BackgroundColors.IsFriend) ?? false)?.ToArray();
						
						if (listOverviewEntryFriends.Count() == 0)
						{
							bot.AnomOwn = true;
						}
						else
						{
							var probeScannerWindow = memoryMeasurement?.WindowProbeScanner?.FirstOrDefault();
							var scanActualAnomaly = probeScannerWindow?.ScanResultView?.Entry?.FirstOrDefault(ActualAnomaly);

							if (null == scanActualAnomaly && bot?.AnomSkip != true)
							{
								yield return new ReloadAnomalies();
							}
							else if (null != scanActualAnomaly && bot?.AnomSkip != true)
							{
								yield return new SkipAnomaly { bot = bot };
								bot.AnomSkip = true;
							}
							else if (null != scanActualAnomaly && bot?.AnomSkip == true)
							{
								yield return new SkipAnomaly { bot = bot };
								bot.AnomSkip = true;
							}
							else if (null == scanActualAnomaly && bot?.AnomSkip == true)
							{
								yield return new AnomalyEnter { bot = bot };
							}
						}
					}

scan anomaly is simple, as well as reload

	public class SkipAnomaly : IBotTask
	{
		public Bot bot;

		static public bool ActualAnomaly(Interface.MemoryStruct.IListEntry scanResult) => scanResult?.CellValueFromColumnHeader("Distance")?.RegexMatchSuccessIgnoreCase("km|m") ?? false;

		public IEnumerable<IBotTask> Component
		{
			get
			{
				var memoryMeasurementAtTime = bot?.MemoryMeasurementAtTime;
				var memoryMeasurement = memoryMeasurementAtTime?.Value;

				var probeScannerWindow = memoryMeasurement?.WindowProbeScanner?.FirstOrDefault();
				var scanActualAnomaly = probeScannerWindow?.ScanResultView?.Entry?.FirstOrDefault(ActualAnomaly);

				if (null != scanActualAnomaly)
				{
					yield return scanActualAnomaly.ClickMenuEntryByRegexPattern(bot, "Ignore Result");
				}
				else
				{
					yield break;
				}
			}
		}

		public IEnumerable<MotionParam> Effects => null;
	}


	public class ReloadAnomalies : IBotTask
	{
		public IEnumerable<IBotTask> Component => null;

		public IEnumerable<MotionParam> Effects
		{
			get
			{
				yield return KeyBinds.Key_ProbeScanner.KeyboardPressCombined();
				yield return KeyBinds.Key_ProbeScanner.KeyboardPressCombined();
			}
		}
	}

be advised that those snippets will not work in your code, you have to adapt those.
Best PQ

May I have a personal key for your bot?

Maniac

I was able to add the codes, I will perform some tests and see if it is working.

My friend, I made changes to the code and tested it, however, when it enters an anomaly that is already being executed by an ally, it opens and closes the anomalies window, but it does not ignore the first one (which I am currently) and does not move to the next, simply stands still on the system by opening and closing the window.

My codes are as follows.

combat.cs

						if (listOverviewEntryFriends.Count() == 0)
						{
							bot?.SetOwnAnomaly(true);
						}
						else
						{
							var probeScannerWindow = memoryMeasurement?.WindowProbeScanner?.FirstOrDefault();
							var scanActualAnomaly = probeScannerWindow?.ScanResultView?.Entry?.FirstOrDefault(ActualAnomaly);

							if (null == scanActualAnomaly && bot?.AnomSkip != true)
							{
								yield return new ReloadAnomalies();
							}
							else if (null != scanActualAnomaly && bot?.AnomSkip != true)
							{
								yield return new SkipAnomaly { bot = bot };
								bot?.SetAnomSkip(true);
							}
							else if (null != scanActualAnomaly && bot?.AnomSkip == true)
							{
								yield return new SkipAnomaly { bot = bot };
								bot?.SetAnomSkip(true);
							}
							else if (null == scanActualAnomaly && bot?.AnomSkip == true)
							{
								yield return new AnomalyEnter { bot = bot };
							}
						}
					}

modules.cs

	public class SkipAnomaly : IBotTask
	{
		public Bot bot;

		static public bool ActualAnomaly(Interface.MemoryStruct.IListEntry scanResult) => scanResult?.CellValueFromColumnHeader("Distance")?.RegexMatchSuccessIgnoreCase("km|m") ?? false;

		public IEnumerable<IBotTask> Component
		{
			get
			{
				var memoryMeasurementAtTime = bot?.MemoryMeasurementAtTime;
				var memoryMeasurement = memoryMeasurementAtTime?.Value;

				var probeScannerWindow = memoryMeasurement?.WindowProbeScanner?.FirstOrDefault();
				var scanActualAnomaly = probeScannerWindow?.ScanResultView?.Entry?.FirstOrDefault(ActualAnomaly);

				if (null != scanActualAnomaly)
				{
					yield return scanActualAnomaly.ClickMenuEntryByRegexPattern(bot, "Ignore Result");
				}
				else
				{
					yield break;
				}
			}
		}

		public IEnumerable<MotionParam> Effects => null;
	}


	public class ReloadAnomalies : IBotTask
	{
		public IEnumerable<IBotTask> Component => null;

		public IEnumerable<MotionParam> Effects
		{
			get
			{
				var pKey = VirtualKeyCode.VK_A;
				yield return pKey.KeyDown();
				yield return pKey.KeyUp();
			}
		}
	}

bot.cs

		public bool OwnAnomaly { private set; get; }
		public bool AnomSkip { private set; get; }

		public void SetOwnAnomaly ( bool value )
		{
			OwnAnomaly = value;
		}

		public void SetAnomSkip ( bool value )
		{
			AnomSkip = value;
		}

place your debug on each step to find out what is it doing

System.Diagnostic.Trace.WriteLine("step1")

and run your code from VS

also, all column headers on probe scanner have to be visible, bot has difficulties where something is missing

Hello everyone, another update available + 1d trial included :wink:
Introducing bot cooperation mode and tractor beams for convenient - not bouncing - officer looting

v.2.2.2
// 13.09.2018

Added:
- Pilot cooperation. Cooperation mode with other Alts/Bots/players can be toggled from now on.
- - Definition of pilot names via config, which will be considered as non-warp-off reasons when landing on site with them (your bot will start combat at site together with those names already on site)
- - Be careful tho, more ships on grid, bigger chance to have Dread spawn ;)

- Added support for Tractor Beams as bouncing in Rock Heavens suxx! Now He will stop before rock, pull wreck with beam, loot and continue to next site :)

Updated:
- officer wrecks naming updated
- slightly updated loot procedure to be more accurate and quicker
- updated counting of loot/escalations etc. to be more accurate
- switched to the new more reliable hosting provider

https://ufile.io/1mniv

Enjoy, and as always private message me if you have questions
PQ

1 Like

My friend, could you send me the .cs files of your bot for me to study the codes and adapt to my BOT?

would you reupload to different host since this one is not free anymore?