• Visit Rebornbuddy
  • [Plugin] FlaskHelper

    Discussion in 'Archives' started by toNyx, May 26, 2014.

    1. goranskoc

      goranskoc Member

      Joined:
      Mar 28, 2014
      Messages:
      32
      Likes Received:
      0
      Trophy Points:
      6
      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 )
       
    2. Fishnetz

      Fishnetz Member

      Joined:
      Aug 22, 2015
      Messages:
      52
      Likes Received:
      0
      Trophy Points:
      6
      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: May 28, 2016
    3. rmtguy

      rmtguy New Member

      Joined:
      May 18, 2016
      Messages:
      13
      Likes Received:
      0
      Trophy Points:
      1
      FH.IsCursed
      FH.IsBleeding
       
    4. Fishnetz

      Fishnetz Member

      Joined:
      Aug 22, 2015
      Messages:
      52
      Likes Received:
      0
      Trophy Points:
      6
      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
       
    5. rmtguy

      rmtguy New Member

      Joined:
      May 18, 2016
      Messages:
      13
      Likes Received:
      0
      Trophy Points:
      1
      You add them under what flask has that option to dispel / remove them.
       
    6. brycem1989

      brycem1989 New Member

      Joined:
      Jun 11, 2015
      Messages:
      90
      Likes Received:
      2
      Trophy Points:
      0
      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
       
    7. WiN

      WiN Member

      Joined:
      Sep 2, 2014
      Messages:
      294
      Likes Received:
      15
      Trophy Points:
      18
      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)

      [​IMG]

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

      [​IMG]

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

      [​IMG]

      5. Scroll down to Flask Helper and Click on it

      [​IMG]

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

      [​IMG]

      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:
      Then tick ENABLED next to it.
      Now when your health goes below 80% the bot uses your life flask.

      [​IMG]

      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.
      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:
      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:
      As you can see the common format for these settings involves the distance from me, a type of mob and a number of mobs:

      If you have quick refills with Surgeons on Crit, then you might want to spam Quicksilver off cooldown:
      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:
      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:

      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.
      You will also want some health or Energy shield protection:
      or
      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)
      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
      You should also add your Flasks's Dispel e.g. Removed Shock on Use
      It is worth adding in an "O Shit" press all flasks button for low health:
      or low Energy Shield
      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:
      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:

      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.

      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: Feb 24, 2017
      ketekurto82, dirin, ozgun311 and 4 others like this.
    8. brycem1989

      brycem1989 New Member

      Joined:
      Jun 11, 2015
      Messages:
      90
      Likes Received:
      2
      Trophy Points:
      0

      thank you. i screwed with something i wasnt sposed to and i ripped a level 70 because of it haha
       
    9. FragileAssassin

      FragileAssassin Member

      Joined:
      Apr 13, 2013
      Messages:
      218
      Likes Received:
      2
      Trophy Points:
      18
      To me, you win the internet for this post!! I was so confused by all of this. thank you so much for this.
       
    10. toNyx

      toNyx Well-Known Member

      Joined:
      Oct 29, 2011
      Messages:
      3,770
      Likes Received:
      35
      Trophy Points:
      48
      Notice there's an error in the mana flask selector, "&&" should be changed to "and" instead.
       
    11. Skuz76

      Skuz76 Member

      Joined:
      Dec 28, 2015
      Messages:
      70
      Likes Received:
      1
      Trophy Points:
      8
      Where we have to copy the file? Because i didnt find the FlashHelper in the plugin list ='(
       
    12. goranskoc

      goranskoc Member

      Joined:
      Mar 28, 2014
      Messages:
      32
      Likes Received:
      0
      Trophy Points:
      6
      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: Jun 9, 2016
    13. Skuz76

      Skuz76 Member

      Joined:
      Dec 28, 2015
      Messages:
      70
      Likes Received:
      1
      Trophy Points:
      8
      i got the FlashHelper file in 3rd party and i didnt find it in the bot :X
       
    14. grandadpeup

      grandadpeup New Member

      Joined:
      Feb 10, 2015
      Messages:
      20
      Likes Received:
      0
      Trophy Points:
      1
      then for using it, on 1st page, 2nd post
      "See this constructive post by WiN : LINK"
      instructions very helpful
       
    15. Erson

      Erson Member Legendary

      Joined:
      Jun 27, 2012
      Messages:
      270
      Likes Received:
      0
      Trophy Points:
      16
      I'd like to use quicksilver flasks every 8 sec , is this possible to set up now?
       
    16. WiN

      WiN Member

      Joined:
      Sep 2, 2014
      Messages:
      294
      Likes Received:
      15
      Trophy Points:
      18
      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:

      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: Jun 9, 2016
    17. Pochizzle

      Pochizzle Member

      Joined:
      Mar 5, 2012
      Messages:
      204
      Likes Received:
      0
      Trophy Points:
      16
      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
       
    18. toNyx

      toNyx Well-Known Member

      Joined:
      Oct 29, 2011
      Messages:
      3,770
      Likes Received:
      35
      Trophy Points:
      48
      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
       
    19. Unknown Buddy

      Unknown Buddy Member

      Joined:
      May 20, 2015
      Messages:
      603
      Likes Received:
      17
      Trophy Points:
      18
      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: Jun 11, 2016
    20. Unknown Buddy

      Unknown Buddy Member

      Joined:
      May 20, 2015
      Messages:
      603
      Likes Received:
      17
      Trophy Points:
      18
      @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.
       

    Share This Page