private bool CanUseFlaskAsInstant(ExtensionParameter extensionParameter, PlayerFlask playerFlask)
 {
     // If the flask is instant, no special logic needed
     return(playerFlask.InstantType == FlaskInstantType.Partial ||
            playerFlask.InstantType == FlaskInstantType.Full ||
            playerFlask.InstantType == FlaskInstantType.LowLife && extensionParameter.Plugin.PlayerHelper.isHealthBelowPercentage(35));
 }
 private bool MissingFlaskBuff(ExtensionParameter extensionParameter, PlayerFlask playerFlask)
 {
     return(!extensionParameter.Plugin.PlayerHelper.playerHasBuffs(new List <string> {
         playerFlask.BuffString1
     }) || !extensionParameter.Plugin.PlayerHelper.playerHasBuffs(new List <string> {
         playerFlask.BuffString2
     }));
 }
 private bool CanUseFlaskAsInstant(PlayerFlask playerFlask)
 {
     // If the flask is instant, no special logic needed
     return(playerFlask.InstantType == FlaskInstantType.Partial ||
            playerFlask.InstantType == FlaskInstantType.Full ||
            (playerFlask.InstantType == FlaskInstantType.LowLife && (PlayerHelper.isHealthBelowPercentage(50) ||
                                                                     Settings.AllocatedSupremeDecadence && IsReallyLowLife())));
 }
 private bool MissingFlaskBuff(PlayerFlask playerFlask)
 {
     return(!PlayerHelper.playerHasBuffs(new List <string> {
         playerFlask.BuffString1
     }) || !PlayerHelper.playerHasBuffs(new List <string> {
         playerFlask.BuffString2
     }));
 }
Example #5
0
        public Boolean canUsePotion(PlayerFlask flask, int reservedUses = 0, bool ignoreActionType = false)
        {
            if (flask == null)
            {
                if (Core.Settings.Debug)
                {
                    Core.Log(Core.PluginName + ": Cannot use a null flask.", 1);
                }
                return(false);
            }


            if (flask.TotalUses - reservedUses <= 0)
            {
                if (Core.Settings.Debug)
                {
                    Core.Log(Core.PluginName + ": Don't have enough uses on flask " + flask.Name + " to use.", 1);
                }
                return(false);
            }

            if (ignoreActionType)
            {
                return(true);
            }

            if (flask.Action1 == FlaskActions.Life && !Core.PlayerHelper.isHealthBelowPercentage(99))
            {
                if (Core.Settings.Debug)
                {
                    Core.Log(Core.PluginName + ": Can't use life flask " + flask.Name + " at full health.", 1);
                }
                return(false);
            }

            if (flask.Action1 == FlaskActions.Mana && !Core.PlayerHelper.isManaBelowPercentage(99))
            {
                if (Core.Settings.Debug)
                {
                    Core.Log(Core.PluginName + ": Can't use mana flask " + flask.Name + " at full mana.", 1);
                }
                return(false);
            }

            if (flask.Action1 == FlaskActions.Hybrid && !(Core.PlayerHelper.isHealthBelowPercentage(99) || Core.PlayerHelper.isManaBelowPercentage(99)))
            {
                if (Core.Settings.Debug)
                {
                    Core.Log(Core.PluginName + ": Can't use hybrid " + flask.Name + " at full health and mana.", 1);
                }
                return(false);
            }

            return(true);
        }
