Decompiled source of Herbalist v1.4.6

Herbalist.dll

Decompiled a week ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using HarmonyLib;
using Herbalist.Functions;
using Herbalist.SE;
using Herbalist.Utils;
using JetBrains.Annotations;
using LocalizationManager;
using Microsoft.CodeAnalysis;
using ServerSync;
using SkillManager;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.Converters;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;
using YamlDotNet.Serialization.NodeTypeResolvers;
using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphTraversalStrategies;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.Schemas;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
using YamlDotNet.Serialization.Utilities;
using YamlDotNet.Serialization.ValueDeserializers;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("blacks7ar")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.4.6")]
[assembly: AssemblyInformationalVersion("1.4.6")]
[assembly: AssemblyProduct("Herbalist")]
[assembly: AssemblyTitle("Herbalist")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.6.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Herbalist
{
	[BepInPlugin("blacks7ar.Herbalist", "Herbalist", "1.4.6")]
	public class Plugin : BaseUnityPlugin
	{
		private const string modGUID = "blacks7ar.Herbalist";

		public const string modName = "Herbalist";

		public const string modAuthor = "blacks7ar";

		public const string modVersion = "1.4.6";

		public const string modLink = "https://valheim.thunderstore.io/package/blacks7ar/Herbalist/";

		private static readonly Harmony _harmony = new Harmony("blacks7ar.Herbalist");

		private static readonly ConfigSync _configSync = new ConfigSync("blacks7ar.Herbalist")
		{
			DisplayName = "Herbalist",
			CurrentVersion = "1.4.6",
			MinimumRequiredVersion = "1.4.6",
			ModRequired = true
		};

		private static ConfigEntry<Toggle> _serverConfigLocked;

		private static ConfigEntry<float> _expGainFactor;

		public static ConfigEntry<Toggle> _displayExpGained;

		public static ConfigEntry<float> _dandelionHealthOverTime;

		public static ConfigEntry<float> _dandelionDuration;

		public static ConfigEntry<float> _dandelionInterval;

		public static ConfigEntry<float> _thistleHealthOverTime;

		public static ConfigEntry<float> _thistleDuration;

		public static ConfigEntry<float> _thistleInterval;

		public static ConfigEntry<float> _healBonusFactor;

		public static ConfigEntry<float> _durationBonusFactor;

		public static ConfigEntry<int> _minorLevel;

		public static ConfigEntry<int> _mediumLevel;

		public static ConfigEntry<int> _largeLevel;

		public static ConfigEntry<float> _expCooldownTimer;

		private static ConfigEntry<int> _expLoss;

		public static ConfigEntry<Toggle> _returnBottles;

		public static ConfigEntry<string> _potionsList;

		public static ConfigEntry<float> _craftingExp;

		public static Plugin _Instance;

		private static Skill _herbalist;

		public static readonly HashSet<string> _ToReduceCooldown = new HashSet<string>
		{
			"MeadEitrMinor", "MeadHealthMajor", "MeadHealthMedium", "MeadHealthMinor", "MeadStaminaMedium", "MeadStaminaMinor", "Flask_of_the_Gods", "Grand_Healing_Tide_Potion", "Grand_Spiritual_Healing_Potion", "Grand_Stamina_Elixir",
			"Medium_Healing_Tide_Flask", "Medium_Spiritual_Healing_Flask", "Medium_Stamina_Flask", "Lesser_Healing_Tide_Vial", "Lesser_Spiritual_Healing_Vial", "Lesser_Stamina_Vial", "Lesser_Group_Healing", "Medium_Group_Healing", "Grand_Group_Healing", "Lesser_Mana_Potion",
			"Large_Mana_Potion", "Grand_Mana_Potion"
		};

		public static readonly HashSet<string> _ToIncreaseDuration = new HashSet<string>
		{
			"BarleyWine", "MeadFrostResist", "MeadPoisonResist", "MeadStaminaLingering", "MeadTasty", "Flask_of_Elements", "Flask_of_Fortification", "Flask_of_Magelight", "Flask_of_Second_Wind", "Grand_Healing_Tide_Potion",
			"Grand_Stamina_Elixir", "Grand_Stealth_Elixir", "Medium_Healing_Tide_Flask", "Lesser_Healing_Tide_Vial", "Brew_of_Cunning_Toxicity", "Brew_of_Fiery_Revenge", "Brew_of_Icy_Touch", "Brew_of_Spiritual_Death", "Brew_of_Thunderous_Words"
		};

		private static readonly HashSet<string> _herbalistPotions = new HashSet<string>
		{
			"BH_BeserkerElixer", "BH_DefenderElixer", "BH_GhostElixer", "BH_HeavyLifterElixer", "BH_JumpElixer", "BH_LargeEitrTonic", "BH_LargeHealthTonic", "BH_LargeStaminaTonic", "BH_LearningElixer", "BH_MediumEitrTonic",
			"BH_MediumHealthTonic", "BH_MediumStaminaTonic", "BH_MinorEitrTonic", "BH_MinorHealthTonic", "BH_MinorStaminaTonic", "BH_RunnerElixer", "BH_SlowFallElixer"
		};

		public static HashSet<string> _potionsToGainExpList;

		public ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description, bool _synchronizedConfig = true)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			ConfigDescription val = new ConfigDescription(description.Description + (_synchronizedConfig ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags);
			ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val);
			_configSync.AddConfigEntry<T>(val2).SynchronizedConfig = _synchronizedConfig;
			return val2;
		}

		private ConfigEntry<T> config2<T>(string group, string name, T value, string desc, bool synchronizedConfig = true)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			Herbalist.Functions.ConfigurationManagerAttributes configurationManagerAttributes = new Herbalist.Functions.ConfigurationManagerAttributes
			{
				CustomDrawer = TextBox
			};
			return config(group, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes }), synchronizedConfig);
		}

		public void Awake()
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Expected O, but got Unknown
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Expected O, but got Unknown
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Expected O, but got Unknown
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Expected O, but got Unknown
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Expected O, but got Unknown
			//IL_0229: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Expected O, but got Unknown
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Expected O, but got Unknown
			//IL_029b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Expected O, but got Unknown
			//IL_02e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Expected O, but got Unknown
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Expected O, but got Unknown
			//IL_0370: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Expected O, but got Unknown
			//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bf: Expected O, but got Unknown
			//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f8: Expected O, but got Unknown
			//IL_0451: Unknown result type (might be due to invalid IL or missing references)
			//IL_045c: Expected O, but got Unknown
			//IL_048a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0495: Expected O, but got Unknown
			//IL_04b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c3: Expected O, but got Unknown
			//IL_052e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0539: Expected O, but got Unknown
			_Instance = this;
			Localizer.Load();
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
			_herbalist = new Skill("Herbalist", "herbalist.png");
			_herbalist.Description.English("Makes pickable plants like Dandelion and Thistle into healing medicines.");
			_herbalist.Configurable = false;
			_serverConfigLocked = config("1- ServerSync", "Lock Configuration", Toggle.On, new ConfigDescription("If On, the configuration is locked and can be changed by server admins only.", (AcceptableValueBase)null, Array.Empty<object>()));
			_configSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked);
			_healBonusFactor = config("2- General", "Heal Bonus Factor", 10f, new ConfigDescription("Heal bonus factor at skill level 100 for dandelion and thistle.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 10f), Array.Empty<object>()));
			_durationBonusFactor = config("2- General", "Duration Bonus Factor", 10f, new ConfigDescription("Heal duration bonus factor at skill level 100 for dandelion and thistle.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 15f), Array.Empty<object>()));
			_dandelionHealthOverTime = config("3- Dandelion", "Heal Amount", 5f, new ConfigDescription("Dandelion base heal amount.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 10f), new object[1]
			{
				new Herbalist.Functions.ConfigurationManagerAttributes
				{
					ShowRangeAsPercent = false
				}
			}));
			_returnBottles = config("2- General", "Return Bottles", Toggle.On, new ConfigDescription("If On, bottles and containers will return to your inventory after you consume tonics or elixirs.", (AcceptableValueBase)null, Array.Empty<object>()));
			_potionsList = config2("2- General", "Additional Potions To Gain Exp", "", "Additional potions you added to the mortar and pestle that you want to gain an exp.");
			_potionsList.SettingChanged += delegate
			{
				GeneratePotionsList();
			};
			_dandelionDuration = config("3- Dandelion", "Heal Duration", 10f, new ConfigDescription("Dandelion base heal duration in seconds.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 30f), Array.Empty<object>()));
			_dandelionInterval = config("3- Dandelion", "Heal Interval", 0.5f, new ConfigDescription("Dandelion heal interval.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 1f), new object[1]
			{
				new Herbalist.Functions.ConfigurationManagerAttributes
				{
					ShowRangeAsPercent = false
				}
			}));
			_thistleHealthOverTime = config("4- Thistle", "Heal Amount", 15f, new ConfigDescription("Thistle base heal amount.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 20f), Array.Empty<object>()));
			_thistleDuration = config("4- Thistle", "Heal Duration", 10f, new ConfigDescription("Thistle base heal duration in seconds.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 30f), Array.Empty<object>()));
			_thistleInterval = config("4- Thistle", "Heal Interval", 0.5f, new ConfigDescription("Thistle heal interval.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 1f), new object[1]
			{
				new Herbalist.Functions.ConfigurationManagerAttributes
				{
					ShowRangeAsPercent = false
				}
			}));
			_minorLevel = config("4- Tonics Requirement Level", "Minor Tonics Level", 1, new ConfigDescription("Required skill level to craft minor tonics.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), new object[1]
			{
				new Herbalist.Functions.ConfigurationManagerAttributes
				{
					ShowRangeAsPercent = false
				}
			}));
			_mediumLevel = config("4- Tonics Requirement Level", "Medium Tonics Level", 30, new ConfigDescription("Required skill level to craft medium tonics.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), new object[1]
			{
				new Herbalist.Functions.ConfigurationManagerAttributes
				{
					ShowRangeAsPercent = false
				}
			}));
			_largeLevel = config("4- Tonics Requirement Level", "Large Tonics Level", 60, new ConfigDescription("Required skill level to craft large tonics.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), new object[1]
			{
				new Herbalist.Functions.ConfigurationManagerAttributes
				{
					ShowRangeAsPercent = false
				}
			}));
			_expGainFactor = config("5- Skill Exp", "Exp Gain Factor", 1f, new ConfigDescription("Exp gain factor for herbalist skill.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 5f), Array.Empty<object>()));
			_expGainFactor.SettingChanged += delegate
			{
				_herbalist.SkillGainFactor = _expGainFactor.Value;
			};
			_herbalist.SkillGainFactor = _expGainFactor.Value;
			_displayExpGained = config("5- Skill Exp", "Display Exp Gained", Toggle.On, new ConfigDescription("Enable/Disables exp gain notification.", (AcceptableValueBase)null, Array.Empty<object>()));
			_expCooldownTimer = config("5- Skill Exp", "Exp Gain Cooldown", 30f, new ConfigDescription("Cooldown timer in seconds, before getting exp when picking up dandelion and thistle.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 120f), Array.Empty<object>()));
			_expLoss = config("5- Skill Exp", "Exp Loss Amount", 0, new ConfigDescription("Skill exp loss on death.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			_expLoss.SettingChanged += delegate
			{
				_herbalist.SkillLoss = _expLoss.Value;
			};
			_herbalist.SkillLoss = _expLoss.Value;
			_craftingExp = config("5- Skill Exp", "Potion Crafting Exp Gain Factor", 1f, new ConfigDescription("Exp gain factor from crafting potions in mortar and pestle.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 5f), Array.Empty<object>()));
			ConfigSetup.Init();
			PrefabManager.Init();
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = true;
			((BaseUnityPlugin)this).Config.Save();
			GeneratePotionsList();
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			_harmony.PatchAll(executingAssembly);
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Config.Save();
		}

		private static void GeneratePotionsList()
		{
			HashSet<string> other = new HashSet<string>(_potionsList.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries));
			_herbalistPotions.UnionWith(other);
			_potionsToGainExpList = _herbalistPotions;
		}

		private static void TextBox(ConfigEntryBase entryBase)
		{
			entryBase.BoxedValue = GUILayout.TextArea((string)entryBase.BoxedValue, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.ExpandWidth(true),
				GUILayout.ExpandHeight(true)
			});
		}
	}
}
namespace Herbalist.SE
{
	public class SE_Berserker : SE_Stats
	{
		public float m_duration;

		public float m_damageMultiplier;

		public void Awake()
		{
			((StatusEffect)this).m_name = "Berserker";
			((Object)this).name = "bh_berserker_elixir";
			((StatusEffect)this).m_tooltip = "Boost your attack damage but makes you weak to physical and range attacks." + $"\nDamage Multiplier: <color=orange>{m_damageMultiplier}x</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			((StatusEffect)this).m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_BeserkerElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			((StatusEffect)this).m_startEffects = val;
			((SE_Stats)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			((StatusEffect)this).m_tooltip = "Boost your attack damage but makes you weak to physical and range attacks." + $"\nDamage Multiplier: <color=orange>{m_damageMultiplier}x</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public void SetMultiplier(float damage)
		{
			m_damageMultiplier = damage;
			((StatusEffect)this).m_tooltip = "Boost your attack damage but makes you weak to physical and range attacks." + $"\nDamage Multiplier: <color=orange>{m_damageMultiplier}x</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public override void ModifyAttack(SkillType skill, ref HitData hitData)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((SE_Stats)this).ModifyAttack(skill, ref hitData);
			((DamageTypes)(ref hitData.m_damage)).Modify(m_damageMultiplier);
		}

		public override void ModifyDamageMods(ref DamageModifiers modifiers)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			((SE_Stats)this).ModifyDamageMods(ref modifiers);
			List<DamageModPair> list = new List<DamageModPair>
			{
				new DamageModPair
				{
					m_type = (DamageType)1,
					m_modifier = (DamageModifier)6
				},
				new DamageModPair
				{
					m_type = (DamageType)8,
					m_modifier = (DamageModifier)6
				},
				new DamageModPair
				{
					m_type = (DamageType)31,
					m_modifier = (DamageModifier)6
				},
				new DamageModPair
				{
					m_type = (DamageType)16,
					m_modifier = (DamageModifier)6
				},
				new DamageModPair
				{
					m_type = (DamageType)4,
					m_modifier = (DamageModifier)6
				},
				new DamageModPair
				{
					m_type = (DamageType)2,
					m_modifier = (DamageModifier)6
				}
			};
			((DamageModifiers)(ref modifiers)).Apply(list);
		}
	}
	public class SE_Chicory : StatusEffect
	{
		public float m_duration
		{
			get
			{
				return base.m_ttl;
			}
			set
			{
				base.m_ttl = value;
			}
		}

		public void Awake()
		{
			base.m_name = "Chicory";
			((Object)this).name = "bh_chicory_buff";
			base.m_tooltip = "Cures poison and gives you a poison resist for a short amount of time. \n<color=orange>Resistant</color> Vs. <color=orange>Poison</color>";
			base.m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_Chicory.png");
		}

		public override void Setup(Character character)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			m_duration = 10f;
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("sfx_creature_consume"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
		}
	}
	public class SE_Daisy : StatusEffect
	{
		public float m_duration
		{
			get
			{
				return base.m_ttl;
			}
			set
			{
				base.m_ttl = value;
			}
		}

		public void Awake()
		{
			base.m_name = "Daisy";
			((Object)this).name = "bh_daisy_buff";
			base.m_tooltip = "Removes freezing status effect and gives you a freezing resist for a short amount of time. \n<color=orange>Resistant</color> Vs. <color=orange>Freezing</color>";
			base.m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_Daisy.png");
		}

		public override void Setup(Character character)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			m_duration = 10f;
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("sfx_creature_consume"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
		}
	}
	public class SE_Defender : SE_Stats
	{
		public float m_duration;

		public void Awake()
		{
			((StatusEffect)this).m_name = "Defender";
			((Object)this).name = "bh_defender_elixir";
			((StatusEffect)this).m_tooltip = "Boost your overall defense but makes your attacks very weak." + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			((StatusEffect)this).m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_DefenderElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			((StatusEffect)this).m_startEffects = val;
			((SE_Stats)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			((StatusEffect)this).m_tooltip = "Boost your overall defense but makes your attacks very weak." + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public override void ModifyAttack(SkillType skill, ref HitData hitData)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((SE_Stats)this).ModifyAttack(skill, ref hitData);
			((DamageTypes)(ref hitData.m_damage)).Modify(0.2f);
		}

		public override void ModifyDamageMods(ref DamageModifiers modifiers)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			((SE_Stats)this).ModifyDamageMods(ref modifiers);
			List<DamageModPair> list = new List<DamageModPair>
			{
				new DamageModPair
				{
					m_type = (DamageType)1,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)8,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)31,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)16,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)4,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)2,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)224,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)32,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)64,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)128,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)256,
					m_modifier = (DamageModifier)5
				},
				new DamageModPair
				{
					m_type = (DamageType)512,
					m_modifier = (DamageModifier)5
				}
			};
			((DamageModifiers)(ref modifiers)).Apply(list);
		}
	}
	public class SE_EitrTonic : StatusEffect
	{
		public float m_eitrOverTime;

		public float m_eitrOverTimeDuration;

		public float m_skillLevel;

		public void Awake()
		{
			base.m_tooltip = "Recovers your eitr over time." + $"\n<color=orange>Eitr: {m_eitrOverTime}</color>" + $"\n<color=orange>Duration: {m_eitrOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetEitrOverTime(float bonus)
		{
			m_eitrOverTime = bonus;
			base.m_tooltip = "Recovers your eitr over time." + $"\n<color=orange>Eitr: {m_eitrOverTime}</color>" + $"\n<color=orange>Duration: {m_eitrOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetEitrOverTimeDuration(float bonus)
		{
			m_eitrOverTimeDuration = bonus;
			base.m_tooltip = "Recovers your eitr over time." + $"\n<color=orange>Eitr: {m_eitrOverTime}</color>" + $"\n<color=orange>Duration: {m_eitrOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetSkillLevel(float bonus)
		{
			m_skillLevel = bonus;
			base.m_tooltip = "Recovers your eitr over time." + $"\n<color=orange>Eitr: {m_eitrOverTime}</color>" + $"\n<color=orange>Duration: {m_eitrOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("vfx_Potion_eitr_minor"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
			if (m_eitrOverTime > 0f && m_eitrOverTimeDuration <= 0f)
			{
				m_eitrOverTimeDuration = base.m_ttl;
			}
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			if (m_eitrOverTime != 0f && base.m_time <= m_eitrOverTimeDuration)
			{
				float num = m_eitrOverTimeDuration / dt;
				base.m_character.AddEitr(m_eitrOverTime / num * 50f);
			}
		}
	}
	public class SE_FastLearner : StatusEffect
	{
		public float m_duration;

		public float m_expMultiplier;

		public void Awake()
		{
			base.m_name = "FastLearner";
			((Object)this).name = "bh_fastlearner_elixir";
			base.m_tooltip = "You're quick to learn things. " + $"\nExperience Gained: <color=orange>x{m_expMultiplier}</color>" + "\nSide Effects: <color=orange>Halved Health Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			base.m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_LearningElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			base.m_tooltip = "You're quick to learn things. " + $"\nExperience Gained: <color=orange>x{m_expMultiplier}</color>" + "\nSide Effects: <color=orange>Halved Health Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public void SetMultiplier(float multiplier)
		{
			m_expMultiplier = multiplier;
			base.m_tooltip = "You're quick to learn everything. " + $"\nExperience Gained: <color=orange>x{m_expMultiplier}</color>" + "\nSide Effects: <color=orange>Halved Health Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			Character character = base.m_character;
			Character obj = ((character is Player) ? character : null);
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			((Player)obj).GetTotalFoodValue(ref num, ref num2, ref num3);
			((Player)obj).SetMaxHealth(num / 2f, false);
		}
	}
	public class SE_Ghost : SE_Stats
	{
		public float m_duration;

		public void Awake()
		{
			((StatusEffect)this).m_name = "Invisibility";
			((Object)this).name = "bh_invisibility_elixir";
			((StatusEffect)this).m_tooltip = $"Makes you invisible for <color=orange>{m_duration / 60f}min/s</color>";
			((StatusEffect)this).m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_GhostElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			((StatusEffect)this).m_startEffects = val;
			((SE_Stats)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			((StatusEffect)this).m_tooltip = $"Makes you invisible for <color=orange>{m_duration / 60f}min/s</color>";
		}
	}
	public class SE_HealthTonic : StatusEffect
	{
		public float m_healthOverTime;

		public float m_healthOverTimeInterval;

		public float m_healthOverTimeDuration;

		public float m_healthOverTimeTimer;

		public float m_healthOverTimeTicks;

		public float m_healthOverTimeTickHP;

		public int m_skillLevel;

		public void Awake()
		{
			base.m_tooltip = "Recovers your health over time." + $"\n<color=orange>HealOverTime: {Mathf.FloorToInt(m_healthOverTime / (m_healthOverTimeDuration / 60f / m_healthOverTimeInterval))}</color>" + $"\n<color=orange>Duration: {m_healthOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetHealthOverTimeInterval(float bonus)
		{
			m_healthOverTimeInterval = bonus;
			base.m_tooltip = "Recovers your health over time." + $"\n<color=orange>HealOverTime: {Mathf.FloorToInt(m_healthOverTime / (m_healthOverTimeDuration / 60f / m_healthOverTimeInterval))}</color>" + $"\n<color=orange>Duration: {m_healthOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetHealthOverTime(float bonus)
		{
			m_healthOverTime = bonus;
			base.m_tooltip = "Recovers your health over time." + $"\n<color=orange>HealOverTime: {Mathf.FloorToInt(m_healthOverTime / (m_healthOverTimeDuration / 60f / m_healthOverTimeInterval))}</color>" + $"\n<color=orange>Duration: {m_healthOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetHealthOverTimeDuration(float bonus)
		{
			m_healthOverTimeDuration = bonus;
			base.m_tooltip = "Recovers your health over time." + $"\n<color=orange>HealOverTime: {Mathf.FloorToInt(m_healthOverTime / (m_healthOverTimeDuration / 60f / m_healthOverTimeInterval))}</color>" + $"\n<color=orange>Duration: {m_healthOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetSkillLevel(int bonus)
		{
			m_skillLevel = bonus;
			base.m_tooltip = "Recovers your health over time." + $"\n<color=orange>HealOverTime: {Mathf.FloorToInt(m_healthOverTime / (m_healthOverTimeDuration / 60f / m_healthOverTimeInterval))}</color>" + $"\n<color=orange>Duration: {m_healthOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("vfx_Potion_health_medium"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
			if (m_healthOverTime > 0f && m_healthOverTimeInterval > 0f)
			{
				if (m_healthOverTimeDuration <= 0f)
				{
					m_healthOverTimeDuration = base.m_ttl;
				}
				m_healthOverTimeTicks = m_healthOverTimeDuration / m_healthOverTimeInterval;
				m_healthOverTimeTickHP = m_healthOverTime / m_healthOverTimeTicks;
			}
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			if (m_healthOverTimeTicks > 0f)
			{
				m_healthOverTimeTimer += dt;
				if (m_healthOverTimeTimer > m_healthOverTimeInterval)
				{
					m_healthOverTimeTimer = 0f;
					m_healthOverTimeTicks -= m_healthOverTimeInterval;
					base.m_character.Heal(m_healthOverTimeTickHP, true);
				}
			}
		}
	}
	public class SE_HeavyLifter : StatusEffect
	{
		public float m_duration;

		public void Awake()
		{
			base.m_name = "HeavyLifter";
			((Object)this).name = "bh_heavylifter_elixir";
			base.m_tooltip = "Doubles your max carry weight.\nSide Effects: <color=orange>Halved Stamina Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			base.m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_HeavyLifterElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			base.m_tooltip = "Doubles your max carry weight.\nSide Effects: <color=orange>Halved Stamina Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public override void ModifyMaxCarryWeight(float baseLimit, ref float limit)
		{
			((StatusEffect)this).ModifyMaxCarryWeight(baseLimit, ref limit);
			limit *= 2f;
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			Character character = base.m_character;
			Character obj = ((character is Player) ? character : null);
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			((Player)obj).GetTotalFoodValue(ref num, ref num2, ref num3);
			((Player)obj).SetMaxStamina(num2 / 2f, false);
		}
	}
	public class SE_Herbalist : StatusEffect
	{
		public float m_healthOverTime;

		public float m_healthOverTimeInterval;

		public float m_healthOverTimeDuration;

		public float m_healthOverTimeTimer;

		public float m_healthOverTimeTicks;

		public float m_healthOverTimeTickHP;

		public float m_skillFactor;

		public float m_healBonusFactor;

		public float m_durationFactor;

		public void SetHealthOverTimeInterval(float bonus)
		{
			m_healthOverTimeInterval = bonus;
		}

		public void SetSkillFactor(float bonus)
		{
			m_skillFactor = bonus;
		}

		public void SetHealthOverTime(float bonus)
		{
			m_healthOverTime = bonus;
		}

		public void SetHealthOverTimeDuration(float bonus)
		{
			m_healthOverTimeDuration = bonus;
		}

		public void SetHealBonusFactor(float bonus)
		{
			m_healBonusFactor = bonus;
		}

		public void SetDurationFactor(float bonus)
		{
			m_durationFactor = bonus;
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("sfx_creature_consume"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
			if (m_healthOverTime > 0f && m_healthOverTimeInterval > 0f)
			{
				if (m_healthOverTimeDuration <= 0f)
				{
					m_healthOverTimeDuration = base.m_ttl;
				}
				m_healthOverTimeTicks = m_healthOverTimeDuration + m_durationFactor * m_skillFactor / m_healthOverTimeInterval;
				m_healthOverTimeTickHP = m_healthOverTime + m_healBonusFactor * m_skillFactor / m_healthOverTimeTicks;
			}
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			if (m_healthOverTimeTicks > 0f)
			{
				m_healthOverTimeTimer += dt;
				if (m_healthOverTimeTimer > m_healthOverTimeInterval)
				{
					m_healthOverTimeTimer = 0f;
					m_healthOverTimeTicks -= m_healthOverTimeInterval;
					base.m_character.Heal(m_healthOverTimeTickHP / 10f, true);
				}
			}
		}
	}
	public class SE_Jump : StatusEffect
	{
		public float m_duration;

		public float m_jumpMultiplier;

		public void Awake()
		{
			base.m_name = "JumpElixir";
			((Object)this).name = "bh_jump_elixir";
			base.m_tooltip = "Boost your jump ability.\nSide Effects: <color=orange>Doubles Jump Stamina Usage</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			base.m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_JumpElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			base.m_tooltip = "Boost your jump ability.\nSide Effects: <color=orange>Doubles Jump Stamina Usage</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public void SetJumpMultiplier(float jump)
		{
			m_jumpMultiplier = jump;
		}

		public override void ModifyJump(Vector3 baseJump, ref Vector3 jump)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			((StatusEffect)this).ModifyJump(baseJump, ref jump);
			jump *= m_jumpMultiplier;
		}

		public override void ModifyJumpStaminaUsage(float baseStaminaUse, ref float staminaUse)
		{
			((StatusEffect)this).ModifyJumpStaminaUsage(baseStaminaUse, ref staminaUse);
			staminaUse *= 2f;
		}
	}
	public class SE_SlowFall : SE_Stats
	{
		public float m_duration;

		public void Awake()
		{
			((StatusEffect)this).m_name = "SlowFall";
			((Object)this).name = "bh_slowfall_elixir";
			((StatusEffect)this).m_tooltip = "Makes you fall slowly." + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			((StatusEffect)this).m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_SlowFallElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			((StatusEffect)this).m_startEffects = val;
			((SE_Stats)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			((StatusEffect)this).m_tooltip = "Makes you fall slowly." + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}
	}
	public class SE_StaminaTonic : StatusEffect
	{
		public float m_staminaOverTime;

		public float m_staminaOverTimeDuration;

		public float m_skillLevel;

		public void Awake()
		{
			base.m_tooltip = "Recovers your stamina over time." + $"<color=orange>Stamina: {m_staminaOverTime}</color>" + $"\n<color=orange>Duration: {m_staminaOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetStaminaOverTime(float bonus)
		{
			m_staminaOverTime = bonus;
			base.m_tooltip = "Recovers your stamina over time." + $"\n<color=orange>Stamina: {m_staminaOverTime}</color>" + $"\n<color=orange>Duration: {m_staminaOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetStaminaOverTimeDuration(float bonus)
		{
			m_staminaOverTimeDuration = bonus;
			base.m_tooltip = "Recovers your stamina over time." + $"\n<color=orange>Stamina: {m_staminaOverTime}</color>" + $"\n<color=orange>Duration: {m_staminaOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public void SetSkillLevel(float bonus)
		{
			m_skillLevel = bonus;
			base.m_tooltip = "Recovers your stamina over time." + $"\n<color=orange>Stamina: {m_staminaOverTime}</color>" + $"\n<color=orange>Duration: {m_staminaOverTimeDuration / 60f}min/s</color>" + "\n\nRequirement:" + $"\n<color=orange>Herbalist Lv: {m_skillLevel}</color>";
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("vfx_Potion_stamina_medium"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
			if (m_staminaOverTime > 0f && m_staminaOverTimeDuration <= 0f)
			{
				m_staminaOverTimeDuration = base.m_ttl;
			}
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			if (m_staminaOverTime != 0f && base.m_time <= m_staminaOverTimeDuration)
			{
				float num = m_staminaOverTimeDuration / dt;
				base.m_character.AddStamina(m_staminaOverTime / num * 50f);
			}
		}
	}
	public class SE_Swift : StatusEffect
	{
		public float m_duration;

		public float m_speedMultiplier;

		public void Awake()
		{
			base.m_name = "Swift";
			((Object)this).name = "bh_swift_elixir";
			base.m_tooltip = "Makes you run faster but makes you fragile." + $"\nRunSpeed Multiplier: <color=orange>x{m_speedMultiplier}</color>" + "\nSide Effects: <color=orange>Halved Health Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
			base.m_icon = PrefabManager._herbalistBundle.LoadAsset<Sprite>("BH_RunnerElixer.png");
		}

		public override void Setup(Character character)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			EffectList val = new EffectList();
			val.m_effectPrefabs = (EffectData[])(object)new EffectData[1]
			{
				new EffectData
				{
					m_prefab = ZNetScene.instance.GetPrefab("fx_GP_Activation"),
					m_enabled = true,
					m_variant = -1,
					m_attach = true
				}
			};
			base.m_startEffects = val;
			((StatusEffect)this).Setup(character);
		}

		public void SetDuration(float duration)
		{
			m_duration = duration;
			base.m_tooltip = "Makes you run faster but makes you fragile." + $"\nRunSpeed Multiplier: <color=orange>x{m_speedMultiplier}</color>" + "\nSide Effects: <color=orange>Halved Health Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public void SetMultiplier(float multiplier)
		{
			m_speedMultiplier = multiplier;
			base.m_tooltip = "Makes you run faster but makes you fragile." + $"\nRunSpeed Multiplier: <color=orange>x{m_speedMultiplier}</color>" + "\nSide Effects: <color=orange>Halved Health Points</color>" + $"\nDuration: <color=orange>{m_duration / 60f}min/s</color>";
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			Character character = base.m_character;
			Character obj = ((character is Player) ? character : null);
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			((Player)obj).GetTotalFoodValue(ref num, ref num2, ref num3);
			((Player)obj).SetMaxHealth(num / 2f, false);
		}

		public override void ModifySpeed(float baseSpeed, ref float speed, Character character, Vector3 dir)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			((StatusEffect)this).ModifySpeed(baseSpeed, ref speed, character, dir);
			speed *= m_speedMultiplier;
		}
	}
}
namespace Herbalist.Patches
{
	[HarmonyPatch(typeof(Character), "RPC_Damage")]
	public class CharacterPatch
	{
		public static void Postfix(ref Character __instance, ref HitData hit)
		{
			if (!((Object)(object)__instance == (Object)null) && !__instance.IsPlayer())
			{
				Character attacker = hit.GetAttacker();
				Player val = (Player)(object)((attacker is Player) ? attacker : null);
				if (val != null && __instance.m_name.StartsWith("$enemy_") && ((Character)val).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_invisibility_elixir")))
				{
					((Character)val).GetSEMan().RemoveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_invisibility_elixir"), false);
					val.SetGhostMode(false);
				}
			}
		}
	}
	[HarmonyPatch]
	public class HudPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(Hud), "FlashHealthBar")]
		public static void FlashHealthBar_Postfix(Hud __instance)
		{
			if (((Character)Player.m_localPlayer).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_fastlearner_elixir")) || ((Character)Player.m_localPlayer).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_swift_elixir")))
			{
				__instance.m_healthAnimator.ResetTrigger("Flash");
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Hud), "StaminaBarUppgradeFlash")]
		public static void StaminaBarUpgradeFlash_Postfix(Hud __instance)
		{
			if (((Character)Player.m_localPlayer).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_heavylifter_elixir")))
			{
				__instance.m_staminaAnimator.ResetTrigger("Flash");
			}
		}
	}
	[HarmonyPatch]
	public class InventoryGuiPatch
	{
		private static bool _RequirementsMet;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(InventoryGui), "DoCrafting")]
		public static void DoCrafting_Postfix(InventoryGui __instance, ref Player player)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			if (!(((Scene)(ref activeScene)).name != "main") && !((Object)(object)__instance == (Object)null) && !((Object)(object)player != (Object)(object)Player.m_localPlayer) && !((Object)(object)__instance.m_craftRecipe == (Object)null) && __instance.m_availableRecipes.Count > 0)
			{
				string name = ((Object)__instance.m_craftRecipe.m_item).name;
				if (Plugin._potionsToGainExpList.Contains(name) && _RequirementsMet)
				{
					((Character)player).RaiseSkill(Skill.fromName("Herbalist"), Plugin._craftingExp.Value);
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(InventoryGui), "DoCrafting")]
		public static bool DoCrafting_Prefix(InventoryGui __instance, ref Player player)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			if (((Scene)(ref activeScene)).name != "main")
			{
				return false;
			}
			if ((Object)(object)__instance == (Object)null || (Object)(object)player != (Object)(object)Player.m_localPlayer || (Object)(object)__instance.m_craftRecipe == (Object)null)
			{
				return false;
			}
			((Character)player).GetSkills().m_skillData.TryGetValue((SkillType)Math.Abs(StringExtensionMethods.GetStableHashCode("Herbalist")), out var value);
			if (((Object)((RecipeDataPair)(ref __instance.m_selectedRecipe)).Recipe.m_item).name.ToLower().Contains("bh_minor") && value.m_level < (float)Plugin._minorLevel.Value)
			{
				((Character)player).Message((MessageType)2, "<size=28>Herbalist level not high enough.</size>", 0, (Sprite)null);
				_RequirementsMet = false;
				return false;
			}
			if (((Object)((RecipeDataPair)(ref __instance.m_selectedRecipe)).Recipe.m_item).name.ToLower().Contains("bh_medium") && value.m_level < (float)Plugin._mediumLevel.Value)
			{
				((Character)player).Message((MessageType)2, "<size=28>Herbalist level not high enough.</size>", 0, (Sprite)null);
				_RequirementsMet = false;
				return false;
			}
			if (((Object)((RecipeDataPair)(ref __instance.m_selectedRecipe)).Recipe.m_item).name.ToLower().Contains("bh_large") && value.m_level < (float)Plugin._largeLevel.Value)
			{
				((Character)player).Message((MessageType)2, "<size=28>Herbalist level not high enough.</size>", 0, (Sprite)null);
				_RequirementsMet = false;
				return false;
			}
			_RequirementsMet = true;
			return true;
		}
	}
	[HarmonyPatch]
	public class ItemDataPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(ItemData), "GetStatusEffectTooltip")]
		public static string GetStatusEffectTooltip_Postfix(string __result, ItemData __instance)
		{
			try
			{
				if (__instance?.m_shared == null)
				{
					return __result;
				}
				StringBuilder stringBuilder = new StringBuilder(__result);
				((Character)Player.m_localPlayer).GetSkills().m_skillData.TryGetValue((SkillType)Math.Abs(StringExtensionMethods.GetStableHashCode("Herbalist")), out var value);
				float? num = ((value != null && value.m_level <= 0f) ? new float?(0f) : value?.m_level);
				float skillFactor = ((Character)(object)Player.m_localPlayer).GetSkillFactor("Herbalist");
				float num2 = Plugin._dandelionDuration.Value + Plugin._durationBonusFactor.Value * skillFactor;
				float num3 = Plugin._thistleDuration.Value + Plugin._durationBonusFactor.Value * skillFactor;
				float num4 = num2 / Plugin._dandelionInterval.Value;
				float num5 = num3 / Plugin._thistleInterval.Value;
				float num6 = Plugin._dandelionHealthOverTime.Value + Plugin._healBonusFactor.Value * skillFactor / num4;
				float num7 = Plugin._thistleHealthOverTime.Value + Plugin._healBonusFactor.Value * skillFactor / num5;
				string name = ((Object)__instance.m_dropPrefab).name;
				if (!(name == "Dandelion"))
				{
					if (name == "Thistle")
					{
						stringBuilder.Append($"<color=red>Herbalist Lv: {num}</color>");
						stringBuilder.Append("\nHeals you over time.");
						stringBuilder.Append($"\n<color=orange>HealOvertime: {num7 / 10f:#.##}</color>");
						stringBuilder.Append($"\n<color=orange>Interval: {Plugin._thistleInterval.Value}</color>");
						stringBuilder.Append($"\n<color=orange>Duration: {num3}</color>");
						return stringBuilder.ToString();
					}
					return __result;
				}
				stringBuilder.Append($"<color=red>Herbalist Lv: {num}</color>");
				stringBuilder.Append("\nHeals you over time.");
				stringBuilder.Append($"\n<color=orange>HealOvertime: {num6 / 10f:#.##}</color>");
				stringBuilder.Append($"\n<color=orange>Interval: {Plugin._dandelionInterval.Value}</color>");
				stringBuilder.Append($"\n<color=orange>Duration: {num2}</color>");
				return stringBuilder.ToString();
			}
			catch
			{
				return __result;
			}
		}
	}
	[HarmonyPatch]
	public class ObjectDBPatch
	{
		[HarmonyPriority(700)]
		[HarmonyPostfix]
		[HarmonyPatch(typeof(ObjectDB), "Awake")]
		public static void Awake_Postfix(ObjectDB __instance)
		{
			RegisterPrefabsToObjectDB.Init();
			RegisterRecipesToObjectDB.Init();
			__instance.UpdateRegisters();
		}

		[HarmonyPriority(700)]
		[HarmonyPostfix]
		[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
		public static void CopyOtherDB_Postfix(ObjectDB __instance)
		{
			RegisterPrefabsToObjectDB.Init();
			RegisterRecipesToObjectDB.Init();
			__instance.UpdateRegisters();
		}
	}
	[HarmonyPatch]
	public class PickablePatch
	{
		private static DateTime _pickTimer = DateTime.MinValue;

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Pickable), "Interact")]
		private static void PickableInteract_Prefix(Pickable __instance)
		{
			if (__instance.m_nview.IsValid() && IsHerbal(__instance.m_itemPrefab) && __instance.m_respawnTimeMinutes > 0f)
			{
				__instance.m_nview.GetZDO().Set("Herbalist Skill Level", ((Character)(object)Player.m_localPlayer).GetSkillFactor("Herbalist"));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Pickable), "RPC_Pick")]
		private static void RpcPick_Prefix(Pickable __instance, long sender, ref int? __state)
		{
			if (!__instance.m_nview.IsOwner() || __instance.m_picked)
			{
				__state = -1;
			}
			else if (__instance.m_nview.IsValid() && IsHerbal(__instance.m_itemPrefab) && __instance.m_respawnTimeMinutes > 0f)
			{
				Player val = Enumerable.FirstOrDefault((IEnumerable<Player>)Player.s_players, (Func<Player, bool>)((Player p) => ((ZDOID)(ref ((Character)p).m_nview.GetZDO().m_uid)).UserID == sender));
				if (val != null && (DateTime.Now - _pickTimer).TotalSeconds > (double)Plugin._expCooldownTimer.Value)
				{
					_pickTimer = DateTime.Now;
					((Character)val).m_nview.InvokeRPC("Herbalist IncreaseSkill", new object[1] { 1 });
				}
			}
		}

		private static bool IsHerbal(GameObject gameObject)
		{
			string name = gameObject.GetComponent<ItemDrop>().m_itemData.m_shared.m_name;
			if (!name.Contains("dandelion") && !name.Contains("thistle") && !name.Contains("chicory") && !name.Contains("daisy") && !name.Contains("boswellia") && !name.Contains("chamomile") && !name.Contains("echinacea") && !name.Contains("lavender") && !name.Contains("valkyriefern") && !name.Contains("vikingsbreadcap") && !name.Contains("bjorncap") && !name.Contains("skaldsivy") && !name.Contains("aslaugsherb") && !name.Contains("lokistrickcap") && !name.Contains("helshadefungus") && !name.Contains("seidrblossoms") && !name.Contains("thorstoadstool") && !name.Contains("valhallaberry"))
			{
				return name.Contains("nordicfirebloom");
			}
			return true;
		}
	}
	[HarmonyPatch]
	public class PlayerPatch
	{
		[HarmonyPriority(800)]
		[HarmonyPostfix]
		[HarmonyPatch(typeof(Player), "Awake")]
		private static void PlayerAwake_Postfix(Player __instance)
		{
			((Character)__instance).m_nview.Register<int>("Herbalist IncreaseSkill", (Action<long, int>)delegate(long _, int factor)
			{
				((Character)(object)__instance).RaiseSkill("Herbalist", factor);
			});
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Player), "Update")]
		private static void PlayerUpdate_Postfix(ref Player __instance)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer))
			{
				((Character)__instance).m_nview.GetZDO().Set("Herbalist Skill Factor", ((Character)__instance).GetSkillFactor(Skill.fromName("Herbalist")));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Player), "ConsumeItem")]
		private static bool ConsumeItem_Prefix(Inventory inventory, ItemData item, ref Player __instance)
		{
			float skillFactor = ((Character)(object)__instance).GetSkillFactor("Herbalist");
			float num = (float)Math.Ceiling(Plugin._durationBonusFactor.Value * 30f * skillFactor);
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("BH_EmptyContainer");
			GameObject itemPrefab2 = ObjectDB.instance.GetItemPrefab("BH_EmptyBottle");
			GameObject itemPrefab3 = ObjectDB.instance.GetItemPrefab("BH_EmptyLargeBottle");
			GameObject itemPrefab4 = ObjectDB.instance.GetItemPrefab("BH_EmptyElixerBottle");
			switch ((item != null) ? ((Object)item.m_dropPrefab).name : null)
			{
			case "BH_MinorHealthTonic":
			{
				if (((Character)__instance).GetHealth() >= ((Character)__instance).GetMaxHealth())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minorhealthtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumhealthtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largehealthtonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._minorHealthTonicDuration.Value + num;
				bool flag17 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag17 = inventory.AddItem(itemPrefab, 1);
				}
				if (flag17)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag17 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_MinorStaminaTonic":
			{
				if (__instance.GetStamina() >= ((Character)__instance).GetMaxStamina())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minorstaminatonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumstaminatonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largestaminatonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._minorStaminaTonicDuration.Value + num;
				bool flag = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag = inventory.AddItem(itemPrefab, 1);
				}
				if (flag)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_MinorEitrTonic":
			{
				if (((Character)__instance).GetMaxEitr() == 0f || __instance.GetEitr() >= ((Character)__instance).GetMaxEitr())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minoreitrtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumeitrtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largeeitrtonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._minorEitrTonicDuration.Value + num;
				bool flag6 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag6 = inventory.AddItem(itemPrefab, 1);
				}
				if (flag6)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag6 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_MediumHealthTonic":
			{
				if (((Character)__instance).GetHealth() >= ((Character)__instance).GetMaxHealth())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minorhealthtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumhealthtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largehealthtonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._mediumHealthTonicDuration.Value + num;
				bool flag4 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag4 = inventory.AddItem(itemPrefab2, 1);
				}
				if (flag4)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab2.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag4 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_MediumStaminaTonic":
			{
				if (__instance.GetStamina() >= ((Character)__instance).GetMaxStamina())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minorstaminatonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumstaminatonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largestaminatonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._mediumStaminaTonicDuration.Value + num;
				bool flag7 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag7 = inventory.AddItem(itemPrefab2, 1);
				}
				if (flag7)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab2.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag7 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_MediumEitrTonic":
			{
				if (((Character)__instance).GetMaxEitr() == 0f || __instance.GetEitr() >= ((Character)__instance).GetMaxEitr())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minoreitrtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumeitrtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largeeitrtonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._mediumEitrTonicDuration.Value + num;
				bool flag15 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag15 = inventory.AddItem(itemPrefab2, 1);
				}
				if (flag15)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab2.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag15 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_LargeHealthTonic":
			{
				if (((Character)__instance).GetHealth() >= ((Character)__instance).GetMaxHealth())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minorhealthtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumhealthtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largehealthtonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._largeHealthTonicDuration.Value + num;
				bool flag3 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag3 = inventory.AddItem(itemPrefab3, 1);
				}
				if (flag3)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab3.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag3 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_LargeStaminaTonic":
			{
				if (__instance.GetStamina() >= ((Character)__instance).GetMaxStamina())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minorstaminatonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumstaminatonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largestaminatonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._largeStaminaTonicDuration.Value + num;
				bool flag2 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag2 = inventory.AddItem(itemPrefab3, 1);
				}
				if (flag2)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab3.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag2 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_LargeEitrTonic":
			{
				if (((Character)__instance).GetMaxEitr() == 0f || __instance.GetEitr() >= ((Character)__instance).GetMaxEitr())
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_minoreitrtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_mediumeitrtonic")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_largeeitrtonic")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._largeEitrTonicDuration.Value + num;
				bool flag12 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag12 = inventory.AddItem(itemPrefab3, 1);
				}
				if (flag12)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab3.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag12 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_Chicory":
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("Chicory")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				return true;
			case "BH_Daisy":
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("Daisy")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				return true;
			case "BH_GhostElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_invisibility_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._ghostDuration.Value + num;
				bool flag11 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag11 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag11)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag11 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_LearningElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_fastlearner_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._learningDuration.Value + num;
				bool flag14 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag14 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag14)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag14 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_HeavyLifterElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_heavylifter_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._heavyLifterDuration.Value + num;
				bool flag10 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag10 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag10)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag10 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_JumpElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_jump_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._jumpDuration.Value + num;
				bool flag9 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag9 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag9)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag9 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_SlowFallElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_slowfall_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._slowFallDuration.Value + num;
				bool flag16 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag16 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag16)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag16 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_BeserkerElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_berserker_elixir")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_defender_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._berserkerDuration.Value + num;
				bool flag8 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag8 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag8)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag8 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_DefenderElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_berserker_elixir")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_defender_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._defenderDuration.Value + num;
				bool flag13 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag13 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag13)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag13 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "BH_RunnerElixer":
			{
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_swift_elixir")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = ConfigSetup._runnerDuration.Value + num;
				bool flag5 = false;
				if (Plugin._returnBottles.Value == Toggle.On)
				{
					flag5 = inventory.AddItem(itemPrefab4, 1);
				}
				if (flag5)
				{
					((Character)__instance).ShowPickupMessage(itemPrefab4.GetComponent<ItemDrop>().m_itemData, 1);
				}
				else if (!flag5 && Plugin._returnBottles.Value == Toggle.On)
				{
					((Character)__instance).Message((MessageType)2, "$msg_noroom", 0, (Sprite)null);
				}
				return true;
			}
			case "Dandelion":
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("dandelion_cooldown")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = Plugin._dandelionDuration.Value + Plugin._durationBonusFactor.Value * skillFactor;
				return true;
			case "Thistle":
				if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("thistle_cooldown")))
				{
					((Character)__instance).Message((MessageType)2, "<size=28>Can't consume right now.</size>", 0, (Sprite)null);
					return false;
				}
				item.m_shared.m_consumeStatusEffect.m_ttl = Plugin._thistleDuration.Value + Plugin._durationBonusFactor.Value * skillFactor;
				return true;
			default:
				return true;
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Player), "ConsumeItem")]
		private static void ConsumeItem_Prefix(ref Player __instance, ItemData item)
		{
			if (!((Object)(object)__instance == (Object)null) && !((Character)__instance).IsDead())
			{
				float skillFactor = ((Character)(object)__instance).GetSkillFactor("Herbalist");
				if (Plugin._ToIncreaseDuration.Contains(((Object)item.m_dropPrefab).name))
				{
					float ttl = item.m_shared.m_consumeStatusEffect.m_ttl;
					float num = (float)Math.Ceiling(ttl * skillFactor);
					item.m_shared.m_consumeStatusEffect.m_ttl = ttl + num;
				}
				else if (Plugin._ToReduceCooldown.Contains(((Object)item.m_dropPrefab).name))
				{
					float ttl2 = item.m_shared.m_consumeStatusEffect.m_ttl;
					float num2 = (float)Math.Ceiling(ttl2 * skillFactor);
					item.m_shared.m_consumeStatusEffect.m_ttl = ttl2 - num2;
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Player), "UpdateEnvStatusEffects")]
		private static bool UpdateEnvStatusEffects_Prefix(Player __instance)
		{
			if (!((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_daisy_buff")))
			{
				return true;
			}
			if (EnvMan.IsFreezing())
			{
				((Character)__instance).GetSEMan().RemoveStatusEffect(StringExtensionMethods.GetStableHashCode("Freezing"), true);
			}
			return true;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Player), "UpdateStats", new Type[] { typeof(float) })]
		private static void UpdateStats_Postfix(Player __instance)
		{
			if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_chicory_buff")))
			{
				((Character)__instance).GetSEMan().RemoveStatusEffect(StringExtensionMethods.GetStableHashCode("Poison"), false);
			}
			if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_invisibility_elixir")))
			{
				__instance.SetGhostMode(true);
			}
			float num2 = default(float);
			float num3 = default(float);
			if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_fastlearner_elixir")) || ((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_swift_elixir")))
			{
				float num = default(float);
				__instance.GetTotalFoodValue(ref num, ref num2, ref num3);
				__instance.SetMaxHealth(num / 2f, false);
			}
			if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_heavylifter_elixir")))
			{
				float num4 = default(float);
				__instance.GetTotalFoodValue(ref num3, ref num4, ref num2);
				__instance.SetMaxStamina(num4 / 2f, false);
			}
		}
	}
	[HarmonyPatch(typeof(SEMan), "Internal_AddStatusEffect")]
	public class SEManPatch
	{
		public static bool Prefix(SEMan __instance, ref int nameHash)
		{
			if (__instance.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_daisy_buff")) && nameHash == StringExtensionMethods.GetStableHashCode("Freezing"))
			{
				return false;
			}
			if (__instance.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_chicory_buff")) && nameHash == StringExtensionMethods.GetStableHashCode("Poison"))
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch]
	public class SkillsPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(Skills), "RaiseSkill")]
		public static void RaiseSkill_Prefix(Skills __instance, ref SkillType skillType, ref float factor)
		{
			if (!((Object)(object)__instance.m_player == (Object)null) && ((Character)__instance.m_player).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("bh_fastlearner_elixir")))
			{
				factor *= ConfigSetup._learningMultiplier.Value;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Skills), "RaiseSkill")]
		private static void RaiseSkill_Postfix(Skills __instance, SkillType skillType, float factor = 1f)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin._displayExpGained.Value != Toggle.On)
			{
				return;
			}
			((Character)__instance.m_player).GetSkills().m_skillData.TryGetValue((SkillType)Math.Abs(StringExtensionMethods.GetStableHashCode("Herbalist")), out var value);
			if ((SkillType?)skillType != value?.m_info.m_skill)
			{
				return;
			}
			try
			{
				if (value.m_level < 100f)
				{
					float value2 = value.m_accumulator / (value.GetNextLevelRequirement() / 100f);
					((Character)__instance.m_player).Message((MessageType)1, $"$Level {value.m_level.tFloat(0)} Herbalist [{value.m_accumulator.tFloat(2)}/{value.GetNextLevelRequirement().tFloat(2)}] ({value2.tFloat(0)}%)", 0, value.m_info.m_icon);
				}
			}
			catch
			{
			}
		}
	}
	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	public class ZNetScenePatch
	{
		private static void Postfix(ZNetScene __instance)
		{
			if (!((Object)(object)__instance == (Object)null))
			{
				List<GameObject> prefabs = __instance.m_prefabs;
				if (prefabs != null && prefabs.Count > 0)
				{
					RegisterPrefabsToZNetScene.Init();
					RegisterEffectsToZNetScene.Init();
				}
			}
		}
	}
	[HarmonyPatch(typeof(ZoneSystem), "ValidateVegetation")]
	public class ZoneSystemPatch
	{
		public static void Prefix(ZoneSystem __instance)
		{
			VegetationSetup.Init(__instance);
		}
	}
}
namespace Herbalist.Utils
{
	public abstract class RegisterEffectsToZNetScene
	{
		private static ZNetScene _zNetScene => ZNetScene.instance;

