Decompiled source of Herbalist v1.4.6
Herbalist.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
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