Example #6
0
        public Boolean canUsePotion(int flaskIndex, int reservedUses = 0, bool ignoreActionType = false)
        {
            PlayerFlask flask = this.getFlaskInfo(flaskIndex);

            if (flask == null)
            {
                if (Core.Settings.Debug)
                {
                    Core.Log($"{Core.PluginName}: Cannot use a null flask in slot {flaskIndex}.", 1);
                }
                return(false);
            }

            return(canUsePotion(flask, reservedUses, ignoreActionType));
        }
 private bool CanUseFlaskAsRegen(PlayerFlask playerFlask)
 {
     return(playerFlask.InstantType == FlaskInstantType.None ||
            playerFlask.InstantType == FlaskInstantType.Partial ||
            playerFlask.InstantType == FlaskInstantType.LowLife);
 }
 private bool FlaskMatchesInstant(ExtensionParameter extensionParameter, PlayerFlask playerFlask, Boolean?instant)
 {
     return(instant == null ||
            instant == false && CanUseFlaskAsRegen(playerFlask) ||
            instant == true && CanUseFlaskAsInstant(extensionParameter, playerFlask));
 }
 private bool flaskHasAvailableAction(List <FlaskActions> flaskActions, List <FlaskActions> ignoreFlaskActions, PlayerFlask flask)
 {
     return(flaskActions.Any(x => x == flask.Action1 || x == flask.Action2) &&
            (ignoreFlaskActions == null || !ignoreFlaskActions.Any(x => x == flask.Action1 || x == flask.Action2)));
 }
 private bool CanUseFlaskAsRegen(PlayerFlask playerFlask)
 {
     return(playerFlask.InstantType == FlaskInstantType.None ||
            playerFlask.InstantType == FlaskInstantType.Partial && !Settings.ForceBubblingAsInstantOnly ||
            playerFlask.InstantType == FlaskInstantType.LowLife && !Settings.ForcePanickedAsInstantOnly);
 }
 private bool FlaskMatchesInstant(PlayerFlask playerFlask, Boolean?instant)
 {
     return(instant == null ||
            instant == false && CanUseFlaskAsRegen(playerFlask) ||
            instant == true && CanUseFlaskAsInstant(playerFlask));
 }
Example #12
0
        public PlayerFlask getFlaskInfo(int flaskIndex, Entity foundFlask = null)
        {
            if (Core.Cache.MiscBuffInfo == null)
            {
                Core.LogErr(Core.PluginName + ": Error: Misc Buff Info cache was never initialized. This method will not function properly.", Core.ErrmsgTime);
                return(null);
            }

            Entity currentFlask = foundFlask ?? Core.GameController.Game.IngameState.ServerData.PlayerInventories.FirstOrDefault(x => x.Inventory.InventType == InventoryTypeE.Flasks)?.Inventory?.InventorySlotItems?.FirstOrDefault(x => x.PosX == flaskIndex)?.Item;

            if (currentFlask == null || currentFlask.Address == 0x00)
            {
                if (Core.Settings.Debug)
                {
                    Core.Log(Core.PluginName + ": No valid flask in slot " + flaskIndex, 5);
                }
                return(null);
            }

            PlayerFlask simplePlayerFlask = new PlayerFlask
            {
                Index = flaskIndex
            };

            if (currentFlask.Path == null || currentFlask.Path.Length == 0)
            {
                Core.LogErr(Core.PluginName + ": Ignoring Flask " + flaskIndex + " for an empty or null path.", 5);
                return(null);
            }

            var baseItem = Core.GameController.Files.BaseItemTypes.Translate(currentFlask.Path);

            if (baseItem == null)
            {
                Core.LogErr(Core.PluginName + ": Ignoring Flask " + flaskIndex + ". No base item was found! Path: " + currentFlask.Path, 5);
                return(null);
            }

            simplePlayerFlask.Name = baseItem.BaseName;


            Charges flaskChargesStruct = currentFlask.GetComponent <Charges>();
            Mods    flaskMods          = currentFlask.GetComponent <Mods>();

            var useCharge = calculateUseCharges(flaskChargesStruct.ChargesPerUse, flaskMods.ItemMods);

            if (useCharge > 0)
            {
                simplePlayerFlask.TotalUses = flaskChargesStruct.NumCharges / useCharge;
            }

            //TreeRoutine.LogError("Flask: " + simplePlayerFlask.Name + "Num Charges: " + flaskChargesStruct.NumCharges + " Use Charges: " + useCharge + " Charges Per use: " + flaskChargesStruct.ChargesPerUse + " Total Uses: " + simplePlayerFlask.TotalUses, 5);


            var    flaskBaseName = currentFlask.GetComponent <PoeHUD.Poe.Components.Base>().Name;
            String flaskBuffOut  = null;

            if (!Core.Cache.MiscBuffInfo.flaskNameToBuffConversion.TryGetValue(
                    flaskBaseName, out flaskBuffOut))
            {
                if (Core.Settings.Debug)
                {
                    Core.LogErr(Core.PluginName + ": Cannot find Flask Buff for flask on slot " + (flaskIndex + 1) + " with base name: " + (flaskBaseName == null ? "NULL" : flaskBaseName), 5);
                }
                return(null);
            }

            simplePlayerFlask.BuffString1 = flaskBuffOut;

            // For Hybrid Flask as it have two buffs.
            if (!Core.Cache.MiscBuffInfo.flaskNameToBuffConversion2.TryGetValue(flaskBaseName, out flaskBuffOut))
            {
                simplePlayerFlask.BuffString2 = "";
            }
            else
            {
                simplePlayerFlask.BuffString2 = flaskBuffOut;
            }

            simplePlayerFlask.Mods = currentFlask.GetComponent <Mods>();

            handleFlaskMods(simplePlayerFlask);

            return(simplePlayerFlask);
        }
