Decompiled source of MoreSkills v0.3.2

MoreSkills.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MoreSkills.Config;
using MoreSkills.UI;
using MoreSkills.Utility;
using Pipakin.FitnessSkillMod.Config;
using Pipakin.SkillInjectorMod;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MoreSkills")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MoreSkills")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("10ba59fd-7bfc-46e9-92a3-a7691d15918c")]
[assembly: AssemblyFileVersion("0.3.2")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.2.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace Pipakin.FitnessSkillMod
{
	public class FitnessConfig
	{
		private GenericConfigVariable<bool> fitnessSkillEnabled;

		private GenericConfigVariable<float> configSkillIncrease;

		private GenericConfigVariable<float> maxStaminaMultiplier;

		private GenericConfigVariable<float> regenStaminaMultiplier;

		private GenericConfigVariable<float> baseStaminaRegen;

		private GenericConfigVariable<float> baseStamina;

		private GenericConfigVariable<float> skillGainIncrement;

		public bool SkillEnabled => fitnessSkillEnabled.Value;

		public float SkillIncrease => configSkillIncrease.Value;

		public float MaxStaminaMultiplier => maxStaminaMultiplier.Value;

		public float RegenStaminaMultiplier => regenStaminaMultiplier.Value;

		public float BaseStaminaRegen => baseStaminaRegen.Value;

		public float BaseStamina => baseStamina.Value;

		public float SkillGainIncrement => skillGainIncrement.Value;

		public void InitConfig(string id, ConfigFile config)
		{
			config.Bind<int>("General", "NexusID", 388, "Nexus mod ID for updates");
			Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "ModConfigEnforcer");
			if (assembly != null)
			{
				Debug.Log((object)"[FitnessMod] Mod Config Enforcer detected, registering mod...");
				Type type = assembly.GetType("ModConfigEnforcer.ConfigManager");
				Traverse.Create(type).Method("RegisterMod", new object[2] { id, config }).GetValue(new object[2] { id, config });
			}
			else
			{
				Debug.Log((object)"Mod Config Enforcer not detected.");
			}
			fitnessSkillEnabled = new GenericConfigVariable<bool>(assembly, config, id, "FitnessSkillEnabled", defaultValue: true, "Enablers", "Enable or Disable the Fitness Skill", localOnly: true);
			configSkillIncrease = new GenericConfigVariable<float>(assembly, config, id, "LevelingIncrement", 1f, "Progression", "Increment to increase skill per use of a full bar of stamina", localOnly: true);
			baseStamina = new GenericConfigVariable<float>(assembly, config, id, "BaseMaximum", 75f, "Stamina", "Base Max Stamina. The default is 75 which is the same as the umodded game", localOnly: true);
			maxStaminaMultiplier = new GenericConfigVariable<float>(assembly, config, id, "MaxMultiplier", 1.5f, "Stamina", "Maximum stamina multiplier (at level 100). Minimum 1", localOnly: true);
			baseStaminaRegen = new GenericConfigVariable<float>(assembly, config, id, "BaseRegen", 5f, "Stamina", "Base Regen. The default is 5 which is the same as the umodded game", localOnly: true);
			regenStaminaMultiplier = new GenericConfigVariable<float>(assembly, config, id, "RegenMultiplier", 1.5f, "Stamina", "Stamina regen multiplier (at level 100). Minimum 1", localOnly: true);
			skillGainIncrement = new GenericConfigVariable<float>(assembly, config, id, "GainIncrement", 25f, "Stamina", "Amount of stamina used before any skill is gained", localOnly: true);
		}
	}
	[BepInPlugin("com.pipakin.FitnessSkillMod", "FitnessSkillMod", "2.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class FitnessSkill : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(Player), "SetMaxStamina")]
		public static class ApplyFitnessEffects
		{
			[HarmonyPrefix]
			public static void Prefix(ref float stamina, Player __instance)
			{
				if (fitnessConfig.SkillEnabled)
				{
					try
					{
						float skillFactor = ((Character)__instance).GetSkillFactor((SkillType)243);
						float num = (float)Math.Ceiling(skillFactor * (fitnessConfig.MaxStaminaMultiplier - 1f) * fitnessConfig.BaseStamina);
						stamina += num + fitnessConfig.BaseStamina - 75f;
					}
					catch (Exception ex)
					{
						Debug.LogError((object)("Error adusting base stamina: " + ex.ToString()));
					}
				}
			}
		}

		[HarmonyPatch]
		public static class ApplyFitnessRegen
		{
			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			[HarmonyPrefix]
			public static void Prefix(Player __instance, ref float ___m_staminaRegen)
			{
				if (fitnessConfig.SkillEnabled)
				{
					try
					{
						float skillFactor = ((Character)__instance).GetSkillFactor((SkillType)243);
						float num = (float)Math.Ceiling((skillFactor * (fitnessConfig.RegenStaminaMultiplier - 1f) + 1f) * fitnessConfig.BaseStaminaRegen);
						___m_staminaRegen = num;
					}
					catch (Exception ex)
					{
						Debug.LogError((object)("Error adusting stamina regen: " + ex.ToString()));
					}
				}
			}
		}

		[HarmonyPatch(typeof(Player), "RPC_UseStamina")]
		public static class IncreaseFitnessSkill
		{
			[HarmonyPrefix]
			public static void Prefix(float v, Player __instance, ZNetView ___m_nview)
			{
				if (!fitnessConfig.SkillEnabled)
				{
					return;
				}
				try
				{
					float @float = ___m_nview.GetZDO().GetFloat("fitness_progress", 0f);
					@float += v;
					if (@float > fitnessConfig.SkillGainIncrement)
					{
						float num = @float / ((Character)__instance).GetMaxStamina();
						((Character)__instance).RaiseSkill((SkillType)243, num * fitnessConfig.SkillIncrease);
						___m_nview.GetZDO().Set("fitness_progress", 0f);
					}
					else
					{
						___m_nview.GetZDO().Set("fitness_progress", @float);
					}
				}
				catch (Exception ex)
				{
					Debug.LogError((object)("Error increasing fitness skill: " + ex.ToString()));
				}
			}
		}

		private const string MOD_ID = "com.pipakin.FitnessSkillMod";

		private readonly Harmony harmony = new Harmony("com.pipakin.FitnessSkillMod");

		private static FitnessConfig fitnessConfig = new FitnessConfig();

		private static Dictionary<string, Texture2D> cachedTextures = new Dictionary<string, Texture2D>();

		public const int SKILL_TYPE = 243;

		private static string iconPath = "Assets.Icons.";

		private static string iconFileName = "fitness.png";

		public static Sprite FitnessIcon;

		public static Sprite Load_FitnessIcon()
		{
			//IL_0033: 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)
			try
			{
				Stream stream = EmbeddedAssets.LoadAssets(iconPath + iconFileName);
				Texture2D val = Helper.LoadPng(stream);
				FitnessIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
				stream.Dispose();
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Unable to load skill icon '" + iconFileName + "': " + ex.Message));
			}
			return FitnessIcon;
		}

		private void Awake()
		{
			fitnessConfig.InitConfig("com.pipakin.FitnessSkillMod", ((BaseUnityPlugin)this).Config);
			harmony.PatchAll(typeof(ApplyFitnessEffects));
			harmony.PatchAll(typeof(ApplyFitnessRegen));
			harmony.PatchAll(typeof(IncreaseFitnessSkill));
			if (fitnessConfig.SkillEnabled)
			{
				SkillInjector.RegisterNewSkill(243, "Fitness", "Affects maximum stamina level", 1f, Load_FitnessIcon(), (SkillType)102);
			}
		}
	}
}
namespace Pipakin.FitnessSkillMod.Config
{
	internal class GenericConfigVariable<T>
	{
		private object backingStore;

		public T Value => Traverse.Create(backingStore).Property("Value", (object[])null).GetValue<T>();

		public GenericConfigVariable(Assembly assembly, ConfigFile config, string id, string varName, T defaultValue, string configSection, string configDescription, bool localOnly)
		{
			if (assembly != null)
			{
				MethodInfo methodInfo = assembly.GetType("ModConfigEnforcer.ConfigManager").GetMethods().First((MethodInfo x) => x.Name == "RegisterModConfigVariable" && x.IsGenericMethod)
					.MakeGenericMethod(typeof(T));
				backingStore = methodInfo.Invoke(null, new object[6] { id, varName, defaultValue, configSection, configDescription, localOnly });
			}
			else
			{
				backingStore = config.Bind<T>(configSection, varName, defaultValue, configDescription);
			}
		}
	}
}
namespace MoreSkills.Info
{
	public static class PluginInfo
	{
		public const string Name = "MoreSkills";

		public const string Guid = "com.macharastormwing.moreskills";

		public const string Version = "0.3.2";
	}
}
namespace MoreSkills.Utility
{
	internal class EmbeddedAssets
	{
		public static Stream LoadAssets(string assetPath)
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string[] manifestResourceNames = executingAssembly.GetManifestResourceNames();
			if (executingAssembly.GetManifestResourceInfo(executingAssembly.GetName().Name + "." + assetPath) != null)
			{
				return executingAssembly.GetManifestResourceStream(executingAssembly.GetName().Name + "." + assetPath);
			}
			return null;
		}
	}
	public static class Helper
	{
		public struct HuntingDrops
		{
			public string CreaturePrefab { get; }

			public int Max { get; }

			public int Min { get; }

			public float Chance { get; }

			public HuntingDrops(string creatureprefab, int max, int min, float chance)
			{
				CreaturePrefab = creatureprefab;
				Max = max;
				Min = min;
				Chance = chance;
			}
		}

		public struct TamingSaves
		{
			public string CreatureZDOID { get; }

			public ZDOID TamerID { get; }

			public float TameTime { get; }

			public float EatTime { get; }

			public float MasterLevel { get; }

			public float TamerLevel { get; }

			public float UnlockLevel { get; }

			public TamingSaves(string creatureZDOID, ZDOID tamerid, float tametime, float eattime, float unlockLevel, float tamerLevel, float masterLevel)
			{
				//IL_0009: 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)
				CreatureZDOID = creatureZDOID;
				TamerID = tamerid;
				TameTime = tametime;
				EatTime = eattime;
				UnlockLevel = unlockLevel;
				TamerLevel = tamerLevel;
				MasterLevel = masterLevel;
			}
		}

		public struct TamingLevels
		{
			public string CreatureName { get; }

			public float MasterLevel { get; }

			public float TamerLevel { get; }

			public float UnlockLevel { get; }

			public float TameTime { get; }

			public TamingLevels(string creatureName, float masterLevel, float tamerLevel, float unlockLevel, float tametime)
			{
				CreatureName = creatureName;
				MasterLevel = masterLevel;
				TamerLevel = tamerLevel;
				UnlockLevel = unlockLevel;
				TameTime = tametime;
			}
		}

		public struct CreatureTameLevels
		{
			public string CreatureName { get; }

			public float UnlockLevel { get; }

			public float TamerLevel { get; }

			public float MasterLevel { get; }

			public CreatureTameLevels(string creatureNamel, float unlockLevel, float tamerLevel, float masterLevel)
			{
				CreatureName = creatureNamel;
				UnlockLevel = unlockLevel;
				TamerLevel = tamerLevel;
				MasterLevel = masterLevel;
			}
		}

		public struct TamingFix
		{
			public string CreatureZDOID { get; }

			public bool Fixed { get; }

			public TamingFix(string creaturezdoid, bool tfixed)
			{
				CreatureZDOID = creaturezdoid;
				Fixed = tfixed;
			}
		}

		public struct TamingGotFar
		{
			public string CreatureZDOID { get; }

			public bool GotFar { get; }

			public TamingGotFar(string creaturezdoid, bool gotfar)
			{
				CreatureZDOID = creaturezdoid;
				GotFar = gotfar;
			}
		}

		public struct TamingDoubleCheck
		{
			public string CreatureZDOID { get; }

			public int DoubleCheck { get; }

			public TamingDoubleCheck(string creaturezdoid, int doublecheck)
			{
				CreatureZDOID = creaturezdoid;
				DoubleCheck = doublecheck;
			}
		}

		public struct CraftingSaves
		{
			public string ObjNumItem { get; }

			public float ObjNum { get; }

			public float ItemCNum { get; }

			public float ItemUNum { get; }

			public CraftingSaves(string objnumitem, float objnum, float itemcnum, float itemunum)
			{
				ObjNumItem = objnumitem;
				ObjNum = objnum;
				ItemCNum = itemcnum;
				ItemUNum = itemunum;
			}
		}

		public struct FishStats
		{
			public string FishName { get; }

			public float BHookChance { get; }

			public int ItemStackSize { get; }

			public float StaminaUse { get; }

			public FishStats(string fishname, float bhookchance, int itemstacksize, float staminause)
			{
				FishName = fishname;
				BHookChance = bhookchance;
				ItemStackSize = itemstacksize;
				StaminaUse = staminause;
			}
		}

		public struct FishSizes
		{
			public string FishNameZDOID { get; }

			public Vector3 FishSize { get; }

			public float FishHeight { get; }

			public float FishSpeed { get; }

			public FishSizes(string fishnamezdoid, Vector3 fishsize, float fishheight, float fishspeed)
			{
				//IL_0009: 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)
				FishNameZDOID = fishnamezdoid;
				FishSize = fishsize;
				FishHeight = fishheight;
				FishSpeed = fishspeed;
			}
		}

		public static Texture2D LoadPng(Stream fileStream)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			Texture2D val = null;
			if (fileStream != null)
			{
				using MemoryStream memoryStream = new MemoryStream();
				fileStream.CopyTo(memoryStream);
				val = new Texture2D(2, 2);
				ImageConversion.LoadImage(val, memoryStream.ToArray());
			}
			return val;
		}
	}
	public class MoreSkills_Instances
	{
		[HarmonyPatch(typeof(Vagon), "UpdateMass")]
		public static class SI_Vagon
		{
			public static void Postfix(ref Vagon __instance)
			{
				if ((Object)(object)__instance != (Object)null)
				{
					_cart = __instance;
				}
			}
		}

		[HarmonyPatch]
		public static class SI_Player
		{
			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			public static void Postfix(ref Player __instance)
			{
				if ((Object)(object)__instance != (Object)null)
				{
					_player = __instance;
				}
			}
		}

		[HarmonyPatch(typeof(Inventory), "UpdateTotalWeight")]
		public static class SI_Inventory
		{
			public static void Postfix(ref Inventory __instance)
			{
				if (__instance != null)
				{
					_inventory = __instance;
				}
			}
		}

		[HarmonyPatch(typeof(ItemDrop), "SlowUpdate")]
		public static class SI_ItemDrop
		{
			public static void Postfix(ref ItemDrop __instance)
			{
				if ((Object)(object)__instance != (Object)null)
				{
					_itemDrop = __instance;
				}
			}
		}

		[HarmonyPatch(typeof(ObjectDB), "Awake")]
		public static class SI_ObjectDB
		{
			public static void Postfix(ref ObjectDB __instance)
			{
				if ((Object)(object)__instance != (Object)null)
				{
					_objectDB = __instance;
				}
			}
		}

		[HarmonyPatch(typeof(InventoryGui), "Awake")]
		public static class SI_InventoryGui
		{
			public static void Postfix(ref InventoryGui __instance)
			{
				if ((Object)(object)__instance != (Object)null)
				{
					_inventoryGui = __instance;
				}
			}
		}

		[HarmonyPatch(typeof(ZNetView), "Awake")]
		public static class SI_ZNetView
		{
			public static void Postfix(ref ZNetView __instance)
			{
				if ((Object)(object)__instance != (Object)null)
				{
					_zNetView = __instance;
				}
			}
		}

		[HarmonyPatch(typeof(MineRock5), "Awake")]
		public static class SI_MineRock5
		{
			public static void Postfix(ref MineRock5 __instance)
			{
				_mineRock5 = __instance;
			}
		}

		[HarmonyPatch(typeof(Character), "Damage")]
		public static class SI_CDamage
		{
			public static void Postfix(ref Character __instance, HitData hit)
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_player != (Object)null)
				{
					_CDamage = __instance;
					_CDAttacker = hit.m_attacker;
				}
			}
		}

		[HarmonyPatch(typeof(Destructible), "Damage")]
		public static class Si_DDamage
		{
			public static void Postfix(ref Destructible __instance, HitData hit)
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_player != (Object)null)
				{
					_DDamage = __instance;
					_DDAttacker = hit.m_attacker;
				}
			}
		}

		[HarmonyPatch(typeof(MineRock5), "Damage")]
		public static class SI_MR5Damage
		{
			public static void Postfix(ref MineRock5 __instance, HitData hit)
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_player != (Object)null)
				{
					_MR5Damage = __instance;
					_MR5DAttacker = hit.m_attacker;
				}
			}
		}

		[HarmonyPatch(typeof(TreeBase), "Damage")]
		public static class SI_TBDamage
		{
			public static void Postfix(ref TreeBase __instance, HitData hit)
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_player != (Object)null)
				{
					_TBDamage = __instance;
					_TBDAttacker = hit.m_attacker;
				}
			}
		}

		[HarmonyPatch(typeof(TreeLog), "Damage")]
		public static class SI_TLDamage
		{
			public static void Postfix(ref TreeLog __instance, HitData hit)
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_player != (Object)null)
				{
					_TLDamage = __instance;
					_TLDAttacker = hit.m_attacker;
				}
			}
		}

		public static Player _player;

		public static ObjectDB _objectDB;

		public static InventoryGui _inventoryGui;

		public static ZDOID _CDAttacker;

		public static ZDOID _DDAttacker;

		public static ZDOID _MR5DAttacker;

		public static ZDOID _TBDAttacker;

		public static ZDOID _TLDAttacker;

		private static Vagon _cart;

		private static Inventory _inventory;

		private static ItemDrop _itemDrop;

		private static ZNetView _zNetView;

		private static MineRock5 _mineRock5;

		private static Character _CDamage;

		private static Destructible _DDamage;

		private static MineRock5 _MR5Damage;

		private static TreeBase _TBDamage;

		private static TreeLog _TLDamage;
	}
	public class Utilities
	{
		internal static void TextAreaDrawer(ConfigEntryBase entry)
		{
			GUILayout.ExpandHeight(true);
			GUILayout.ExpandWidth(true);
			entry.BoxedValue = GUILayout.TextArea((string)entry.BoxedValue, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.ExpandWidth(true),
				GUILayout.ExpandHeight(true)
			});
		}

		public static void Log(string message, [CallerMemberName] string method = null)
		{
			Debug.Log((object)("[MoreSkills].[" + (method ?? "null") + "] " + message));
		}

		public static void LogWarning(string message, [CallerMemberName] string method = null)
		{
			Debug.LogWarning((object)("[MoreSkills].[" + (method ?? "null") + "] " + message));
		}

		public static void LogError(string message, [CallerMemberName] string method = null)
		{
			Debug.LogError((object)("[MoreSkills].[" + (method ?? "null") + "] " + message));
		}
	}
}
namespace MoreSkills.UI
{
	internal static class SkillIcons
	{
		public static Sprite VitalityIcon;