		public static void Init()
		{
			if (Helper.ZNetSceneAwake())
			{
				GameObject gameObject = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_build_hammer_wood");
				_zNetScene.AddGameObject(gameObject);
				GameObject gameObject2 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_gui_craftitem_cauldron");
				_zNetScene.AddGameObject(gameObject2);
				GameObject gameObject3 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_gui_craftitem_cauldron_end");
				_zNetScene.AddGameObject(gameObject3);
				GameObject gameObject4 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_gui_repairitem_workbench");
				_zNetScene.AddGameObject(gameObject4);
				GameObject gameObject5 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_MeadBurp");
				_zNetScene.AddGameObject(gameObject5);
				GameObject gameObject6 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_pickable_pick");
				_zNetScene.AddGameObject(gameObject6);
				GameObject gameObject7 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_sfx_wood_destroyed");
				_zNetScene.AddGameObject(gameObject7);
				GameObject gameObject8 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_vfx_MeadSplash");
				_zNetScene.AddGameObject(gameObject8);
				GameObject gameObject9 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_vfx_pickable_pick");
				_zNetScene.AddGameObject(gameObject9);
				GameObject gameObject10 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_vfx_Place_workbench");
				_zNetScene.AddGameObject(gameObject10);
				GameObject gameObject11 = PrefabManager._herbalistBundle.LoadAsset<GameObject>("bh_vfx_SawDust");
				_zNetScene.AddGameObject(gameObject11);
			}
		}
	}
}
namespace Herbalist.Functions
{
	public static class ConfigSetup
	{
		public static ConfigEntry<bool> _berserkerEnable;

