//Parameters: // type1 and type2 define the type of flask you wanna drink. // reason: is just for debugging output to see where does the drinking flask request came from // minRequiredCharges: Min number of charges a flask must have to consider it a valid flask to drink. // shouldDrinkAll: if you want to drink all the flasks of type1,type2 (true) or just first in the list(false). private bool FindDrinkFlask(FlaskAction type1, FlaskAction type2, string reason, int minRequiredCharge = 0, bool shouldDrinkAll = false) { bool hasDrunk = false; var flaskList = playerFlaskList.FindAll(x => x.CurrentCharges >= minRequiredCharge && (x.FlaskAction1 == type1 || x.FlaskAction2 == type2) && x.isEnabled); foreach (var flask in flaskList) { if (flask.CurrentCharges >= flask.UseCharges) { keyboard.setLatency(GameController.Game.IngameState.CurLatency); if (!keyboard.KeyPressRelease(keyInfo.k[flask.Slot])) { LogError("Warning: High latency ( more than 1000 millisecond ), plugin will fail to work properly.", errmsg_time); } flask.UpdateFlaskChargesInfo(); if (Settings.debugMode.Value) { LogMessage("Just Drank Flask on key " + keyInfo.k[flask.Slot] + " cuz of " + reason, logmsg_time); } // if there are multiple flasks, drinking 1 of them at a time is enough. hasDrunk = true; if (!shouldDrinkAll) { return(hasDrunk); } } else { flask.UpdateFlaskChargesInfo(); } } return(hasDrunk); }
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); }