		public static Sprite StrengthIcon;

		public static Sprite SailingIcon;

		public static Sprite CraftingIcon;

		public static Sprite HuntingIcon;

		public static Sprite TamingIcon;

		public static Sprite FishingIcon;

		public static Sprite Load_VitalityIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.vitalityicon.png");
			Texture2D val = Helper.LoadPng(stream);
			VitalityIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return VitalityIcon;
		}

		public static Sprite Load_StrengthIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.strengthicon.png");
			Texture2D val = Helper.LoadPng(stream);
			StrengthIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return StrengthIcon;
		}

		public static Sprite Load_SailingIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.sailingicon.png");
			Texture2D val = Helper.LoadPng(stream);
			SailingIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return SailingIcon;
		}

		public static Sprite Load_CraftingIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.craftingicon.png");
			Texture2D val = Helper.LoadPng(stream);
			CraftingIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return CraftingIcon;
		}

		public static Sprite Load_HuntingIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.huntingicon.png");
			Texture2D val = Helper.LoadPng(stream);
			HuntingIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return HuntingIcon;
		}

		public static Sprite Load_TamingIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.tamingicon.png");
			Texture2D val = Helper.LoadPng(stream);
			TamingIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return TamingIcon;
		}

		public static Sprite Load_FishingIcon()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Stream stream = EmbeddedAssets.LoadAssets("Assets.Icons.fishingicon.png");
			Texture2D val = Helper.LoadPng(stream);
			FishingIcon = Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), Vector2.zero);
			stream.Dispose();
			return FishingIcon;
		}
	}
}
namespace MoreSkills.ModSkills
{
	internal class MoreSkills_DropsRocksWood
	{
		[HarmonyPatch(typeof(DropTable), "GetDropList", new Type[] { typeof(int) })]
		public static class DropTable_DropsRocksWood
		{
			private class DropObjectContainer
			{
				public int NumItems { get; set; }

				public DropObjectAssocinatedSkillType SkillType { get; set; }

				public GameObject DropItem { get; set; }

				public DropObjectContainer(int numItems, DropObjectAssocinatedSkillType skillType, GameObject dropItem)
				{
					NumItems = numItems;
					SkillType = skillType;
					DropItem = dropItem;
				}
			}

			private enum DropObjectAssocinatedSkillType
			{
				Woodworking,
				Pickaxe,
				Hunting
			}