		public static ConfigEntry<float> _berserkerDuration;

		public static ConfigEntry<float> _berserkerMultiplier;

		public static ConfigEntry<string> _berserkerMat1;

		public static ConfigEntry<string> _berserkerMat2;

		public static ConfigEntry<string> _berserkerMat3;

		public static ConfigEntry<string> _berserkerMat4;

		public static ConfigEntry<bool> _defenderEnable;

		public static ConfigEntry<float> _defenderDuration;

		public static ConfigEntry<string> _defenderMat1;

		public static ConfigEntry<string> _defenderMat2;

		public static ConfigEntry<string> _defenderMat3;

		public static ConfigEntry<string> _defenderMat4;

		public static ConfigEntry<bool> _emptyBottleEnable;

		public static ConfigEntry<string> _emptyBottleMat1;

		public static ConfigEntry<string> _emptyBottleMat2;

		public static ConfigEntry<string> _emptyBottleMat3;

		public static ConfigEntry<string> _emptyBottleMat4;

		public static ConfigEntry<bool> _emptyContainerEnable;

		public static ConfigEntry<string> _emptyContainerMat1;

		public static ConfigEntry<string> _emptyContainerMat2;

		public static ConfigEntry<string> _emptyContainerMat3;

		public static ConfigEntry<string> _emptyContainerMat4;