Example #13
0
        private void handleFlaskMods(PlayerFlask flask)
        {
            FlaskActions flaskActionOut;

            if (Core.Cache.FlaskInfo == null)
            {
                Core.LogErr(Core.PluginName + ": Error: Flask Info cache was never initialized. This method will not function properly.", Core.ErrmsgTime);
                return;
            }

            //Checking flask action based on flask name type.
            if (!Core.Cache.FlaskInfo.FlaskTypes.TryGetValue(flask.Name, out flaskActionOut))
            {
                Core.LogErr(Core.PluginName + ": Error: " + flask.Name + " name not found. Add to config/flaskinfo.json and report this error message.", Core.ErrmsgTime);
            }
            else
            {
                flask.Action1 = flaskActionOut;
            }

            //Checking for unique flasks.
            if (flask.Mods.ItemRarity == ItemRarity.Unique)
            {
                flask.Name = flask.Mods.UniqueName;

                //Enabling Unique flask action 2.
                if (!Core.Cache.FlaskInfo.UniqueFlaskNames.TryGetValue(flask.Name, out flaskActionOut))
                {
                    Core.LogErr(Core.PluginName + ": Error: " + flask.Name + " unique name not found. Add to config/flaskinfo.json and report this error message.", Core.ErrmsgTime);
                }
                else
                {
                    flask.Action2 = flaskActionOut;
                }
            }

            //Checking flask mods.
            FlaskActions action2 = FlaskActions.Ignore;

            foreach (var mod in flask.Mods.ItemMods)
            {
                if (mod.Name.ToLower().Contains("instant"))
                {
                    if (mod.Name.Contains("FlaskPartialInstantRecovery"))
                    {
                        flask.InstantType = FlaskInstantType.Partial;
                    }
                    else if (mod.Name.Contains("FlaskInstantRecoveryOnLowLife"))
                    {
                        flask.InstantType = FlaskInstantType.LowLife;
                    }
                    else if (mod.Name.Contains("FlaskFullInstantRecovery"))
                    {
                        flask.InstantType = FlaskInstantType.Full;
                    }
                }

                // We have already decided action2 for unique flasks.
                if (flask.Mods.ItemRarity == ItemRarity.Unique)
                {
                    continue;
                }

                if (!Core.Cache.FlaskInfo.FlaskMods.TryGetValue(mod.Name, out action2))
                {
                    Core.LogErr(Core.PluginName + ": Error: " + mod.Name + " mod not found. Is it unique flask? If not, report this error message.", Core.ErrmsgTime);
                }
                else if (action2 != FlaskActions.Ignore)
                {
                    flask.Action2 = action2;
                }
            }
        }