			public static void Postfix(ref DropTable __instance, ref List<GameObject> __result, int amount)
			{
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0074: Unknown result type (might be due to invalid IL or missing references)
				//IL_0080: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || __result == null || __result.Count <= 0 || (!MoreSkills_OverhaulsConfig.EnableWoodCuttingDropMod.Value && !MoreSkills_OverhaulsConfig.EnablePickaxeDropMod.Value && !MoreSkills_HuntingConfig.EnableHuntingSkill.Value) || (!(MoreSkills_Instances._DDAttacker == ((Character)MoreSkills_Instances._player).GetZDOID()) && !(MoreSkills_Instances._MR5DAttacker == ((Character)MoreSkills_Instances._player).GetZDOID()) && !(MoreSkills_Instances._TBDAttacker == ((Character)MoreSkills_Instances._player).GetZDOID()) && !(MoreSkills_Instances._TLDAttacker == ((Character)MoreSkills_Instances._player).GetZDOID())))
				{
					return;
				}
				bool value = MoreSkills_OverhaulsConfig.EnableDetailedLogging.Value;
				if (value)
				{
					Utilities.Log("Starting DropsRocksWood.Postfix with " + __result.Count + " drops", "Postfix");
				}
				List<GameObject> list = new List<GameObject>();
				float num = 0f;
				float appliedStoneLootFactor = 0f;
				float num2 = 0f;
				if (useNewDropMethod)
				{
					string[] array = MoreSkills_OverhaulsConfig.WoodCuttingApplyForItems.Value.Split(commaSeparator, StringSplitOptions.RemoveEmptyEntries);
					string[] array2 = MoreSkills_OverhaulsConfig.PickaxeApplyForItems.Value.Split(commaSeparator, StringSplitOptions.RemoveEmptyEntries);
					string[] array3 = MoreSkills_OverhaulsConfig.HuntingApplyForItems.Value.Split(commaSeparator, StringSplitOptions.RemoveEmptyEntries);
					string[] collection = MoreSkills_OverhaulsConfig.IgnoreDropItemNames.Value.Split(commaSeparator, StringSplitOptions.RemoveEmptyEntries);
					HashSet<string> hashSet = new HashSet<string>(collection);
					string[] collection2 = MoreSkills_OverhaulsConfig.DontDropItemNames.Value.Split(commaSeparator, StringSplitOptions.RemoveEmptyEntries);
					HashSet<string> hashSet2 = new HashSet<string>(collection2);
					Dictionary<string, DropObjectContainer> dictionary = new Dictionary<string, DropObjectContainer>();
					string[] array4 = array;
					foreach (string text in array4)
					{
						if (!dictionary.ContainsKey(text))
						{
							dictionary.Add(text, new DropObjectContainer(0, DropObjectAssocinatedSkillType.Woodworking, null));
							continue;
						}
						Utilities.LogWarning("Key '" + text + "' already exists in '" + ((ConfigEntryBase)MoreSkills_OverhaulsConfig.WoodCuttingApplyForItems).Definition.Key + "' found in config 'MoreSkills.OverhaulsConfig.cfg'. Did you configure it twice?", "Postfix");
					}
					string[] array5 = array2;
					foreach (string text2 in array5)
					{
						if (!dictionary.ContainsKey(text2))
						{
							dictionary.Add(text2, new DropObjectContainer(0, DropObjectAssocinatedSkillType.Pickaxe, null));
							continue;
						}
						Utilities.LogWarning("Key '" + text2 + "' already exists in '" + ((ConfigEntryBase)MoreSkills_OverhaulsConfig.PickaxeApplyForItems).Definition.Key + "' found in config 'MoreSkills.OverhaulsConfig.cfg'. Did you configure it twice?", "Postfix");
					}
					string[] array6 = array3;
					foreach (string text3 in array6)
					{
						if (!dictionary.ContainsKey(text3))
						{
							dictionary.Add(text3, new DropObjectContainer(0, DropObjectAssocinatedSkillType.Hunting, null));
							continue;
						}
						Utilities.LogWarning("Key '" + text3 + "' already exists in '" + ((ConfigEntryBase)MoreSkills_OverhaulsConfig.HuntingApplyForItems).Definition.Key + "' found in config 'MoreSkills.OverhaulsConfig.cfg'. Did you configure it twice?", "Postfix");
					}
					foreach (GameObject item23 in __result)
					{
						if ((Object)(object)item23 == (Object)null)
						{
							continue;
						}
						if (dictionary.TryGetValue(((Object)item23).name, out var value2))
						{
							if ((Object)(object)value2.DropItem == (Object)null)
							{
								value2.DropItem = item23;
							}
							value2.NumItems++;
							if (value)
							{
								Utilities.Log("Added drop '" + ((Object)item23).name + "' to dropObjects map (skillType=" + value2.SkillType.ToString() + ", NumItems=" + value2.NumItems + ")", "Postfix");
							}
						}
						else if (hashSet2.Contains(((Object)item23).name))
						{
							if (value)
							{
								Utilities.LogWarning("Not dropping Drop '" + ((Object)item23).name + "' because it was found in DontDropItemNames.", "Postfix");
							}
						}
						else
						{
							if (!hashSet.Contains(((Object)item23).name))
							{
								Utilities.LogWarning("Unknown Drop '" + ((Object)item23).name + "'. Ignoring skill and just dropping item.", "Postfix");
							}
							list.Add(item23);
						}
					}
					num = GetAppliedWoodLootFactor(num);
					appliedStoneLootFactor = GetAppliedStoneLootFactor(appliedStoneLootFactor);
					num2 = GetAppliedHuntingLootFactor(num2);
					foreach (string key in dictionary.Keys)
					{
						if (dictionary.TryGetValue(key, out var value3) && value3.NumItems > 0 && (Object)(object)value3.DropItem != (Object)null)
						{
							int num3 = 0;
							switch (value3.SkillType)
							{
							case DropObjectAssocinatedSkillType.Woodworking:
								num3 = (MoreSkills_OverhaulsConfig.EnableWoodCuttingDropMod.Value ? ((int)((float)value3.NumItems + (float)value3.NumItems * num)) : value3.NumItems);
								break;
							case DropObjectAssocinatedSkillType.Pickaxe:
								num3 = (MoreSkills_OverhaulsConfig.EnablePickaxeDropMod.Value ? ((int)((float)value3.NumItems + (float)value3.NumItems * appliedStoneLootFactor)) : value3.NumItems);
								break;
							case DropObjectAssocinatedSkillType.Hunting:
								num3 = (MoreSkills_HuntingConfig.EnableHuntingSkill.Value ? ((int)((float)value3.NumItems + (float)value3.NumItems * num2)) : value3.NumItems);
								break;
							default:
								Utilities.LogWarning("Unknown dropContainer Skilltype '" + value3.SkillType.ToString() + "'", "Postfix");
								break;
							}
							if (value)
							{
								Utilities.Log("Dropping " + num3 + " " + ((Object)value3.DropItem).name + " (original drops: " + value3.NumItems + ")", "Postfix");
							}
							for (int l = 0; l < num3; l++)
							{
								list.Add(value3.DropItem);
							}
						}
					}
				}
				else
				{
					float num4 = 0f;
					GameObject item = null;
					float num5 = 0f;
					GameObject item2 = null;
					float num6 = 0f;
					GameObject item3 = null;
					float num7 = 0f;
					GameObject item4 = null;
					float num8 = 0f;
					GameObject item5 = null;
					float num9 = 0f;
					GameObject item6 = null;
					float num10 = 0f;
					GameObject item7 = null;
					float num11 = 0f;
					GameObject item8 = null;
					float num12 = 0f;
					GameObject item9 = null;
					float num13 = 0f;
					GameObject item10 = null;
					float num14 = 0f;
					GameObject item11 = null;
					float num15 = 0f;
					GameObject item12 = null;
					float num16 = 0f;
					GameObject item13 = null;
					float num17 = 0f;
					GameObject item14 = null;
					float num18 = 0f;
					GameObject item15 = null;
					float num19 = 0f;
					GameObject item16 = null;
					float num20 = 0f;
					GameObject item17 = null;
					float num21 = 0f;
					GameObject item18 = null;
					float num22 = 0f;
					GameObject item19 = null;
					float num23 = 0f;
					GameObject item20 = null;
					float num24 = 0f;
					GameObject item21 = null;
					float num25 = 0f;
					GameObject item22 = null;
					foreach (GameObject item24 in __result)
					{
						if (!((Object)(object)item24 == (Object)null))
						{
							if (((Object)item24).name == "BeechSeeds")
							{
								num4 += 1f;
								item = item24;
							}
							else if (((Object)item24).name == "BirchCone")
							{
								num12 += 1f;
								item9 = item24;
							}
							else if (((Object)item24).name == "OakSeeds")
							{
								num13 += 1f;
								item10 = item24;
							}
							else if (((Object)item24).name == "Acorn")
							{
								num14 += 1f;
								item11 = item24;
							}
							else if (((Object)item24).name == "ElderBark")
							{
								num5 += 1f;
								item2 = item24;
							}
							else if (((Object)item24).name == "FineWood")
							{
								num6 += 1f;
								item3 = item24;
							}
							else if (((Object)item24).name == "FirCone")
							{
								num7 += 1f;
								item4 = item24;
							}
							else if (((Object)item24).name == "PineCone")
							{
								num8 += 1f;
								item5 = item24;
							}
							else if (((Object)item24).name == "Resin")
							{
								num9 += 1f;
								item6 = item24;
							}
							else if (((Object)item24).name == "RoundLog")
							{
								num10 += 1f;
								item7 = item24;
							}
							else if (((Object)item24).name == "Wood")
							{
								num11 += 1f;
								item8 = item24;
							}
							else if (((Object)item24).name == "Chitin")
							{
								num15 += 1f;
								item12 = item24;
							}
							else if (((Object)item24).name == "CopperOre")
							{
								num16 += 1f;
								item13 = item24;
							}
							else if (((Object)item24).name == "IronScrap")
							{
								num17 += 1f;
								item14 = item24;
							}
							else if (((Object)item24).name == "Obsidian")
							{
								num18 += 1f;
								item15 = item24;
							}
							else if (((Object)item24).name == "SilverOre")
							{
								num19 += 1f;
								item16 = item24;
							}
							else if (((Object)item24).name == "TinOre")
							{
								num21 += 1f;
								item18 = item24;
							}
							else if (((Object)item24).name == "Stone")
							{
								num20 += 1f;
								item17 = item24;
							}
							else if (((Object)item24).name == "Feathers")
							{
								num22 += 1f;
								item19 = item24;
							}
							else if (((Object)item24).name == "Guck")
							{
								num23 += 1f;
								item20 = item24;
							}
							else if (((Object)item24).name == "LeatherScraps")
							{
								num24 += 1f;
								item21 = item24;
							}
							else if (((Object)item24).name == "WitheredBone")
							{
								num25 += 1f;
								item22 = item24;
							}
							else
							{
								Utilities.LogWarning("Report Missing/Unknown Drop: '" + ((Object)item24).name + "'", "Postfix");
								list.Add(item24);
							}
						}
					}
					if (MoreSkills_OverhaulsConfig.EnableWoodCuttingDropMod.Value)
					{
						num = GetAppliedWoodLootFactor(num);
						for (int m = 0; m < (int)(num4 + num4 * num); m++)
						{
							list.Add(item);
						}
						for (int n = 0; n < (int)(num12 + num12 * num); n++)
						{
							list.Add(item9);
						}
						for (int num26 = 0; num26 < (int)(num13 + num13 * num); num26++)
						{
							list.Add(item10);
						}
						for (int num27 = 0; num27 < (int)(num14 + num14 * num); num27++)
						{
							list.Add(item11);
						}
						for (int num28 = 0; num28 < (int)(num5 + num5 * num); num28++)
						{
							list.Add(item2);
						}
						for (int num29 = 0; num29 < (int)(num6 + num6 * num); num29++)
						{
							list.Add(item3);
						}
						for (int num30 = 0; num30 < (int)(num7 + num7 * num); num30++)
						{
							list.Add(item4);
						}
						for (int num31 = 0; num31 < (int)(num8 + num8 * num); num31++)
						{
							list.Add(item5);
						}
						for (int num32 = 0; num32 < (int)(num9 + num9 * num); num32++)
						{
							list.Add(item6);
						}
						for (int num33 = 0; num33 < (int)(num10 + num10 * num); num33++)
						{
							list.Add(item7);
						}
						for (int num34 = 0; num34 < (int)(num11 + num11 * num); num34++)
						{
							list.Add(item8);
						}
					}
					else
					{
						for (int num35 = 0; num35 < (int)num4; num35++)
						{
							list.Add(item);
						}
						for (int num36 = 0; num36 < (int)num12; num36++)
						{
							list.Add(item9);
						}
						for (int num37 = 0; num37 < (int)num13; num37++)
						{
							list.Add(item10);
						}
						for (int num38 = 0; num38 < (int)num14; num38++)
						{
							list.Add(item11);
						}
						for (int num39 = 0; num39 < (int)num5; num39++)
						{
							list.Add(item2);
						}
						for (int num40 = 0; num40 < (int)num6; num40++)
						{
							list.Add(item3);
						}
						for (int num41 = 0; num41 < (int)num7; num41++)
						{
							list.Add(item4);
						}
						for (int num42 = 0; num42 < (int)num8; num42++)
						{
							list.Add(item5);
						}
						for (int num43 = 0; num43 < (int)num9; num43++)
						{
							list.Add(item6);
						}
						for (int num44 = 0; num44 < (int)num10; num44++)
						{
							list.Add(item7);
						}
						for (int num45 = 0; num45 < (int)num11; num45++)
						{
							list.Add(item8);
						}
					}
					if (MoreSkills_OverhaulsConfig.EnablePickaxeDropMod.Value)
					{
						appliedStoneLootFactor = GetAppliedStoneLootFactor(appliedStoneLootFactor);
						for (int num46 = 0; num46 < (int)(num15 + num15 * appliedStoneLootFactor); num46++)
						{
							list.Add(item12);
						}
						for (int num47 = 0; num47 < (int)(num16 + num16 * appliedStoneLootFactor); num47++)
						{
							list.Add(item13);
						}
						for (int num48 = 0; num48 < (int)(num17 + num17 * appliedStoneLootFactor); num48++)
						{
							list.Add(item14);
						}
						for (int num49 = 0; num49 < (int)(num18 + num18 * appliedStoneLootFactor); num49++)
						{
							list.Add(item15);
						}
						for (int num50 = 0; num50 < (int)(num19 + num19 * appliedStoneLootFactor); num50++)
						{
							list.Add(item16);
						}
						for (int num51 = 0; num51 < (int)(num20 + num20 * appliedStoneLootFactor); num51++)
						{
							list.Add(item17);
						}
						for (int num52 = 0; num52 < (int)(num21 + num21 * appliedStoneLootFactor); num52++)
						{
							list.Add(item18);
						}
					}
					else
					{
						for (int num53 = 0; num53 < (int)num15; num53++)
						{
							list.Add(item12);
						}
						for (int num54 = 0; num54 < (int)num16; num54++)
						{
							list.Add(item13);
						}
						for (int num55 = 0; num55 < (int)num17; num55++)
						{
							list.Add(item14);
						}
						for (int num56 = 0; num56 < (int)num18; num56++)
						{
							list.Add(item15);
						}
						for (int num57 = 0; num57 < (int)num19; num57++)
						{
							list.Add(item16);
						}
						for (int num58 = 0; num58 < (int)num20; num58++)
						{
							list.Add(item17);
						}
						for (int num59 = 0; num59 < (int)num21; num59++)
						{
							list.Add(item18);
						}
					}
					if (MoreSkills_HuntingConfig.EnableHuntingSkill.Value)
					{
						appliedStoneLootFactor = GetAppliedHuntingLootFactor(num);
						for (int num60 = 0; num60 < (int)(num22 + num22 * num2); num60++)
						{
							list.Add(item19);
						}
						for (int num61 = 0; num61 < (int)(num23 + num23 * num2); num61++)
						{
							list.Add(item20);
						}
						for (int num62 = 0; num62 < (int)(num24 + num24 * num2); num62++)
						{
							list.Add(item21);
						}
						for (int num63 = 0; num63 < (int)(num25 + num25 * num2); num63++)
						{
							list.Add(item22);
						}
					}
					else
					{
						for (int num64 = 0; num64 < (int)num22; num64++)
						{
							list.Add(item19);
						}
						for (int num65 = 0; num65 < (int)num23; num65++)
						{
							list.Add(item20);
						}
						for (int num66 = 0; num66 < (int)num24; num66++)
						{
							list.Add(item21);
						}
						for (int num67 = 0; num67 < (int)num25; num67++)
						{
							list.Add(item22);
						}
					}
				}
				__result = list;
				if (!value)
				{
					return;
				}
				string text4 = "";
				foreach (GameObject item25 in __result)
				{
					text4 = text4 + "'" + ((Object)item25).name + "',";
				}
				Utilities.Log("Returning Drops: " + text4, "Postfix");
			}
		}