		public static ConfigEntry<bool> _emptyLargeBottleEnable;

		public static ConfigEntry<string> _emptyLargeBottleMat1;

		public static ConfigEntry<string> _emptyLargeBottleMat2;

		public static ConfigEntry<string> _emptyLargeBottleMat3;

		public static ConfigEntry<string> _emptyLargeBottleMat4;

		public static ConfigEntry<bool> _emptyElixirBottleEnable;

		public static ConfigEntry<string> _emptyElixirBottleMat1;

		public static ConfigEntry<string> _emptyElixirBottleMat2;

		public static ConfigEntry<string> _emptyElixirBottleMat3;

		public static ConfigEntry<string> _emptyElixirBottleMat4;

		public static ConfigEntry<bool> _ghostElixirEnable;

		public static ConfigEntry<float> _ghostDuration;

		public static ConfigEntry<string> _ghostElixirMat1;

		public static ConfigEntry<string> _ghostElixirMat2;

		public static ConfigEntry<string> _ghostElixirMat3;

		public static ConfigEntry<string> _ghostElixirMat4;

		public static ConfigEntry<bool> _heavyLifterEnable;

		public static ConfigEntry<float> _heavyLifterDuration;

		public static ConfigEntry<string> _heavyLifterMat1;

		public static ConfigEntry<string> _heavyLifterMat2;