Example #14
0
        private bool GettingAllFlaskInfo(Element flaskRoot)
        {
            if (Settings.debugMode.Value)
            {
                LogMessage("Getting Inventory Flasks info.", logmsg_time);
            }
            playerFlaskList.Clear();
            try
            {
                var flasksEquipped = flaskRoot.Children;
                for (int j = 0; j < flasksEquipped.Count; j++)
                {
                    InventoryItemIcon flask        = flasksEquipped[j].AsObject <InventoryItemIcon>();
                    Entity            flaskItem    = flask.Item;
                    Charges           flaskCharges = flaskItem.GetComponent <Charges>();
                    Mods        flaskMods          = flaskItem.GetComponent <Mods>();
                    PlayerFlask newFlask           = new PlayerFlask();

                    newFlask.SetSettings(Settings);
                    newFlask.isInstant      = false;
                    newFlask.Slot           = flask.InventPosX;
                    newFlask.Item           = flaskItem;
                    newFlask.MaxCharges     = flaskCharges.ChargesMax;
                    newFlask.UseCharges     = flaskCharges.ChargesPerUse;
                    newFlask.CurrentCharges = flaskCharges.NumCharges;
                    newFlask.flaskRarity    = flaskMods.ItemRarity;
                    newFlask.FlaskName      = GameController.Files.BaseItemTypes.Translate(flaskItem.Path).BaseName;
                    newFlask.FlaskAction2   = FlaskAction.NONE;
                    newFlask.FlaskAction1   = FlaskAction.NONE;

                    //Checking flask action based on flask name type.
                    if (!flaskInfo.FlaskTypes.TryGetValue(newFlask.FlaskName, out newFlask.FlaskAction1))
                    {
                        LogError("Error: " + newFlask.FlaskName + " name not found. Report this error message.", errmsg_time);
                    }

                    //Checking for unique flasks.
                    if (flaskMods.ItemRarity == ItemRarity.Unique)
                    {
                        newFlask.FlaskName = flaskMods.UniqueName;
                        if (Settings.uniqFlaskEnable.Value)
                        {
                            //Enabling Unique flask action 2.
                            if (!flaskInfo.UniqueFlaskNames.TryGetValue(newFlask.FlaskName, out newFlask.FlaskAction2))
                            {
                                LogError("Error: " + newFlask.FlaskName + " unique name not found. Report this error message.", errmsg_time);
                            }
                        }
                        else
                        {
                            //Disabling Unique Flask actions.
                            newFlask.FlaskAction1 = FlaskAction.NONE;
                            newFlask.FlaskAction2 = FlaskAction.NONE;
                        }
                    }

                    //Checking flask mods.
                    FlaskAction action2 = FlaskAction.NONE;
                    foreach (var mod in flaskMods.ItemMods)
                    {
                        if (mod.Name.ToLower().Contains("flaskchargesused"))
                        {
                            newFlask.UseCharges = (int)Math.Floor(newFlask.UseCharges + ((double)(newFlask.UseCharges) * mod.Value1 / 100));
                        }

                        if (mod.Name.ToLower().Contains("instant"))
                        {
                            newFlask.isInstant = true;
                        }

                        // We have already decided action2 for unique flasks.
                        if (flaskMods.ItemRarity == ItemRarity.Unique)
                        {
                            continue;
                        }

                        if (!flaskInfo.FlaskMods.TryGetValue(mod.Name, out action2))
                        {
                            LogError("Error: " + mod.Name + " mod not found. Is it unique flask? If not, report this error message.", errmsg_time);
                        }
                        else if (action2 != FlaskAction.IGNORE)
                        {
                            newFlask.FlaskAction2 = action2;
                        }
                    }

                    // Speedrun mod on mana/life flask wouldn't work when full mana/life is full respectively,
                    // So we will ignore speedrun mod from mana/life flask. Other mods
                    // on mana/life flasks will work.
                    if (newFlask.FlaskAction2 == FlaskAction.SPEEDRUN &&
                        (newFlask.FlaskAction1 == FlaskAction.LIFE ||
                         newFlask.FlaskAction1 == FlaskAction.MANA ||
                         newFlask.FlaskAction1 == FlaskAction.HYBRID))
                    {
                        newFlask.FlaskAction2 = FlaskAction.NONE;
                        if (_WarnFlaskSpeed)
                        {
                            LogError("Warning: Speed Run mod is ignored on mana/life/hybrid flasks. Use Alt Orbs on those flasks.", errmsg_time);
                            _WarnFlaskSpeed = false;
                        }
                    }

                    if (Settings.disableLifeSecUse.Value)
                    {
                        if (newFlask.FlaskAction1 == FlaskAction.LIFE || newFlask.FlaskAction1 == FlaskAction.HYBRID)
                        {
                            if (newFlask.FlaskAction2 == FlaskAction.OFFENSE || newFlask.FlaskAction2 == FlaskAction.DEFENSE)
                            {
                                newFlask.FlaskAction2 = FlaskAction.NONE;
                            }
                        }
                    }

                    if (Settings.treatOffenAsDef.Value)
                    {
                        if (newFlask.FlaskAction1 == FlaskAction.OFFENSE)
                        {
                            newFlask.FlaskAction1 = FlaskAction.DEFENSE;
                        }
                        if (newFlask.FlaskAction2 == FlaskAction.OFFENSE)
                        {
                            newFlask.FlaskAction2 = FlaskAction.DEFENSE;
                        }
                    }
                    newFlask.EnableDisableFlask();
                    playerFlaskList.Add(newFlask);
                }
            }
            catch (Exception e)
            {
                if (Settings.debugMode.Value)
                {
                    LogError("Warning: Error getting all flask Informations.", errmsg_time);
                    LogError(e.Message + e.StackTrace, errmsg_time);
                }
                playerFlaskList.Clear();
                return(false);
            }
            playerFlaskList.Sort((x, y) => x.Slot.CompareTo(y.Slot));
            return(true);
        }