		private static readonly bool useNewDropMethod = true;

		private static readonly char[] commaSeparator = new char[1] { ',' };

		private static float GetAppliedWoodLootFactor(float appliedWoodLootFactor)
		{
			if (appliedWoodLootFactor == 0f)
			{
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)13);
				appliedWoodLootFactor = (MoreSkills_OverhaulsConfig.WoodCuttingMultiplier.Value - 1f) * skillFactor;
			}
			return appliedWoodLootFactor;
		}

		private static float GetAppliedStoneLootFactor(float appliedStoneLootFactor)
		{
			if (appliedStoneLootFactor == 0f)
			{
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)12);
				appliedStoneLootFactor = (MoreSkills_OverhaulsConfig.PickaxeMultiplier.Value - 1f) * skillFactor;
			}
			return appliedStoneLootFactor;
		}

		private static float GetAppliedHuntingLootFactor(float appliedHuntingLootFactor)
		{
			if (appliedHuntingLootFactor == 0f)
			{
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)704);
				appliedHuntingLootFactor = (MoreSkills_HuntingConfig.HuntingDropMultiplier.Value - 1f) * skillFactor;
			}
			return appliedHuntingLootFactor;
		}
	}
	internal class MoreSkills_Crafting
	{
		[HarmonyPatch(typeof(InventoryGui), "Show")]
		public static class CraftingSkill_InventoryShow
		{
			public static void Postfix()
			{
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_CraftingConfig.EnableCraftingSkill.Value)
				{
					return;
				}
				IGUI = true;
				if (!Saved)
				{
					foreach (Recipe recipe in MoreSkills_Instances._objectDB.m_recipes)
					{
						Requirement[] resources = recipe.m_resources;
						foreach (Requirement val in resources)
						{
							if (!((Object)(object)recipe == (Object)null) && !((Object)(object)recipe.m_item == (Object)null))
							{
								string objnumitem2 = string.Concat(((Object)recipe.m_item).name + ":" + recipe.m_amount + ":" + ((Object)val.m_resItem).name);
								float objnum = recipe.m_amount;
								float itemcnum = val.m_amount;
								float itemunum = val.m_amountPerLevel;
								if (cSaves.Find((Helper.CraftingSaves csaves) => csaves.ObjNumItem == objnumitem2).ObjNumItem != objnumitem2)
								{
									cSaves.Add(new Helper.CraftingSaves(objnumitem2, objnum, itemcnum, itemunum));
								}
							}
						}
					}
					Saved = true;
					Utilities.Log("Saved All Objects in DataBase", "Postfix");
				}
				bool value = MoreSkills_CraftingConfig.EnableDetailedLogging.Value;
				float num = CalculateAppliedItemMultiplier(value, "Show (Crafting)");
				foreach (Recipe recipe2 in MoreSkills_Instances._objectDB.m_recipes)
				{
					Requirement[] resources2 = recipe2.m_resources;
					foreach (Requirement val2 in resources2)
					{
						if ((Object)(object)recipe2 == (Object)null || (Object)(object)recipe2.m_item == (Object)null)
						{
							continue;
						}
						string objnumitem = string.Concat(((Object)recipe2.m_item).name + ":" + recipe2.m_amount + ":" + ((Object)val2.m_resItem).name);
						Helper.CraftingSaves craftingSaves = cSaves.Find((Helper.CraftingSaves csaves) => csaves.ObjNumItem == objnumitem);
						if (craftingSaves.ObjNumItem == objnumitem)
						{
							if (val2.m_amount >= 1)
							{
								val2.m_amount = Mathf.RoundToInt(craftingSaves.ItemCNum * num);
								if (val2.m_amount < 1)
								{
									val2.m_amount = 1;
								}
							}
							if (val2.m_amountPerLevel >= 1)
							{
								val2.m_amountPerLevel = Mathf.RoundToInt(craftingSaves.ItemUNum * num);
								if (val2.m_amountPerLevel < 1)
								{
									val2.m_amountPerLevel = 1;
								}
							}
							if (value)
							{
								Utilities.Log("Show (Crafting): Handling ObjNumItem '" + craftingSaves.ObjNumItem + "': old amount: " + craftingSaves.ItemCNum + " new amount: " + val2.m_amount + " (amountPerLevel: " + val2.m_amountPerLevel + " ) after applying item multiplier: " + num, "Postfix");
							}
						}
						else
						{
							Utilities.LogWarning("Show (Crafting): Stored objnumitem '" + craftingSaves.ObjNumItem + "' does not match expected objnumitm '" + objnumitem + "'", "Postfix");
						}
					}
				}
			}
		}

		[HarmonyPatch(typeof(InventoryGui), "DoCrafting")]
		public static class CraftingSkillMod_SkillIncrease
		{
			public static void Postfix()
			{
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_CraftingConfig.EnableCraftingSkill.Value)
				{
					return;
				}
				bool value = MoreSkills_CraftingConfig.EnableDetailedLogging.Value;
				float num = CalculateAppliedItemMultiplier(value, "DoCrafting");
				foreach (Recipe recipe in MoreSkills_Instances._objectDB.m_recipes)
				{
					Requirement[] resources = recipe.m_resources;
					foreach (Requirement val in resources)
					{
						if ((Object)(object)recipe == (Object)null || (Object)(object)recipe.m_item == (Object)null)
						{
							continue;
						}
						string objnumitem = string.Concat(((Object)recipe.m_item).name + ":" + recipe.m_amount + ":" + ((Object)val.m_resItem).name);
						Helper.CraftingSaves craftingSaves = cSaves.Find((Helper.CraftingSaves csaves) => csaves.ObjNumItem == objnumitem);
						if (craftingSaves.ObjNumItem == objnumitem)
						{
							if (val.m_amount >= 1)
							{
								val.m_amount = Mathf.RoundToInt(craftingSaves.ItemCNum * num);
								if (val.m_amount < 1)
								{
									val.m_amount = 1;
								}
							}
							if (val.m_amountPerLevel >= 1)
							{
								val.m_amountPerLevel = Mathf.RoundToInt(craftingSaves.ItemUNum * num);
								if (val.m_amountPerLevel < 1)
								{
									val.m_amountPerLevel = 1;
								}
							}
							if (value)
							{
								Utilities.Log("DoCrafting: Handling ObjNumItem '" + craftingSaves.ObjNumItem + "': old amount: " + craftingSaves.ItemCNum + " new amount: " + val.m_amount + " (amountPerLevel: " + val.m_amountPerLevel + " ) after applying item multiplier: " + num, "Postfix");
							}
						}
						else
						{
							Utilities.LogWarning("DoCrafting: Stored objnumitem '" + craftingSaves.ObjNumItem + "' does not match expected objnumitm '" + objnumitem + "'", "Postfix");
						}
					}
				}
				int num2 = 0;
				foreach (Recipe recipe2 in MoreSkills_Instances._objectDB.m_recipes)
				{
					if ((Object)(object)recipe2 == (Object)null || (Object)(object)recipe2.m_item == (Object)null || !((Object)(object)recipe2.m_item == (Object)(object)((RecipeDataPair)(ref MoreSkills_Instances._inventoryGui.m_selectedRecipe)).Recipe.m_item))
					{
						continue;
					}
					Requirement[] resources2 = recipe2.m_resources;
					foreach (Requirement val2 in resources2)
					{
						if (val2 != null && !((Object)(object)val2.m_resItem == (Object)null))
						{
							CraftSkillInc += val2.m_amount;
							CraftSkillInc += val2.m_amountPerLevel;
							num2++;
						}
					}
				}
				((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)703, CraftSkillInc * MoreSkills_CraftingConfig.CraftingSkillIncreaseMultiplier.Value / 10f);
				Utilities.Log("Granted Crafting EXP: " + CraftSkillInc * MoreSkills_CraftingConfig.CraftingSkillIncreaseMultiplier.Value + " found Recipe maches: " + num2, "Postfix");
				CraftSkillInc = 0f;
			}
		}

		public static bool IGUI;

		public static float CraftSkillInc;

		public static bool Saved;

		public static List<Helper.CraftingSaves> cSaves = new List<Helper.CraftingSaves>();

		private static float CalculateAppliedItemMultiplier(bool advancedLogging, string caltculatedAt)
		{
			float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)703);
			float num = (float)MoreSkills_CraftingConfig.CraftingMiddleLevel.Value / 100f;
			if (num < 0f)
			{
				num = 0f;
			}
			else if (num > 1f)
			{
				num = 1f;
			}
			float result;
			if (skillFactor < num)
			{
				float value = MoreSkills_CraftingConfig.CraftingLevelMultiplier.Value;
				result = value - skillFactor * (1f / num) * (value - 1f);
				if (advancedLogging)
				{
					Utilities.Log(caltculatedAt + ": formula: appliedItemMultiplier = CraftingLevelMultiplier - ((SkillLevel * (1 / CraftingMiddleLevel)) * (CraftingLevelMultiplier - 1)) where configured middle (0-100) was divided by 100 to get 0.0-1.0", "CalculateAppliedItemMultiplier");
				}
				Utilities.Log(caltculatedAt + ": formula with values: " + result + " = " + value + " - ((" + skillFactor + " * (1 / " + num + ")) * (" + value + " - 1))", "CalculateAppliedItemMultiplier");
				Utilities.Log(caltculatedAt + ": calculated appliedItemMultiplier " + result + " using crafing skill level " + skillFactor + " and multiplier " + value + " ) because skill is below " + num, "CalculateAppliedItemMultiplier");
			}
			else
			{
				float value2 = MoreSkills_CraftingConfig.CraftingLevelDivider.Value;
				float num2 = 1f + (skillFactor - num) * (1f / (1f - num)) * (value2 - 1f);
				result = 1f / num2;
				if (advancedLogging)
				{
					Utilities.Log(caltculatedAt + ": formula: appliedItemDivider = 1 + ((SkillLevel - CraftingMiddleLevel) * (1 / (1 - CraftingMiddleLevel)) * (CraftingLevelDivider - 1)) where configured middle (0-100) was divided by 100 to get 0.0-1.0", "CalculateAppliedItemMultiplier");
				}
				Utilities.Log(caltculatedAt + ": formula with values: " + num2 + " = 1 + ((" + skillFactor + " - " + num + ") * (1 / (1 - " + num + ")) * (" + value2 + " - 1))", "CalculateAppliedItemMultiplier");
				Utilities.Log(caltculatedAt + ": calculated appliedItemMultiplier " + result + " (based on '1 / appliedItemDivider': " + num2 + ") using crafing skill level " + skillFactor + " and divider " + value2 + " because skill is aboveequal " + num, "CalculateAppliedItemMultiplier");
			}
			return result;
		}
	}
	internal class MoreSkills_Sailing
	{
		[HarmonyPatch(typeof(Ship), "GetSailForce")]
		public static class Sailing_Skill
		{
			public static bool SittingInBoat;

			public static float Captain;

			public static float SittingCrew;

			public static float StandingCrew;

			public static void Postfix()
			{
				//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_025f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0264: Unknown result type (might be due to invalid IL or missing references)
				//IL_059a: Unknown result type (might be due to invalid IL or missing references)
				//IL_059f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0504: Unknown result type (might be due to invalid IL or missing references)
				//IL_0509: Unknown result type (might be due to invalid IL or missing references)
				//IL_0289: Unknown result type (might be due to invalid IL or missing references)
				//IL_028e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0437: Unknown result type (might be due to invalid IL or missing references)
				//IL_043c: Unknown result type (might be due to invalid IL or missing references)
				//IL_05d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_05da: Unknown result type (might be due to invalid IL or missing references)
				//IL_053f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0544: Unknown result type (might be due to invalid IL or missing references)
				//IL_0472: Unknown result type (might be due to invalid IL or missing references)
				//IL_0477: Unknown result type (might be due to invalid IL or missing references)
				//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
				//IL_0324: Unknown result type (might be due to invalid IL or missing references)
				//IL_0329: Unknown result type (might be due to invalid IL or missing references)
				//IL_038a: Unknown result type (might be due to invalid IL or missing references)
				//IL_038f: Unknown result type (might be due to invalid IL or missing references)
				//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
				//IL_03b9: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_SailingConfig.EnableSailingMod.Value)
				{
					return;
				}
				float num2;
				float num3;
				float num5;
				float backwardForce;
				float num6;
				Speed speedSetting;
				if ((Object)(object)MoreSkills_Instances._player.GetControlledShip() != (Object)null)
				{
					float num = Mathf.Floor(((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)702) * 100f + 1E-06f);
					num2 = (MoreSkills_SailingConfig.BaseMaxBForce.Value - MoreSkills_SailingConfig.BaseBForce.Value) / 100f * num;
					num3 = (MoreSkills_SailingConfig.BaseMaxRSpeed.Value - MoreSkills_SailingConfig.BaseRSpeed.Value) / 100f * num;
					float num4 = (MoreSkills_SailingConfig.BaseMaxSForce.Value - MoreSkills_SailingConfig.BaseSForce.Value) / 100f * num;
					num5 = (MoreSkills_SailingConfig.BaseMaxDSideways.Value - MoreSkills_SailingConfig.BaseDSideways.Value) / 100f * num;
					backwardForce = MoreSkills_Instances._player.GetControlledShip().m_backwardForce;
					float sailForceFactor = MoreSkills_Instances._player.GetControlledShip().m_sailForceFactor;
					num6 = MoreSkills_SailingConfig.BaseBForce.Value + num2 + MoreSkills_SailingConfig.CrewMembersBForceAdd.Value * num2 / 5f * (float)MoreSkills_Instances._player.GetControlledShip().m_players.Count;
					if (!MoreSkills_SailingConfig.EnableShipAcceleration.Value)
					{
						if (!MoreSkills_SailingConfig.EnableShipCrew.Value)
						{
							MoreSkills_Instances._player.GetControlledShip().m_backwardForce = MoreSkills_SailingConfig.BaseBForce.Value + num2;
						}
						else
						{
							MoreSkills_Instances._player.GetControlledShip().m_backwardForce = MoreSkills_SailingConfig.BaseBForce.Value + num2 + MoreSkills_SailingConfig.CrewMembersBForceAdd.Value * num2 / 5f * (float)MoreSkills_Instances._player.GetControlledShip().m_players.Count;
						}
						MoreSkills_Instances._player.GetControlledShip().m_sailForceFactor = MoreSkills_SailingConfig.BaseSForce.Value + num4;
					}
					else
					{
						speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
						if (((object)(Speed)(ref speedSetting)).ToString() == "Stop")
						{
							MoreSkills_Instances._player.GetControlledShip().m_sailForceFactor = 0.01f;
							MoreSkills_Instances._player.GetControlledShip().m_backwardForce = 0.01f;
						}
						else
						{
							if (!(sailForceFactor < MoreSkills_SailingConfig.BaseSForce.Value + num4))
							{
								goto IL_02d3;
							}
							speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
							if (!(((object)(Speed)(ref speedSetting)).ToString() == "Half"))
							{
								speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
								if (!(((object)(Speed)(ref speedSetting)).ToString() == "Full"))
								{
									goto IL_02d3;
								}
							}
							Ship controlledShip = MoreSkills_Instances._player.GetControlledShip();
							controlledShip.m_sailForceFactor += 0.0001f;
						}
					}
					goto IL_03fa;
				}
				if (!((Object)(object)((Character)MoreSkills_Instances._player).GetStandingOnShip() != (Object)null) && !SittingInBoat)
				{
					return;
				}
				Vector3 velocity;
				if (((Character)MoreSkills_Instances._player).IsAttached())
				{
					SittingInBoat = true;
					velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
					if (((Vector3)(ref velocity)).magnitude >= 1f)
					{
						if (SittingCrew < 0.5f)
						{
							float sittingCrew = SittingCrew;
							velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
							SittingCrew = sittingCrew + ((Vector3)(ref velocity)).magnitude / 8000f * MoreSkills_SailingConfig.SailingSkillIncreaseMultiplier.Value;
						}
						else
						{
							((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)702, SittingCrew);
							SittingCrew = 0f;
						}
					}
					return;
				}
				SittingInBoat = false;
				velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
				if (((Vector3)(ref velocity)).magnitude >= 1f)
				{
					if (StandingCrew < 0.5f)
					{
						float standingCrew = StandingCrew;
						velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
						StandingCrew = standingCrew + ((Vector3)(ref velocity)).magnitude / 16000f * MoreSkills_SailingConfig.SailingSkillIncreaseMultiplier.Value;
					}
					else
					{
						((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)702, StandingCrew);
						StandingCrew = 0f;
					}
				}
				return;
				IL_036e:
				if (backwardForce < num6 && MoreSkills_SailingConfig.EnableShipCrew.Value)
				{
					speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
					if (!(((object)(Speed)(ref speedSetting)).ToString() == "Slow"))
					{
						speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
						if (!(((object)(Speed)(ref speedSetting)).ToString() == "Back"))
						{
							goto IL_03fa;
						}
					}
					Ship controlledShip2 = MoreSkills_Instances._player.GetControlledShip();
					controlledShip2.m_backwardForce += 0.001f;
				}
				goto IL_03fa;
				IL_02d3:
				if (!(backwardForce < MoreSkills_SailingConfig.BaseBForce.Value + num2) || MoreSkills_SailingConfig.EnableShipCrew.Value)
				{
					goto IL_036e;
				}
				speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
				if (!(((object)(Speed)(ref speedSetting)).ToString() == "Slow"))
				{
					speedSetting = MoreSkills_Instances._player.GetControlledShip().GetSpeedSetting();
					if (!(((object)(Speed)(ref speedSetting)).ToString() == "Back"))
					{
						goto IL_036e;
					}
				}
				Ship controlledShip3 = MoreSkills_Instances._player.GetControlledShip();
				controlledShip3.m_backwardForce += 0.001f;
				goto IL_03fa;
				IL_03fa:
				MoreSkills_Instances._player.GetControlledShip().m_rudderSpeed = MoreSkills_SailingConfig.BaseRSpeed.Value + num3;
				MoreSkills_Instances._player.GetControlledShip().m_dampingSideway = MoreSkills_SailingConfig.BaseDSideways.Value + num5;
				velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
				if (((Vector3)(ref velocity)).magnitude >= 1f)
				{
					if (Captain < 0.5f)
					{
						float captain = Captain;
						velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
						Captain = captain + ((Vector3)(ref velocity)).magnitude / 4000f * MoreSkills_SailingConfig.SailingSkillIncreaseMultiplier.Value;
					}
					else
					{
						((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)702, Captain);
						Captain = 0f;
					}
				}
			}
		}
	}
	internal class MoreSkills_Vitality
	{
		[HarmonyPatch(typeof(Player), "SetMaxHealth")]
		public static class Vitality_ApplyBaseHealthMod
		{
			public static void Prefix(ref float health)
			{
				if ((Object)(object)MoreSkills_Instances._player != (Object)null && MoreSkills_VitalityConfig.EnableHealthMod.Value)
				{
					float num = Mathf.Floor(((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)701) * 100f + 1E-06f);
					float num2 = (MoreSkills_VitalityConfig.BaseMaxHealth.Value - MoreSkills_VitalityConfig.BaseHealth.Value) / 100f * num;
					health += MoreSkills_VitalityConfig.BaseHealth.Value + num2 - 25f;
				}
			}
		}

		[HarmonyPatch]
		public static class Vitality_HealthRegen
		{
			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			public static void Postfix()
			{
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_VitalityConfig.EnableHealthMod.Value || !(((Character)MoreSkills_Instances._player).GetHealth() < ((Character)MoreSkills_Instances._player).GetMaxHealth()))
				{
					return;
				}
				if (Damaged)
				{
					if (lastattackcounter > 1800)
					{
						Damaged = false;
					}
					else
					{
						lastattackcounter++;
					}
				}
				else if (healcounter > 600)
				{
					((Character)MoreSkills_Instances._player).Heal(((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)701), true);
					healcounter = 0;
				}
				else
				{
					healcounter++;
				}
			}
		}

		[HarmonyPatch(typeof(Player), "OnDamaged")]
		public static class Vitality_RaiseSkill
		{
			public static float IncVitality;

			public static void Postfix(ref HitData hit)
			{
				if ((Object)(object)MoreSkills_Instances._player != (Object)null && MoreSkills_VitalityConfig.EnableHealthMod.Value)
				{
					Damaged = true;
					healcounter = 0;
					lastattackcounter = 0;
					if (IncVitality < 0.1f)
					{
						IncVitality += hit.GetTotalDamage() / 10f * MoreSkills_VitalityConfig.VitalitySkillIncreaseMultiplier.Value;
						return;
					}
					((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)701, IncVitality);
					IncVitality = 0f;
				}
			}
		}

		public static int lastattackcounter;

		public static int healcounter;

		public static bool Damaged;
	}
	internal class MoreSkills_Strength
	{
		[HarmonyPatch]
		public static class RaiseSkill_Strength
		{
			public static float IncEncumbred;

			public static float IncHalfnRunning;

			public static float IncHalfnMoving;

			public static int count;

			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			public static void Postfix()
			{
				//IL_0121: Unknown result type (might be due to invalid IL or missing references)
				//IL_0126: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_StrengthConfig.EnableStrengthMod.Value)
				{
					return;
				}
				bool flag = ((Humanoid)MoreSkills_Instances._player).GetInventory().GetTotalWeight() > MoreSkills_Instances._player.GetMaxCarryWeight() / 2f;
				float magnitude = ((Vector3)(ref ((Character)MoreSkills_Instances._player).m_currentVel)).magnitude;
				bool flag2 = Mathf.Floor(magnitude) > 1f;
				float num = Mathf.Floor(((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)700) * 100f + 1E-06f);
				float num2 = (MoreSkills_StrengthConfig.BaseMaxWeight.Value - MoreSkills_StrengthConfig.BaseWeight.Value) / 100f * num;
				float num3 = num / ((((Humanoid)MoreSkills_Instances._player).GetInventory().GetTotalWeight() - MoreSkills_Instances._player.GetMaxCarryWeight()) * 50f) * MoreSkills_StrengthConfig.StrengthStaminaMultiplier.Value;
				if (MoreSkills_StrengthConfig.EnableWeightMod.Value)
				{
					MoreSkills_Instances._player.m_maxCarryWeight = MoreSkills_StrengthConfig.BaseWeight.Value + num2;
				}
				if (MoreSkills_StrengthConfig.EnableStrengthStaminaMod.Value)
				{
					if (((Character)MoreSkills_Instances._player).IsEncumbered())
					{
						Vector3 velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
						if (((Vector3)(ref velocity)).magnitude < 0.1f)
						{
							if (count > 200)
							{
								count++;
							}
							((Character)MoreSkills_Instances._player).AddStamina(num3);
							goto IL_0176;
						}
					}
					count = 0;
				}
				goto IL_0176;
				IL_0176:
				if (!(flag && flag2))
				{
					return;
				}
				if (((Character)MoreSkills_Instances._player).IsEncumbered())
				{
					if (IncEncumbred < 0.1f)
					{
						IncEncumbred += ((Humanoid)MoreSkills_Instances._player).GetInventory().GetTotalWeight() / 20000f * MoreSkills_StrengthConfig.StrengthSkillIncreaseMultiplier.Value;
						return;
					}
					((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)700, IncEncumbred);
					IncEncumbred = 0f;
				}
				else
				{
					if (!flag)
					{
						return;
					}
					if (((Character)MoreSkills_Instances._player).IsRunning())
					{
						if (IncHalfnRunning < 0.1f)
						{
							IncHalfnRunning += ((Humanoid)MoreSkills_Instances._player).GetInventory().GetTotalWeight() / 40000f * MoreSkills_StrengthConfig.StrengthSkillIncreaseMultiplier.Value;
							return;
						}
						((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)700, IncHalfnRunning);
						IncHalfnRunning = 0f;
					}
					else if (IncHalfnMoving < 0.1f)
					{
						IncHalfnMoving += ((Humanoid)MoreSkills_Instances._player).GetInventory().GetTotalWeight() / 60000f * MoreSkills_StrengthConfig.StrengthSkillIncreaseMultiplier.Value;
					}
					else
					{
						((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)700, IncHalfnMoving);
						IncHalfnMoving = 0f;
					}
				}
			}
		}
	}
	internal class MoreSkills_SwimMod
	{
		[HarmonyPatch]
		public static class Swim_SwimMod
		{
			public static int count;

			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			public static void Postfix()
			{
				//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
				if (!MoreSkills_OverhaulsConfig.EnableSwimMod.Value || !((Object)(object)MoreSkills_Instances._player != (Object)null))
				{
					return;
				}
				float num = (float)Math.Floor(((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)103) * 100f + 1E-06f);
				float num2 = (MoreSkills_OverhaulsConfig.BaseMaxSwimSpeed.Value - MoreSkills_OverhaulsConfig.BaseSwimSpeed.Value) / 100f * num;
				float num3 = num / 5000f * MoreSkills_OverhaulsConfig.SwimStaminaMultiplier.Value;
				if (MoreSkills_OverhaulsConfig.EnableSwimSpeedMod.Value)
				{
					((Character)MoreSkills_Instances._player).m_swimSpeed = MoreSkills_OverhaulsConfig.BaseSwimSpeed.Value + num2;
				}
				if (!MoreSkills_OverhaulsConfig.EnableSwimStaminaMod.Value)
				{
					return;
				}
				Character player = (Character)(object)MoreSkills_Instances._player;
				if (((Character)MoreSkills_Instances._player).IsSwimming())
				{
					Vector3 velocity = ((Character)MoreSkills_Instances._player).GetVelocity();
					if (((Vector3)(ref velocity)).magnitude < 0.6f)
					{
						if (count > 200)
						{
							count++;
						}
						((Character)MoreSkills_Instances._player).AddStamina(num3);
						return;
					}
				}
				count = 0;
			}
		}
	}
	internal class MoreSkills_CrouchMod
	{
		[HarmonyPatch]
		public static class Sneak_CrouchSpeedMod
		{
			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			public static void Postfix()
			{
				if (MoreSkills_OverhaulsConfig.EnableCrouchMod.Value && (Object)(object)MoreSkills_Instances._player != (Object)null)
				{
					if (((Character)MoreSkills_Instances._player).IsCrouching())
					{
						float num = (float)Math.Floor(((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)101) * 100f + 1E-06f);
						float num2 = (MoreSkills_OverhaulsConfig.BaseMaxCrouchSpeed.Value - MoreSkills_OverhaulsConfig.BaseCrouchSpeed.Value) / 100f * num;
						((Character)MoreSkills_Instances._player).m_crouchSpeed = MoreSkills_OverhaulsConfig.BaseCrouchSpeed.Value + num2;
					}
					else
					{
						((Character)MoreSkills_Instances._player).m_crouchSpeed = 2f;
					}
					if (((Character)MoreSkills_Instances._player).IsEncumbered())
					{
						((Character)MoreSkills_Instances._player).SetCrouch(false);
					}
				}
			}
		}
	}
}
namespace MoreSkills.ModSkills.Overhauls
{
	internal class MoreSkills_JumpMod
	{
		[HarmonyPatch]
		public static class TestJump
		{
			public static MethodBase TargetMethod()
			{
				return AccessTools.DeclaredMethod(typeof(Player), "UpdateStats", new Type[0], (Type[])null);
			}