		public static ConfigEntry<string> _heavyLifterMat3;

		public static ConfigEntry<string> _heavyLifterMat4;

		public static ConfigEntry<bool> _jumpEnable;

		public static ConfigEntry<float> _jumpMultiplier;

		public static ConfigEntry<float> _jumpDuration;

		public static ConfigEntry<string> _jumpMat1;

		public static ConfigEntry<string> _jumpMat2;

		public static ConfigEntry<string> _jumpMat3;

		public static ConfigEntry<string> _jumpMat4;

		public static ConfigEntry<bool> _learningElixirEnable;

		public static ConfigEntry<float> _learningDuration;

		public static ConfigEntry<float> _learningMultiplier;

		public static ConfigEntry<string> _learningElixirMat1;

		public static ConfigEntry<string> _learningElixirMat2;

		public static ConfigEntry<string> _learningElixirMat3;

		public static ConfigEntry<string> _learningElixirMat4;

		public static ConfigEntry<float> _minorHealthTonicHealthOverTime;

		public static ConfigEntry<float> _minorHealthTonicDuration;

		public static ConfigEntry<float> _minorHealthTonicInterval;

		public static ConfigEntry<bool> _minorHealthEnable;

		public static ConfigEntry<string> _minorHealthMat1;

		public static ConfigEntry<string> _minorHealthMat2;

		public static ConfigEntry<string> _minorHealthMat3;

		public static ConfigEntry<string> _minorHealthMat4;

		public static ConfigEntry<float> _minorStaminaTonicStaminaOverTime;

		public static ConfigEntry<float> _minorStaminaTonicDuration;

		public static ConfigEntry<bool> _minorStaminaEnable;

		public static Conf