What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal
RebornBuddy Forums

Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

[Plugin] FlaskHelper

Little help need, what I should do here:

Exception during plugin Tick.System.ArgumentNullException: Value cannot be null.
Parameter name: cond
at FlaskHelper.Helpers.PythonHelpers.EvaluateCondition(String callerName, String cond, LocalPlayer me, Item flask, Boolean debug) in C:\Users\Bravo\Desktop\Brandt\3rdParty\_CONFIGS_\Default\FlaskHelper\Content-1557903\Helpers\PythonHelpers.cs:line 23
at FlaskHelper.FlaskHelper.Tick() in C:\Users\Bravo\Desktop\Brandt\3rdParty\_CONFIGS_\Default\FlaskHelper\Content-1557903\FlaskHelper.cs:line 150
at Loki.Bot.PluginManager.‬‪*‪*‫‪‬‎****‬*​‎‎‬*‎‎*(IPlugin )
 
I copy example here for

FH.SpecificRarityMobAround(Rarity.Rare, 20) > 0
FH.NumberOfMobsNear(me, 20) > 8
me.ManaPercent < 93

Now how would i type for

IsCursed

and

IsBleeding

FH.isCursed (me,20) 1 is this the correct way?
IsBleeding (me,20) 1 is this the correct way?

I really dont like sims. I only wish it was more simple for condition or exact examples,

Like this NumberOfMobsNear(object, distance) or SpecificRarityMobAround(rarity, distance) would not make sense to me, so i rolled back to my old flask helper then i saw someone posted a real examplpe, that helped me. I am sure there is a lot of noobs out there like me and also dont like sims.

Can someone post examples for

- IsCursed
- IsBleeding

And do i post that under condition my flask that has that future? TY
 
Last edited:
ty, do i add it under regular , or can i add under regular mana, life flask or instant ? or it has to be at the very bottom curse removal option? or both? ty very much
 
?? there's an instant flask entry already, use the simple condition "me.HealthPercent < X"

I tried this with life flask and instant life flask in the condition but the bot isnt using health potion. Stupidly didnt test it before trying to bot on my level 70 in HC and I died lol. Screwing around with it on a new character but can't get life flasks to work. I have no issue getting other flasks to work just not life or mana. Would really appreciate any help. Also i set X to 90
 
This is an amazing plugin with huge possibilities - awesome contribution from toNyx (shameless top of the post plug here - donate to him here) - making the bot one step closer to its true manifestation Skynet! As my very small contribution I am going to show you how to create some default flask settings.


Click the SHOW button below for the Real Basics of installing a plugin:

[HIDE]
1. Copy the ZIP file to your 3rdParty directy (do NOT unzip)

k1lCG1e.png


2. Start Exile Buddy
3. Look for the Settings tab at the top

VNroPPB.png


4. Click the down arrow beside Plugins in the left column

psl8F7l.png


5. Scroll down to Flask Helper and Click on it

VAue4Go.png


6. In the right side window you can see the Flask Helper and the Enable Button - tick the Enable button

3LxgLg5.png


IMPORTANT NOTE: POE is a complicated game and the bot is even more complicated. If you want to be successful then you will need to read a lot and learn a lot. If you had to follow this guide for installing a plugin, then I can tell you for free that you haven't spent enough time reading the other guides before coming here. Do yourself a favour and try to read as much as possible before asking questions. Your questions have all been answered on this forum - search it and you will find them.
[/HIDE]


NOTE: If you are using Flask nodes to extend the length and power of your Flasks, then you can probably set all of the values below lower as your Flasks effects will last longer, giving them more time to recharge.
The default settings below are mainly for melee characters, for casters you would still use the same conditions, but mostly increase the distance values.

So - here we go - once you have the plugin enabled lets start easy with Life Flask:

Life Flasks
Pick "Life Flask" from the drop down.
IGNORE the box with Selector and a line of code in it - we DON'T want to touch that or things will go crazy and you will die! (this line of code is simply the bots way of identifying the flask)
Simply Tick Enable Usage - now the bot knows you have a Life Flask.
Next we need to tell it when to use them - so click in the table (blank space) just underneath CONDITION and paste the following:
me.HealthPercent < 80
Then tick ENABLED next to it.
Now when your health goes below 80% the bot uses your life flask.