			public static void Postfix(ref Character __instance)
			{
				//IL_0152: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_01db: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_021d: Unknown result type (might be due to invalid IL or missing references)
				//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_0201: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_OverhaulsConfig.EnableJumpMod.Value)
				{
					return;
				}
				if (MoreSkills_OverhaulsConfig.EnableHigherJump.Value)
				{
					if (MoreSkills_OverhaulsConfig.EnableHaveToShiftToHigherJump.Value)
					{
						if (Input.GetKey(MoreSkills_OverhaulsConfig.HigherJumpKey.Value))
						{
							((Character)MoreSkills_Instances._player).m_jumpForce = MoreSkills_OverhaulsConfig.BaseJumpForce.Value + (MoreSkills_OverhaulsConfig.BaseMaxJumpForce.Value - MoreSkills_OverhaulsConfig.BaseJumpForce.Value) * ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)100);
						}
						else
						{
							((Character)MoreSkills_Instances._player).m_jumpForce = MoreSkills_OverhaulsConfig.BaseJumpForce.Value;
						}
					}
					else if (!MoreSkills_OverhaulsConfig.EnableHaveToShiftToHigherJump.Value)
					{
						((Character)MoreSkills_Instances._player).m_jumpForce = MoreSkills_OverhaulsConfig.BaseJumpForce.Value + (MoreSkills_OverhaulsConfig.BaseMaxJumpForce.Value - MoreSkills_OverhaulsConfig.BaseJumpForce.Value) * ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)100);
					}
				}
				if (!MoreSkills_OverhaulsConfig.EnableRollOnFall.Value)
				{
					return;
				}
				float num = MoreSkills_OverhaulsConfig.BaseRollAltitude.Value + (MoreSkills_OverhaulsConfig.BaseMaxRollAltitude.Value - MoreSkills_OverhaulsConfig.BaseRollAltitude.Value) * ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)100);
				float num2 = Mathf.Max(0f, __instance.m_maxAirAltitude - ((Component)MoreSkills_Instances._player).transform.position.y);
				if (num2 > MoreSkills_OverhaulsConfig.BaseRollAltitude.Value && num2 < num)
				{
					inAir = true;
					onGround = false;
				}
				else if (num2 > 8f)
				{
					inAir = false;
				}
				if (!inAir || num2 != 0f)
				{
					return;
				}
				onGround = true;
				if (onGround)
				{
					Vector3 val = ((Character)MoreSkills_Instances._player).m_moveDir;
					if (((Vector3)(ref val)).magnitude < 0.1f)
					{
						val = ((Character)MoreSkills_Instances._player).m_lookDir;
						val.y = 0f;
						((Vector3)(ref val)).Normalize();
					}
					MoreSkills_Instances._player.Dodge(val);
					inAir = false;
				}
			}
		}

		[HarmonyPatch(typeof(Character), "Damage")]
		public static class TestDamage
		{
			public static void Prefix(ref Character __instance, ref HitData hit)
			{
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_OverhaulsConfig.EnableJumpMod.Value || !MoreSkills_OverhaulsConfig.EnableDecreaseFallDamageMod.Value)
				{
					return;
				}
				float value = MoreSkills_OverhaulsConfig.FallDamageDecrease.Value;
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)100);
				float value2 = MoreSkills_OverhaulsConfig.BaseMaxFallAltitude.Value;
				float value3 = MoreSkills_OverhaulsConfig.BaseRollAltitude.Value;
				float num = MoreSkills_OverhaulsConfig.BaseRollAltitude.Value + (MoreSkills_OverhaulsConfig.BaseMaxRollAltitude.Value - MoreSkills_OverhaulsConfig.BaseRollAltitude.Value) * ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)100);
				float num2 = Mathf.Max(0f, __instance.m_maxAirAltitude - ((Component)MoreSkills_Instances._player).transform.position.y);
				float num3 = ((!(MoreSkills_OverhaulsConfig.MaxFallDamageIncrease.Value <= 0f)) ? MoreSkills_OverhaulsConfig.MaxFallDamageIncrease.Value : 1f);
				if (MoreSkills_OverhaulsConfig.EnableRollOnFall.Value)
				{
					if (num2 > value3 && num2 < num)
					{
						if (((ZDOID)(ref hit.m_attacker)).UserID == 0)
						{
							hit.m_damage.m_damage = 0f;
						}
					}
					else
					{
						if (!(num2 > num))
						{
							return;
						}
						if (MoreSkills_OverhaulsConfig.EnableMaxFallAltitude.Value)
						{
							if (num2 > num && num2 < value2)
							{
								if (((ZDOID)(ref hit.m_attacker)).UserID == 0)
								{
									hit.m_damage.m_damage = 100f / (value2 - num) * (num2 - num) / (value * skillFactor);
								}
							}
							else if (num2 > value2)
							{
								hit.m_damage.m_damage = 100f / (value2 - num) * (num2 - num) / (value * skillFactor) + (num2 - value2) * num3;
							}
						}
						else
						{
							if (!(num2 > num))
							{
								return;
							}
							if (num2 > 20f)
							{
								if (((ZDOID)(ref hit.m_attacker)).UserID == 0)
								{
									hit.m_damage.m_damage = 100f / (value * skillFactor);
								}
							}
							else if (num2 > num && num2 < 20f && ((ZDOID)(ref hit.m_attacker)).UserID == 0)
							{
								hit.m_damage.m_damage = 100f / (20f - num) * (num2 - num) / (value * skillFactor);
							}
						}
					}
				}
				else if (MoreSkills_OverhaulsConfig.EnableMaxFallAltitude.Value)
				{
					if (num2 > 4f && num2 < value2)
					{
						if (((ZDOID)(ref hit.m_attacker)).UserID == 0)
						{
							hit.m_damage.m_damage = 100f / (value2 - 4f) * (num2 - 4f) / (value * skillFactor);
						}
					}
					else if (num2 > value2 && ((ZDOID)(ref hit.m_attacker)).UserID == 0)
					{
						hit.m_damage.m_damage = 100f / (value2 - 4f) * (num2 - 4f) / (value * skillFactor) + (num2 - value2) * num3;
					}
				}
				else if (num2 > 4f && ((ZDOID)(ref hit.m_attacker)).UserID == 0)
				{
					hit.m_damage.m_damage /= value * skillFactor;
				}
			}
		}

		public static bool inAir;

		public static bool onGround;
	}
}
namespace MoreSkills.ModSkills.NewSkills
{
	internal class MoreSkills_Fishing
	{
		[HarmonyPatch(typeof(FishingFloat), "Nibble")]
		public static class FishFloat_Nibble_Patch
		{
			public static float mathAutoHook;

