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
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
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) 2. Start Exile Buddy 3. Look for the Settings tab at the top 4. Click the down arrow beside Plugins in the left column 5. Scroll down to Flask Helper and Click on it 6. In the right side window you can see the Flask Helper and the Enable Button - tick the Enable button 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. 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. In the left hand menu in EB click on the DevTab Delete EVERYTHING in the left side CODE window 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(); } } } Press the RUN CODE button at the bottom right of the window. 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 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. 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 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 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. Back to business - now we are going to add the new flask Click on Flask Helper in the left menu in EB Click the downward arrow beside FLASKS 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. Click NEW FLASK and a new section appears 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) In the AURA NAME box you now want to paste from your EB visual log window the name of the aura: kiaras_determination Most new flasks are instant - so tick the Instant box if yours is 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. Scroll down your list of flasks to the bottom and click on the new one. Tick ENABLE Now you need to add in the SELECTOR - this is essentially how the bot finds the flask to press In the SELECTOR box paste the following: Code: f.Rarity == Rarity.Unique and f.FullName.Contains("xxx") 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). Great work if you got this far - you read more than 99% of the population of earth today! 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)
To me, you win the internet for this post!! I was so confused by all of this. thank you so much for this.
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
then for using it, on 1st page, 2nd post "See this constructive post by WiN : LINK" instructions very helpful
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!?
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
@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.