X6ChBcV.png


Instant Life Flasks
Do the same for Instant Life Flask, but change 80 to 65. If you find you are still dying because you are too squishy, then up the values.
me.HealthPercent < 65

Mana Flask
If you have mana reserved, then you need to adjust this so that it is less than your reserved percentage otherwise the bot will keep using your Mana Flask:
me.ManaPercent < 80

Quicksilver Flask
If you only want to use this when you get value from it (i.e. when we will run at least a little bit before needing to stop to kill mobs) - we check there are no mobs within a certain distance of us (defined units as "feet" or f for short - check these images to get an idea of what distances look like on screen) in this case 70 units and hit it:
FH.NumberOfMobsNear(me,70) < 1

As you can see the common format for these settings involves the distance from me, a type of mob and a number of mobs:

FH.NumberOfMobsNear(me,distance_in_units) > number_of_mobs

If you have quick refills with Surgeons on Crit, then you might want to spam Quicksilver off cooldown:
FH.NumberOfMobsNear(me,70) < 1
FH.NumberOfMobsNear(me,70) > 0

Diamond Flask, Vessel of Vinktar (And most other offensive flasks)
We want our Crit boosted when there are a few mobs, or tough mobs so:
FH.SpecificRarityMobAround(Rarity.Unique, 20) > 0
FH.SpecificRarityMobAround(Rarity.Rare, 20) > 0
FH.SpecificRarityMobAround(Rarity.Magic, 25) > 2
FH.NumberOfMobsNear(me, 30) > 4
If you find you are always at max flask charges, then lower the 2,4 (you will spend flasks charges more quickly) if you keep running out of charges during a fight then increase them. For Vessel of Vinktar you will also want Energy Shield Detection:
me.EnergyShieldPercent < 65


Granite Flask (And most other defensive flasks)
Defensive flasks we want to increase the range a bit because of those annoying jumping things and other fast moving mobs.
FH.SpecificRarityMobAround(Rarity.Unique, 50) > 0
FH.SpecificRarityMobAround(Rarity.Rare, 50) > 0
FH.SpecificRarityMobAround(Rarity.Magic, 55) > 2
FH.NumberOfMobsNear(me, 60) > 4

You will also want some health or Energy shield protection:
me.HealthPercent < 80
or
me.EnergyShieldPercent < 80

Dispelling (Remove xxxxx)
Each of your flasks should have some kind of dispel e.g. Burning, Shocked, Poisoned etc - to make the bot use the dispel you should paste the relevant condition below into to the flask conditions for the flask it is on:

FH.IsBleeding
FH.IsShocked
FH.IsBurning
FH.IsPoisoned
FH.IsCursed
FH.IsChilledOrFrozen

So if your Life Flask has Removes Bleeding, then you add FH.IsBleeding as a condition to the Life Flask.

Resistance Flasks (Ruby, Topaz etc)
Resistance Flasks are very dependent upon the Map level and danger level you are running - increase the mob count an the distance if you are running EZ game EZ life settings, reduce them if you are pushing higher Maps where insta-death is a regular occurrence. If you are running a CI build you want to have these up before pretty much any fight and any time that you experience the related debuff like Burning etc. I have used the mobs more than >2 setting along with the Unique and Rares - smaller distances as hopefully most stuff is dead before it gets within 8f, you should increase or decrease this depending on how much of the time you are out of Flask Charges.

Ruby Flask
FH.SpecificRarityMobAround(Rarity.Unique, 20) > 0
FH.SpecificRarityMobAround(Rarity.Rare, 20) > 0
FH.NumberOfMobsNear(me, 8) > 2
FH.IsBurning
You should also add your Flasks's Dispel e.g. Removed Shock on Use
FH.IsShocked
It is worth adding in an "O Shit" press all flasks button for low health:
me.HealthPercent < 50
or low Energy Shield
me.EnergyShieldPercent < 80