			public static void Postfix(ref FishingFloat __instance)
			{
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_FishingConfig.EnableFishingSkill.Value)
				{
					return;
				}
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)706);
				float num = MoreSkills_FishingConfig.AutoHookLevel.Value;
				float num2 = MoreSkills_FishingConfig.AutoHookPercentage.Value;
				if (MoreSkills_FishingConfig.EnableFishingStaminaMod.Value)
				{
					if ((double)skillFactor <= 0.5)
					{
						__instance.m_hookedStaminaPerSec = 1f - 2f * (skillFactor * 2f);
					}
					else
					{
						__instance.m_hookedStaminaPerSec = -1f * ((skillFactor - 1f) * 2f);
					}
					__instance.m_pullStaminaUse = 10f - 8f * skillFactor;
				}
				__instance.m_moveForce = 5f + 15f * skillFactor;
				if (MoreSkills_FishingConfig.EnableFishingAutoHook.Value)
				{
					if (skillFactor <= num / 100f)
					{
						mathAutoHook = 1f - num2 / 100f * (100f / num * skillFactor);
					}
					else
					{
						mathAutoHook = 1f - num2 / 100f * 1f;
					}
					if (Random.value > mathAutoHook && (Object)(object)__instance.m_nibbler != (Object)null && Time.time - __instance.m_nibbleTime < 5f && (Object)(object)__instance.GetCatch() == (Object)null)
					{
						Fish nibbler = __instance.m_nibbler;
						__instance.Message("$msg_fishing_hooked", true);
						__instance.SetCatch(nibbler);
					}
				}
			}
		}

		[HarmonyPatch(typeof(Fish), "CustomFixedUpdate")]
		public static class Fish_SpeedNHeight_Patch
		{
			public static bool Prefix(ref float ___m_speed, ref float ___m_height, ref Fish __instance)
			{
				if ((Object)(object)MoreSkills_Instances._player != (Object)null && MoreSkills_FishingConfig.EnableFishingSkill.Value && MoreSkills_FishingConfig.EnableFishVariety.Value)
				{
					if (__instance.m_nview.GetZDO().GetFloat("fishspeed", -1f) != -1f)
					{
						___m_speed = __instance.m_nview.GetZDO().GetFloat("fishspeed", 0f);
						__instance.m_nview.GetZDO().Set("fishspeed", -1f);
					}
					if (__instance.m_nview.GetZDO().GetFloat("fishheight", -1f) != -1f)
					{
						___m_height = __instance.m_nview.GetZDO().GetFloat("fishheight", 0f);
						__instance.m_nview.GetZDO().Set("fishheight", -1f);
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Fish), "CustomFixedUpdate")]
		public static class Fish_VarietyNMods_Patch
		{
			public static void Postfix(ref Fish __instance, ref float ___m_speed, ref float ___m_height)
			{
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_015c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0183: Unknown result type (might be due to invalid IL or missing references)
				//IL_0199: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0203: Unknown result type (might be due to invalid IL or missing references)
				//IL_0302: Unknown result type (might be due to invalid IL or missing references)
				//IL_030e: Unknown result type (might be due to invalid IL or missing references)
				//IL_031b: Unknown result type (might be due to invalid IL or missing references)
				//IL_036a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0376: Unknown result type (might be due to invalid IL or missing references)
				//IL_0383: Unknown result type (might be due to invalid IL or missing references)
				//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_03b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_FishingConfig.EnableFishingSkill.Value)
				{
					return;
				}
				string FishName = ((Object)__instance).name.Replace("(Clone)", "");
				string text = FishName;
				ZDOID zDOID = __instance.GetZDOID();
				string FNZDOID = text + ":" + ((object)(ZDOID)(ref zDOID)).ToString();
				Helper.FishStats fishStats = fStats.Find((Helper.FishStats fstat) => fstat.FishName == FishName);
				Helper.FishSizes fishSizes = fSizes.Find((Helper.FishSizes fsize) => fsize.FishNameZDOID == FNZDOID);
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)706);
				if (MoreSkills_FishingConfig.EnableFishVariety.Value && fishSizes.FishNameZDOID != FNZDOID)
				{
					float num = Random.Range(0.25f, 2f);
					float num2 = Random.Range(-1f * (num * 0.5f), num * 0.5f);
					float num3 = Random.Range(-1f * (num * 0.5f), num * 0.5f);
					Vector3 val = default(Vector3);
					val.x = num + num2;
					val.y = num;
					val.z = num + num3;
					((Component)__instance.m_body).transform.localScale = val;
					__instance.m_nview.GetZDO().Set("fishspeed", ___m_speed / ((((Component)__instance.m_body).transform.localScale.x + ((Component)__instance.m_body).transform.localScale.y + ((Component)__instance.m_body).transform.localScale.z) / 3f));
					__instance.m_nview.GetZDO().Set("fishheight", ___m_height * ((Component)__instance.m_body).transform.localScale.y);
					fSizes.Add(new Helper.FishSizes(FNZDOID, val, __instance.m_height, __instance.m_speed));
				}
				if (!MoreSkills_FishingConfig.EnableFishingStaminaMod.Value && !MoreSkills_FishingConfig.EnableFishStackMod.Value && !MoreSkills_FishingConfig.EnableFishBaseHookMod.Value)
				{
					return;
				}
				if (fishStats.FishName != FishName)
				{
					fStats.Add(new Helper.FishStats(FishName, __instance.m_baseHookChance, __instance.m_pickupItemStackSize, __instance.m_staminaUse));
				}
				if (fishStats.FishName == FishName)
				{
					if (MoreSkills_FishingConfig.EnableFishBaseHookMod.Value)
					{
						__instance.m_baseHookChance = fishStats.BHookChance + (1f - fishStats.BHookChance) * skillFactor;
					}
					if (MoreSkills_FishingConfig.EnableFishStackMod.Value)
					{
						__instance.m_pickupItemStackSize = fishStats.ItemStackSize + Mathf.RoundToInt((float)fishStats.ItemStackSize * ((fishSizes.FishSize.x + fishSizes.FishSize.y + fishSizes.FishSize.z) / 3f) * (MoreSkills_FishingConfig.FishDropMultiplier.Value - 1f) * skillFactor);
					}
					if (MoreSkills_FishingConfig.EnableFishingStaminaMod.Value)
					{
						__instance.m_staminaUse = fishStats.StaminaUse * ((fishSizes.FishSize.x + fishSizes.FishSize.y + fishSizes.FishSize.z) / 3f / 2f) - fishStats.StaminaUse * ((fishSizes.FishSize.x + fishSizes.FishSize.y + fishSizes.FishSize.z) / 3f / 2f) / 4f * 3f * skillFactor;
					}
				}
			}
		}

		[HarmonyPatch(typeof(FishingFloat), "FixedUpdate")]
		public class FishingSkill_RaiseSkill
		{
			public static float FishingSkillIncrease;

			public static float oldLength;

			public static bool sOldLength;

			public static void Postfix(ref FishingFloat __instance)
			{
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0102: Unknown result type (might be due to invalid IL or missing references)
				//IL_010f: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_FishingConfig.EnableFishingSkill.Value)
				{
					return;
				}
				if ((Object)(object)__instance.GetCatch() != (Object)null)
				{
					string text = ((Object)__instance.GetCatch()).name.Replace("(Clone)", "");
					ZDOID zDOID = __instance.GetCatch().GetZDOID();
					string FNZDOID = text + ":" + ((object)(ZDOID)(ref zDOID)).ToString();
					Helper.FishSizes fishSizes = fSizes.Find((Helper.FishSizes fsize) => fsize.FishNameZDOID == FNZDOID);
					if (!sOldLength)
					{
						oldLength = __instance.m_lineLength;
						sOldLength = true;
					}
					if (oldLength - __instance.m_lineLength > 0f)
					{
						FishingSkillIncrease += (oldLength - __instance.m_lineLength) / 2f * ((fishSizes.FishSize.x + fishSizes.FishSize.y + fishSizes.FishSize.z) / 3f);
						oldLength = 0f;
						sOldLength = false;
					}
					if (FishingSkillIncrease > 0.5f)
					{
						((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)706, FishingSkillIncrease);
						FishingSkillIncrease = 0f;
					}
				}
				else
				{
					oldLength = 0f;
					sOldLength = false;
					__instance.m_pullStaminaUse = 0f;
				}
			}
		}

		public static List<Helper.FishStats> fStats = new List<Helper.FishStats>();

		public static List<Helper.FishSizes> fSizes = new List<Helper.FishSizes>();
	}
	internal class MoreSkills_Hunting
	{
		[HarmonyPatch(typeof(CharacterDrop), "Start")]
		public static class Hunting_UpdateDrops
		{
			public static void Postfix(ref CharacterDrop __instance)
			{
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_HuntingConfig.EnableHuntingSkill.Value)
				{
					return;
				}
				bool value = MoreSkills_HuntingConfig.EnableHuntingMinMaxMod.Value;
				bool value2 = MoreSkills_HuntingConfig.EnableHuntingChanceMod.Value;
				float skillFactor = ((Character)MoreSkills_Instances._player).GetSkillFactor((SkillType)704);
				float num = MoreSkills_HuntingConfig.HuntingDropMultiplier.Value - 1f;
				foreach (Drop drop in __instance.m_drops)
				{
					float num2 = 0f;
					float num3 = 0f;
					float num4 = 0f;
					string nameprefab = string.Concat(((Object)__instance).name + ":" + (object)drop.m_prefab);
					string creaturePrefab = hDrops.Find((Helper.HuntingDrops hDrop) => hDrop.CreaturePrefab == nameprefab).CreaturePrefab;
					if (nameprefab != hDrops.Find((Helper.HuntingDrops hDrop) => hDrop.CreaturePrefab == nameprefab).CreaturePrefab)
					{
						hDrops.Add(new Helper.HuntingDrops(nameprefab, drop.m_amountMax, drop.m_amountMin, drop.m_chance));
						Utilities.Log("Hunting: Added Creature to the Temporal Hunting Database", "Postfix");
					}
					if ((!MoreSkills_HuntingConfig.EnableHuntingNormalMobsMod.Value && (!((Object)drop.m_prefab).name.Contains("Trophy") || !((Object)drop.m_prefab).name.Contains("Blob"))) || (!MoreSkills_HuntingConfig.EnableHuntingTrophyMod.Value && ((Object)drop.m_prefab).name.Contains("Trophy")) || (!MoreSkills_HuntingConfig.EnableHuntingBlobSpawn.Value && ((Object)drop.m_prefab).name.Contains("Blob")))
					{
						break;
					}
					if (!(nameprefab == hDrops.Find((Helper.HuntingDrops hDrop) => hDrop.CreaturePrefab == nameprefab).CreaturePrefab))
					{
						continue;
					}
					num2 = hDrops.Find((Helper.HuntingDrops hDrop) => hDrop.CreaturePrefab == nameprefab).Min;
					num3 = hDrops.Find((Helper.HuntingDrops hDrop) => hDrop.CreaturePrefab == nameprefab).Max;
					num4 = hDrops.Find((Helper.HuntingDrops hDrop) => hDrop.CreaturePrefab == nameprefab).Chance;
					if (MoreSkills_HuntingConfig.EnableTrialsOfOdinCompatibility.Value)
					{
						if (__instance.m_character.GetLevel() >= MoreSkills_HuntingConfig.ToOLowLevelStart.Value && __instance.m_character.GetLevel() < MoreSkills_HuntingConfig.ToOMidLevelStart.Value)
						{
							CLevel = 1;
						}
						else if (__instance.m_character.GetLevel() >= MoreSkills_HuntingConfig.ToOMidLevelStart.Value && __instance.m_character.GetLevel() < MoreSkills_HuntingConfig.ToOHighLevelStart.Value)
						{
							CLevel = 2;
						}
						else if (__instance.m_character.GetLevel() >= MoreSkills_HuntingConfig.ToOHighLevelStart.Value)
						{
							CLevel = 3;
						}
					}
					else
					{
						CLevel = __instance.m_character.GetLevel();
					}
					if (value)
					{
						if ((double)skillFactor > 0.5)
						{
							float num5 = Mathf.Round(num3 * num);
							drop.m_amountMax = (int)((num3 + num5) * (float)CLevel);
							float num6 = skillFactor * num;
							float num7 = Mathf.Round(num2 * num6);
							drop.m_amountMin = (int)((num2 + num7) * (float)CLevel);
						}
						else
						{
							float num8 = skillFactor * 2f * num;
							float num9 = Mathf.Round(num3 * num8);
							drop.m_amountMax = (int)((num3 + num9) * (float)CLevel);
						}
					}
					if (value2)
					{
						drop.m_chance = num4 + (1f - num4) * skillFactor;
					}
				}
			}
		}

		[HarmonyPatch(typeof(CharacterDrop), "OnDeath")]
		public static class Hunting_RaiseSkill
		{
			public static float HuntIncrease;

			public static void Postfix(ref CharacterDrop __instance)
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)MoreSkills_Instances._player != (Object)null && MoreSkills_HuntingConfig.EnableHuntingSkill.Value)
				{
					if (MoreSkills_Instances._CDAttacker == ((Character)MoreSkills_Instances._player).GetZDOID())
					{
						HuntIncrease += __instance.m_character.GetMaxHealth() / 20f * (float)CLevel;
					}
					if (HuntIncrease > 0.1f)
					{
						((Character)MoreSkills_Instances._player).RaiseSkill((SkillType)704, HuntIncrease);
						HuntIncrease = 0f;
					}
				}
			}
		}

		public static int CLevel;

		public static List<Helper.HuntingDrops> hDrops = new List<Helper.HuntingDrops>();
	}
	internal class MoreSkills_Taming
	{
		[HarmonyPatch(typeof(Tameable), "OnConsumedItem")]
		public static class SetTamer
		{
			public static void Postfix(ref Tameable __instance)
			{
				//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0101: Unknown result type (might be due to invalid IL or missing references)
				//IL_0106: Unknown result type (might be due to invalid IL or missing references)
				//IL_11b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_11b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_11d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_11d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_1208: Unknown result type (might be due to invalid IL or missing references)
				//IL_128d: Unknown result type (might be due to invalid IL or missing references)
				//IL_1292: Unknown result type (might be due to invalid IL or missing references)
				//IL_0180: Unknown result type (might be due to invalid IL or missing references)
				//IL_0193: Unknown result type (might be due to invalid IL or missing references)
				//IL_0198: Unknown result type (might be due to invalid IL or missing references)
				bool value = MoreSkills_TamingConfig.EnableDetailedLogging.Value;
				if (value)
				{
					Utilities.Log("Running OnConsumedItem...", "Postfix");
				}
				if (!((Object)(object)MoreSkills_Instances._player != (Object)null) || !MoreSkills_TamingConfig.EnableTamingSkill.Value)
				{
					return;
				}
				if (value)
				{
					Utilities.Log("OnConsumedItem: Player is there and taming skill enabled (Tameable=" + ((object)__instance)?.ToString() + ", name='" + ((Object)__instance).name + "', progress=" + __instance.GetTameness() + ", TameTimeLeft=" + __instance.m_tamingTime + ")...", "Postfix");
				}
				if (__instance.GetTameness() >= 100 || __instance.m_character.IsTamed() || __instance.m_character.IsPlayer())
				{
					return;
				}
				Player val = null;
				ZDOID none = ZDOID.None;
				string @string = __instance.m_nview.GetZDO().GetString("TamerID", "");
				if (value)
				{
					Utilities.Log("OnConsumedItem: " + ((@string == "") ? "start taming" : ("continue taming TamerID=" + @string)), "Postfix");
				}
				if (!(@string == ""))
				{
					return;
				}
				try
				{
					val = Player.GetClosestPlayer(((Component)__instance).transform.position, 30f);
					none = ((Character)val).GetZDOID();
				}
				catch (Exception)
				{
					val = null;
					none = ZDOID.None;
				}
				if (none == ((Character)MoreSkills_Instances._player).GetZDOID())
				{
					if (MoreSkills_TamingConfig.EnableAllTamableCompatibility.Value)
					{
						string sCreature2 = ((Object)__instance).name.Replace("(Clone)", "");
						switch (((Object)__instance).name.Replace("(Clone)", ""))
						{
						case "Blob":
							Masterlvl1 = MoreSkills_TamingConfig.BlobLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.BlobLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.BlobLevelTamer.Value;
							break;
						case "BlobElite":
							Masterlvl1 = MoreSkills_TamingConfig.BlobEliteLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.BlobEliteLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.BlobEliteLevelUnlock.Value;
							break;
						case "Boar":
							Masterlvl1 = MoreSkills_TamingConfig.BoarLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.BoarLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.BoarLevelUnlock.Value;
							break;
						case "Deathsquito":
							Masterlvl1 = MoreSkills_TamingConfig.DeathsquitoLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.DeathsquitoLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.DeathsquitoLevelUnlock.Value;
							break;
						case "Hatchling":
							Masterlvl1 = MoreSkills_TamingConfig.DrakeLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.DrakeLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.DrakeLevelUnlock.Value;
							break;
						case "Draugr":
							Masterlvl1 = MoreSkills_TamingConfig.DraugrLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.DraugrLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.DraugrLevelUnlock.Value;
							break;
						case "Draugr_Elite":
							Masterlvl1 = MoreSkills_TamingConfig.DraugrEliteLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.DraugrEliteLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.DraugrEliteLevelUnlock.Value;
							break;
						case "Fenring":
							Masterlvl1 = MoreSkills_TamingConfig.FenringLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.FenringLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.FenringLevelUnlock.Value;
							break;
						case "Goblin":
							Masterlvl1 = MoreSkills_TamingConfig.GoblinLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GoblinLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GoblinLevelUnlock.Value;
							break;
						case "GoblinBrute":
							Masterlvl1 = MoreSkills_TamingConfig.GoblinBruteLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GoblinBruteLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GoblinBruteLevelUnlock.Value;
							break;
						case "GoblinShaman":
							Masterlvl1 = MoreSkills_TamingConfig.GoblinShamanLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GoblinShamanLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GoblinShamanLevelUnlock.Value;
							break;
						case "Greydwarf":
							Masterlvl1 = MoreSkills_TamingConfig.GreydwarfLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GreydwarfLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GreydwarfLevelUnlock.Value;
							break;
						case "Greydwarf_Elite":
							Masterlvl1 = MoreSkills_TamingConfig.GoblinBruteLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GoblinBruteLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GoblinBruteLevelUnlock.Value;
							break;
						case "Greydwarf_Shaman":
							Masterlvl1 = MoreSkills_TamingConfig.GoblinShamanLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GoblinShamanLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GoblinShamanLevelUnlock.Value;
							break;
						case "Greyling":
							Masterlvl1 = MoreSkills_TamingConfig.GreylingLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GreylingLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GreylingLevelUnlock.Value;
							break;
						case "Leech":
							Masterlvl1 = MoreSkills_TamingConfig.LeechLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.LeechLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.LeechLevelUnlock.Value;
							break;
						case "Lox":
							Masterlvl1 = MoreSkills_TamingConfig.LoxLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.LoxLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.LoxLevelUnlock.Value;
							break;
						case "Neck":
							Masterlvl1 = MoreSkills_TamingConfig.NeckLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.NeckLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.NeckLevelUnlock.Value;
							break;
						case "Serpent":
							Masterlvl1 = MoreSkills_TamingConfig.SerpentLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.SerpentLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.SerpentLevelUnlock.Value;
							break;
						case "Skeleton":
							Masterlvl1 = MoreSkills_TamingConfig.SkeletonLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.SkeletonLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.SkeletonLevelUnlock.Value;
							break;
						case "Skeleton_Poison":
							Masterlvl1 = MoreSkills_TamingConfig.SkeletonPoisonLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.SkeletonPoisonLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.SkeletonPoisonLevelUnlock.Value;
							break;
						case "StoneGolem":
							Masterlvl1 = MoreSkills_TamingConfig.StoneGolemLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.StoneGolemLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.StoneGolemLevelUnlock.Value;
							break;
						case "Surtling":
							Masterlvl1 = MoreSkills_TamingConfig.SurtlingLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.SurtlingLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.SurtlingLevelUnlock.Value;
							break;
						case "Troll":
							Masterlvl1 = MoreSkills_TamingConfig.TrollLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.TrollLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.TrollLevelUnlock.Value;
							break;
						case "Wolf":
							Masterlvl1 = MoreSkills_TamingConfig.WolfLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.WolfLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.WolfLevelUnlock.Value;
							break;
						case "Wraith":
							Masterlvl1 = MoreSkills_TamingConfig.WraithLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.WraithLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.WraithLevelUnlock.Value;
							break;
						case "Eikthyr":
							Masterlvl1 = MoreSkills_TamingConfig.EikthyrLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.EikthyrLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.EikthyrLevelUnlock.Value;
							break;
						case "gd_king":
							Masterlvl1 = MoreSkills_TamingConfig.ElderLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.ElderLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.ElderLevelUnlock.Value;
							break;
						case "Bonemass":
							Masterlvl1 = MoreSkills_TamingConfig.BonemassLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.BonemassLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.BonemassLevelUnlock.Value;
							break;
						case "Dragon":
							Masterlvl1 = MoreSkills_TamingConfig.DragonLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.DragonLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.DragonLevelUnlock.Value;
							break;
						case "GoblinKing":
							Masterlvl1 = MoreSkills_TamingConfig.GoblinKingLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.GoblinKingLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.GoblinKingLevelUnlock.Value;
							break;
						case "RRR_GDThornweaver":
							Masterlvl1 = MoreSkills_TamingConfig.RRRGDThornweaverLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.RRRGDThornweaverLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.RRRGDThornweaverLevelUnlock.Value;
							break;
						case "RRR_GhostVengeful":
							Masterlvl1 = MoreSkills_TamingConfig.RRRGhostVengefulLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.RRRGhostVengefulLevelTamer.Value;
							Unlocklvl1 = MoreSkills_TamingConfig.RRRGhostVengefulLevelUnlock.Value;
							break;
						case "RRR_TrollTosser":
							Masterlvl1 = MoreSkills_TamingConfig.RRRTrollTosserLevelMaster.Value;
							Tamerlvl1 = MoreSkills_TamingConfig.RRRTrollTosserLevelTamer.Value;
							Unlocklvl1 = Mo