Spamming Flasks Off Cooldown
If you are OP, then you probably just want to spam resistance and quicksilver all the time, so this is one way you can do that:
FH.NumberOfMobsNear(me,70) < 1
FH.NumberOfMobsNear(me,70) > 0
Essentially telling the bot to use the flask if there are no mobs within 70f or if there is 1 or more mobs within 70f i.e. all the time. FlaskHelper will detect when your buff has expired and recast appropriately - awesome right!? (I know this should work with 1 line of code, but it just doesn't

NOTE: If you are using Flask nodes to extend the length and power of your Flasks, then you can probably set all of the values below lower as your Flasks effects will last longer, giving them more time to recharge.


WANNA GET SERIOUS ABOUT YOUR FLASKS? ADVANCED USAGE - ZONES

This is for people who want to min max their setup or c/hour or reach level 100 - your average botter can skip all this stuff. The above setup is more than enough to keep you alive in most situations.

We have talked about single conditions and you have seen the examples - but you can get a lot more complicated with Flask Helper by setting what i am going to call "zone" conditions.
For this example I am going to use Vessel of Vinktar - a nice offence and defensive flask with 1 big drawback - it only has 1 charge per fight - so we really want to fine tune it a bit to make sure we dont use it on some white mobs when the big bad unique boss mob is just around the corner. If we look at a standard rule:

me.EnergyShieldPercent < 80

If some solo jumping random white mob gets a lucky hit in it could hit us for 20% of our ES - we don't want to pop VoV in this situation as it will be a waste and take ages to refill. We set zones to ensure we use the VoV at the right time

So take a look at the rules below and I will explain the thinking behind them.

me.EnergyShieldPercent < 80 and FH.NumberOfMobsNear(me, 30) > 3
me.EnergyShieldPercent < 80 and FH.SpecificRarityMobAround(Rarity.Magic, 25) > 2
me.EnergyShieldPercent < 75 and FH.SpecificRarityMobAround(Rarity.Rare, 20) > 0
me.EnergyShieldPercent < 70 and FH.SpecificRarityMobAround(Rarity.Unique, 20) > 0
me.EnergyShieldPercent < 35

Now we will pop VoV in the much lower oh shit 35% ES zone, no matter what (me.EnergyShieldPercent < 35) - we assume that there are enough mobs around us to do the last 35% damage - and easily kill us.
But we can stop the VoV from popping if a single white mob that hits us for a lucky 20% in the original setup by ensuring that we only pop the VoV if there are also now at least 3 mobs within 30f of us (me.EnergyShieldPercent < 80 and FH.NumberOfMobsNear(me, 30) > 3).
The rest of the settings take into account Magic,Rare and Unique mobs - lowering the ES% and the range in zones (these kind of ranges 80,75,70 are caster ranges - melee can definitely lower the ranges and up all of the minimum mob numbers as well). You get the idea hopefully and can see how these zones will stop you from wasting the big 1 use flasks at the wrong time.

Another good example is Atziri's Promise this flask enables you to leech life from mobs. Our standard basic setup might include an oh shit:

Code:
me.EnergyShieldPercent < 65

But actually we only want to use the flask when we can get some leeching from it - not for example when we are walking on burning ground or some other environmental effect - we NEED mobs around us to leech from. So the setup needs a bit of tweaking so that it only triggers when there are mobs near us (for example more than 2 mobs within 60f) that we can kill to leech life from:

Code:
me.EnergyShieldPercent < 65 and FH.NumberOfMobsNear(me,60) >2

But ... we also want it for the boss fights ... and often the boss is in a room and the white trash dies before you get to the boss - our >2 mobs setting wont trigger against the single boss... so we need to combine in some of the other bits from before:

Code:
me.EnergyShieldPercent < 65 and ((FH.NumberOfMobsNear(me,60) >2) or (SpecificRarityMobAround(Rarity.Rare, 40) > 0) or (FH.SpecificRarityMobAround(Rarity.Unique, 40) > 0))

HOW TO ADD NEW FLASKS
New leagues mean new flasks - to add these yourself rather than pester tNyx you should do the following:

Already known flask auras (so you can skip the code part below and go straight to the setup:
Divination Distillate Aura: unique_flask_divination_distillate
The Overflowing Chalice Sulpher Flask Aura: overflowing_chalice
Rotgut Quicksilver Flask Aura: flask_utility_sprint
Kiaras Determination Aura: kiaras_determination
Dying Sun: unique_flask_dying_sun

If your flask is listed above, then you can skip straight to step 11.

  1. In the left hand menu in EB click on the DevTab
  2. Delete EVERYTHING in the left side CODE window
  3. Paste in all of the following code into the big area Code:
    Code:
    using System;
    using System.Linq;
    using System.Reflection;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Threading.Tasks;
    using Buddy.Coroutines;
    using Loki;
    using Loki.Common;
    using Loki.Game;
    using Loki.Game.GameData;
    using Loki.Bot;
    using Loki.Bot.Pathfinding;
    using log4net;
    
    public class RuntimeCode
    {
    	private static readonly ILog Log = Logger.GetLoggerInstanceForType();
    
    	private Coroutine _coroutine;
    
    	public void Execute()
    	{
    		using(LokiPoe.AcquireFrame())
    		{
    			ExilePather.Reload();
    		}
    
    		// Create the coroutine
    		_coroutine = new Coroutine(() => MainCoroutine());
    
    		// Run the coroutine while it's not finished.
    		while(!_coroutine.IsFinished)
    		{
    			try
    			{
    				using(LokiPoe.AcquireFrame())
    				{
    					_coroutine.Resume();
    				}
    			}
    			catch (Exception ex)
    			{
    				Log.ErrorFormat("[Execute] {0}.", ex);
    				break;
    			}
    		}
    
    		// Cleanup the coroutine if it already exists
    		if (_coroutine != null)
    		{
    			_coroutine.Dispose();
    			_coroutine = null;
    		}
    	}
    
    	private async Task<bool> UserCoroutine()
    	{
    		Log.InfoFormat("UserCoroutine ");
    foreach (var aura in Loki.Game.LokiPoe.Me.Auras)
                    Log.Error(aura.InternalName);
    		return false;
    	}
    
    	private async Task MainCoroutine()
    	{
    		while (true)
    		{
    			if (LokiPoe.IsInLoginScreen)
    			{
    				// Offload auto login logic to a plugin.
    				foreach (var plugin in PluginManager.EnabledPlugins)
    				{
    					await plugin.Logic("login_screen");
    				}
    			}
    			else if (LokiPoe.IsInCharacterSelectionScreen)
    			{
    				// Offload character selection logic to a plugin.
    				foreach (var plugin in PluginManager.EnabledPlugins)
    				{
    					await plugin.Logic("character_selection");
    				}
    			}
    			else if (LokiPoe.IsInGame)
    			{
    				// Execute user logic until false is returned.
    				if(!await UserCoroutine())
    					break;
    			}
    			else
    			{
    				// Most likely in a loading screen, which will cause us to block on the executor, 
    				// but just in case we hit something else that would cause us to execute...
    				await Coroutine.Sleep(1000);
    				continue;
    			}
    
    			// End of the tick.
    			await Coroutine.Yield();
    		}
    	}
    }
  4. Press the RUN CODE button at the bottom right of the window.
  5. Look in your main EB window at the visual log of what the bot does and you should see some new red text similar (but not the same as):
    UserCoroutine
    player_aura_energy_shield
    herald_of_ash
    flask_utility_haste
  6. Congrats you are now a coder and can see what auras you have around you at all times when you press the RUN CODE button.
  7. While in your HO, press the flask button for the flask you want to add and then switch to the EB DevTab and press the RUN CODE button
  8. You should see the red list again - but this time there should be a NEW entry. I used Kiara's Determination and my output is now:
    UserCoroutine
    player_aura_energy_shield
    herald_of_ash
    kiaras_determination
    flask_utility_haste
  9. Awesome right!? But WTF are we doing all this? Well because FlaskHelper is so awesome it automatically detects when you do and do NOT have the aura and that is what stops it simply spamming the aura constantly.
  10. Back to business - now we are going to add the new flask
  11. Click on Flask Helper in the left menu in EB
  12. Click the downward arrow beside FLASKS
  13. Scroll downwards in the FlaskHelper window and you will see a GIANT full width button which reads NEW FLASK it is so big that you probably won't see it the first time you look - it is there I promise you.
  14. Click NEW FLASK and a new section appears
  15. In the FLASK NAME box type the Name of the Flask - for me I typed: Kiaras Determination (do NOT use ' it sometimes makes code go funny)
  16. In the AURA NAME box you now want to paste from your EB visual log window the name of the aura: kiaras_determination
  17. Most new flasks are instant - so tick the Instant box if yours is
  18. Almost there - now you have your new flask listed at the bottom of the flasks list we need to tell FlaskHelper how to find our new flask.
  19. Scroll down your list of flasks to the bottom and click on the new one. Tick ENABLE
  20. Now you need to add in the SELECTOR - this is essentially how the bot finds the flask to press
  21. In the SELECTOR box paste the following:
    Code:
    f.Rarity == Rarity.Unique and f.FullName.Contains("xxx")
  22. There are 3 xxx's in the code above which you MUST change to your Flask name - this time you can use the ' so for my Kiara's Determination the code looks like this:
    Code:
    f.Rarity == Rarity.Unique and f.FullName.Contains("Kiara's Determination")
    (make sure you leave the "" surrounding the name).
  23. Great work if you got this far - you read more than 99% of the population of earth today!
  24. now scroll to the top of this post and add in your CONDITIONS and you have yourself a working shiny new flask

I hope you found this guide useful - none of it would be possible without tNyx - so my thanks go to him (shameless bottom of the post plug here - donate to him here)
 
Last edited:
This is an amazing plugin with huge possibilities - awesome contribution from toNyx - making the bot one step closer to its true manifestation Skynet! As a very small contribution I am going to try to setup/copy a few basic default flask settings.

Once you have the plugin enabled lets start easy with Life Flask:
Life Flasks
Pick "Life Flask" from the drop down. IGNORE the box with Selector and a line of code in it - we DON'T want to touch that or things will go crazy! (this is the bots way of identifying the flask)
Simply Tick Enable Usage - now the bot knows you have a Life Flask. Next we need to tell it when to use them - so click in the table (blank space) just underneath CONDITION and paste the following:

Then tick ENABLED next to it. Now when your health goes below 80% the bot uses your life flask. Do the same for Instant Life Flask, but change 80 to 65. If you find you are still dying because you are too squishy, then up the values.

Mana Flask
If you have mana reserved, then you need to adjust this so that it is less than your reserved percentage otherwise the bot will keep using your Mana Flask:


Quicksliver Flask
You only want to use this primarily when you get value from it - so we check there are no mobs within 70f and hit it:


Diamond Flask, Granite, Vessel of Vinktar (And most other offensive flasks)
We want our Crit boosted when there are a few mobs, or tough mobs so:

If you find you are always at max flask charges, then lower the 2,4 (you will spend flasks charges more quickly) if you keep running out of charges during a fight then increase them.

Dispelling (Remove xxxxx)
Each of your flasks should have some kind of dispel e.g. Burning, Shocked, Poisoned etc - to make the bot use the dispel you should paste the relevant condition below into to the flask conditions for the flask it is on:



So if your Life Flask has Removes Bleeding, then you add FH.IsBleeding as a condition to the Life Flask.

Resistance Flasks (Ruby, Topaz etc)
If you are running a CI build you want to have these up before pretty much any fight and any time that you experience the related debuff like Burning etc. I have used the mobs more than >2 setting, you should increase or decrease this depending on how much of the time you are out of Flask Charges.

Ruby Flask

You should also add your Flasks's Dispel e.g. Removed Shock on Use


NOTE: If you are using Flask nodes to extend the length and power of your Flasks, then you can probable set all of the values below lower as your Flasks effects will last longer, giving them more time to recharge.

I will update this post with more as I set them up.


thank you. i screwed with something i wasnt sposed to and i ripped a level 70 because of it haha
 
This is an amazing plugin with huge possibilities - awesome contribution from toNyx - making the bot one step closer to its true manifestation Skynet! As a very small contribution I am going to try to setup/copy a few basic default flask settings.
I will update this post with more as I set them up.

To me, you win the internet for this post!! I was so confused by all of this. thank you so much for this.
 
Notice there's an error in the mana flask selector, "&&" should be changed to "and" instead.
 
Where we have to copy the file? Because i didnt find the FlashHelper in the plugin list ='(
 
FlaskHelper is a plugin.You have download link on first page , first post at the bottom of this thread, unzip to your exilebuddy folder -3rd party, restart the exilebuddy, dont forget to instal CommunityLib also
 
Last edited:
then for using it, on 1st page, 2nd post
"See this constructive post by WiN : LINK"
instructions very helpful
 
I'd like to use quicksilver flasks every 8 sec , is this possible to set up now?
 
I'd like to use quicksilver flasks every 8 sec , is this possible to set up now?

The bot will detect when your quick silver has run out and if you add conditions like the following to your ENABLED Quick Silver Flask settings:

FH.NumberOfMobsNear(me,70) < 1

It will reuse the flask again and again until you run out of charges or there is at least 1 mob within 70f - awesome right!?
 
Last edited:
Not quite sure I'm doing the flasks right. Needed mana flask, do I have to create that exact mana flask and same for health potions?
Sorry for the confusion
 
Not quite sure I'm doing the flasks right. Needed mana flask, do I have to create that exact mana flask and same for health potions?
Sorry for the confusion

Nope, there's a generic way using "selector" for pots, basically Ive added all the known flasks by default, they should work (except mana, correct the selector remove && replace it by "and")

just add conditions under it after enabling. See win post for infos
 
Below is a FlaskHelper.json config file that will populate most of the commonly used flask conditions for every flask. Simply copy this file and paste it into EB > Settings > Default. Conditions are based off toNyx / widds posts explaining the conditions. Make sure EB is turned off when copying this, otherwise i believe the settings wont be saved.

Most of the populated conditions are going to be self explanatory. I will go over a few tho just so no one gets confused.

Health / Mana Thresholds
me.ManaPercent < 20
me.Mana < 100

Percent based thresholds are used by default.
Exact hp/mana is there just to make it easier when reserving a lot of your hp/mana. This way lets you use a mana pot at say 100 mana instead trying to figure out percents after the reserves. This is disabled by default.


Quicksilver Flask
FH.NumberOfMobsNear(me, 80) == 0
FH.NumberOfMobsNear(me, 50) >= 1

This red portion is disabled by default, but its there for shield charge / cyclone specs since both of these skills benefit from movement speed while fighting, so using this flask while fighting is fine.


Most Flasks
me.HealthPercent < 65

This is disabled by default, but i enable this on all my flasks as an "oh shit" button. Adjust the HP% to fit your needs.


Things to note
Poison Removal isnt in yet (any version). I believe this was never tested. I will add it into this file when someone can verify it works.

If someone wants to go test it, just add this to the FlaskHelper.json file near the other removal flasks:

Code:
    {
      "Enabled": false,
      "Name": "Curing Flask (Poison Removal)",
      "Aura": "flask_bonus_poison_immunity",
      "Selector": "f.Stats.ContainsKey(StatTypeGGG.LocalFlaskPoisonImmunityWhileHealing)",
      "Conditions": [
        {
          "Enabled": true,
          "Condition": "FH.IsPoisoned"
        }
      ]
    },


At the very least people will be able to visually see how all the conditions are suppose to work together with the new flask helper.

If you have any questions, ask! If i missed any commonly used conditions, let me know and i can add them in.

NOTICE: Buddyforum will not allow you to upload a .json file, so this is a .txt file. Simply change the extension from .txt to .json after dropping this into the proper folder (explained above), or simply copy / pasta the contents of the text file into your already existing .json file. Make sure to back up your old FlaskHelper.json because... well... common sense.

View attachment FlaskHelper.txt
 
Last edited:
@toNyx

When enabling any of the generic Remove Bleed / Frozen / Ignited options such as:
Code:
    {
      "Enabled": true,
      "Name": "Staunching Flask (Bleeding Removal)",
      "Aura": "flask_bonus_bleeding_immunity",
      "Selector": "f.Stats.ContainsKey(StatTypeGGG.LocalFlaskBleedingImmunityWhileHealing)",
      "Conditions": [
        {
          "Enabled": true,
          "Condition": "FH.IsBleeding"
        }
      ]
    },

Does this code use any flask (1-5) that can remove Bleed, or do you still have to go into each flask that has the remove bleed property and set FH.IsBleeding?


At the end of the day, i would like to just be able to enable each of the "remove effect" by default and leave them always enabled regardless of which flasks i have equip. I believe this is how it currently works? Just havent tested enough to see it for myself yet.
 
Back
Top