Decompiled source of VBQOL v1.2.2

VBQOL.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using ServerSync;
using Steamworks;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: CompilationRelaxations(8)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: <ec74b817-87f0-424a-8b7d-4dddd7805b72>RefSafetyRules(11)]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[<325e5d2a-1e76-4ea7-9145-f16cff94a4a8>Embedded]
	internal sealed class <325e5d2a-1e76-4ea7-9145-f16cff94a4a8>EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[<325e5d2a-1e76-4ea7-9145-f16cff94a4a8>Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	[CompilerGenerated]
	internal sealed class <ec74b817-87f0-424a-8b7d-4dddd7805b72>RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public <ec74b817-87f0-424a-8b7d-4dddd7805b72>RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace VBQOL
{
	public class VB_WardPatch
	{
		[HarmonyPatch(typeof(Pickable), "Interact")]
		internal static class PickableInteract_Patch
		{
			private static bool Prefix(Pickable __instance, ref bool repeat)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Pickable), "GetHoverText")]
		internal static class PickableHover_Patch
		{
			private static string Postfix(string __result, Pickable __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess");
				}
				return __result;
			}
		}

		[HarmonyPatch(typeof(ItemDrop), "Interact")]
		internal static class ItemDropInteract_Patch
		{
			private static bool Prefix(ItemDrop __instance, ref bool repeat)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(ItemDrop), "GetHoverText")]
		internal static class ItemDropHover_Patch
		{
			private static string Postfix(string __result, ItemDrop __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess");
				}
				return __result;
			}
		}

		[HarmonyPatch(typeof(Beehive), "Interact")]
		internal static class BeehiveInteract_Patch
		{
			private static bool Prefix(Beehive __instance, ref bool repeat)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Beehive), "GetHoverText")]
		internal static class BeehiveHover_Patch
		{
			private static string Postfix(string __result, Beehive __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess");
				}
				return __result;
			}
		}

		[HarmonyPatch(typeof(ShipControlls), "Interact")]
		internal static class ShipControllsInteract_Patch
		{
			private static bool Prefix(ShipControlls __instance, ref bool repeat)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(ShipControlls), "GetHoverText")]
		internal static class ShipControllsHover_Patch
		{
			private static string Postfix(string __result, ShipControlls __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess");
				}
				return __result;
			}
		}

		[HarmonyPatch(typeof(Sign), "Interact")]
		internal static class SignInteract_Patch
		{
			private static bool Prefix(Sign __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Sign), "GetHoverText")]
		internal static class SignHover_Patch
		{
			private static string Postfix(string __result, Sign __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess");
				}
				return "\"" + __instance.GetText() + "\"\n" + Localization.instance.Localize(__instance.m_name + "\n[<color=#FFFF00><b>$KEY_Use</b></color>] $piece_use");
			}
		}

		[HarmonyPatch(typeof(Container), "Interact")]
		internal static class ContainerInteract_Patch
		{
			private static bool Prefix(Container __instance, bool hold)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Container), "GetHoverText")]
		internal static class ContainerHover_Patch
		{
			private static string Postfix(string __result, Container __instance)
			{
				if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false)))
				{
					return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess");
				}
				return __result;
			}
		}
	}
	public class VB_AshLandsFix
	{
		public static float maxTtl = 30f;

		[HarmonyPatch(typeof(SEMan), "Update")]
		[HarmonyPostfix]
		public static void PatchUpdate(SEMan __instance)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Invalid comparison between Unknown and I4
			StatusEffect val = __instance.GetStatusEffects().Find((StatusEffect x) => ((Object)x).name == "Wet");
			if (Object.op_Implicit((Object)(object)val) && (int)WorldGenerator.instance.GetBiome(((Component)__instance.m_character).transform.position) == 32 && val.m_ttl > maxTtl)
			{
				val.m_ttl -= maxTtl / 5f;
			}
		}
	}
	public class VB_CraftingStationLevelRange
	{
		[HarmonyPatch(typeof(CraftingStation), "UpdateKnownStationsInRange")]
		private static class UpdateKnownStationsInRange_Patch
		{
			private static void Postfix(Player player)
			{
				foreach (CraftingStation item in (List<CraftingStation>)AccessTools.Field(typeof(CraftingStation), "m_allStations").GetValue(null))
				{
					if (item.m_name == "$piece_stonecutter")
					{
						ChangeChildStationRange(item);
					}
				}
			}
		}

		private static int stationAmountIncrease = 4;

		private static int stationDefaultRange = 20;

		private static double stationSearchRange = 50.0;

		public static (bool, CraftingStation) IsParentWorkbenchInRange(CraftingStation station, string workbenchType, float searchRange)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			CraftingStation val = CraftingStation.FindClosestStationInRange(workbenchType, ((Component)station).transform.position, searchRange);
			if ((Object)(object)val == (Object)null)
			{
				return (false, val);
			}
			Vector2 val2 = default(Vector2);
			((Vector2)(ref val2))..ctor(((Component)val).transform.position.x, ((Component)val).transform.position.z);
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(((Component)station).transform.position.x, ((Component)station).transform.position.z);
			if (Vector2.Distance(val2, val3) <= val.m_rangeBuild)
			{
				return (true, val);
			}
			return (false, val);
		}

		public static void ChangeStationRange(CraftingStation station, float newRange)
		{
			if (station.m_rangeBuild != newRange)
			{
				CraftingStation component = ((Component)((Component)station).GetComponent<ZNetView>()).GetComponent<CraftingStation>();
				component.m_rangeBuild = newRange;
				component.m_areaMarker.GetComponent<CircleProjector>().m_radius = newRange;
				component.m_areaMarker.GetComponent<CircleProjector>().m_nrOfSegments = (int)Math.Ceiling(Math.Max(5f, 4f * newRange));
				VBQOL.Logger.LogInfo((object)$"{station.m_name} ({((Object)station).GetInstanceID()}) новый радиус {newRange} ");
			}
		}

		public static void ChangeChildStationRange(CraftingStation station)
		{
			var (flag, val) = IsParentWorkbenchInRange(station, "$piece_workbench", (float)stationSearchRange);
			if (!flag)
			{
				ChangeStationRange(station, stationDefaultRange);
			}
			if (flag && val.GetLevel(true) > 1)
			{
				float newRange = (float)stationDefaultRange + (float)stationAmountIncrease * (float)(val.GetLevel(true) - 1);
				ChangeStationRange(station, newRange);
			}
			else if (flag && val.GetLevel(true) == 1)
			{
				ChangeStationRange(station, stationDefaultRange);
			}
		}
	}
	public class VB_FramePerSecondPlus
	{
		[HarmonyPatch(typeof(ClutterSystem), "Awake")]
		private static class ClutterSystem_Awake_Patch
		{
			private static void Prefix(ClutterSystem __instance)
			{
				__instance.m_grassPatchSize = 15f;
			}
		}

		[HarmonyPatch(typeof(Smoke), "CustomUpdate")]
		private class SlowUpdaterFix
		{
			private static bool Prefix(Smoke __instance, float deltaTime)
			{
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_004f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0063: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
				//IL_0104: Unknown result type (might be due to invalid IL or missing references)
				__instance.m_time += deltaTime;
				float num = 1f - Mathf.Clamp01(__instance.m_time / __instance.m_ttl);
				__instance.m_body.mass = num * num;
				Vector3 velocity = __instance.m_body.velocity;
				Vector3 val = __instance.m_vel - velocity;
				__instance.m_body.AddForce(val * __instance.m_force * deltaTime, (ForceMode)2);
				if (__instance.m_fadeTimer >= 0f)
				{
					__instance.m_fadeTimer += deltaTime;
					if (__instance.m_fadeTimer >= __instance.m_fadetime)
					{
						Object.Destroy((Object)(object)((Component)__instance).gameObject);
					}
				}
				if (__instance.m_time <= 1f || __instance.m_fadeTimer > 0f)
				{
					Color color = __instance.m_propertyBlock.GetColor(Smoke.m_colorProp);
					color.a = __instance.m_alpha;
					__instance.m_propertyBlock.SetColor(Smoke.m_colorProp, color);
					((Renderer)__instance.m_mr).SetPropertyBlock(__instance.m_propertyBlock);
				}
				return false;
			}
		}
	}
	public class VB_AddAllFuel
	{
		[HarmonyPatch(typeof(Fireplace))]
		public static class FireplacePatch
		{
			[HarmonyPrefix]
			[HarmonyPatch("Interact")]
			public static bool FireplaceInteractPrefix(ref Fireplace __instance, Humanoid user, bool hold, bool alt, ref bool __result)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				bool flag = !Input.GetKey(AFModifierKeyConfig.Value);
				__result = false;
				if (hold)
				{
					return false;
				}
				if (!__instance.m_nview.HasOwner())
				{
					__instance.m_nview.ClaimOwnership();
				}
				string name = __instance.m_fuelItem.m_itemData.m_shared.m_name;
				ZLog.Log((object)("Found fuel " + name));
				float num = Mathf.CeilToInt(__instance.m_nview.GetZDO().GetFloat("fuel", 0f));
				if (num > __instance.m_maxFuel - 1f)
				{
					((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_cantaddmore", new string[1] { name }), 0, (Sprite)null);
					return false;
				}
				ZLog.Log((object)("Checking Inventory for fuel " + name));
				Inventory inventory = user.GetInventory();
				ItemData val = ((inventory != null) ? inventory.GetItem(name, -1, false) : null);
				if (val == null)
				{
					if (flag)
					{
						return true;
					}
					((Character)user).Message((MessageType)2, "$msg_outof " + name, 0, (Sprite)null);
					return false;
				}
				((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_fireadding", new string[1] { name }), 0, (Sprite)null);
				int val2 = (int)(__instance.m_maxFuel - num);
				int num2 = 1;
				if (!flag)
				{
					num2 = Math.Min(val.m_stack, val2);
				}
				user.GetInventory().RemoveItem(val, num2);
				for (int i = 0; i < num2; i++)
				{
					__instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty<object>());
				}
				__result = true;
				return false;
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(Fireplace), "GetHoverText")]
			public static string AddFuel_FirePlaceGetHoverText_Patch(string __result, Fireplace __instance)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				string text = __result;
				KeyCode value = AFModifierKeyConfig.Value;
				string text2 = ((object)(KeyCode)(ref value)).ToString();
				string text3 = ((object)(KeyCode)(ref AFModifierKeyUseConfig)).ToString();
				if ((Object)(object)__instance == (Object)null)
				{
					return text;
				}
				if (!__instance.IsBurning())
				{
					return text;
				}
				if (__instance.m_wet)
				{
					return text;
				}
				return text + "\n[<color=yellow><b>" + text2 + "+" + text3 + "</b></color>] " + AFTextConfig.Value;
			}

			public static void RPC_AddFuelAmount(Fireplace instance, ZNetView m_nview, float count)
			{
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0066: Unknown result type (might be due to invalid IL or missing references)
				if (m_nview.IsOwner())
				{
					float @float = m_nview.GetZDO().GetFloat("fuel", 0f);
					float num = Mathf.Clamp(@float + count, 0f, instance.m_maxFuel);
					m_nview.GetZDO().Set("fuel", num);
					instance.m_fuelAddedEffects.Create(((Component)instance).transform.position, ((Component)instance).transform.rotation, (Transform)null, 1f, -1);
					ZLog.Log((object)$"Added fuel * {count}");
					Traverse.Create((object)instance).Method("UpdateState", Array.Empty<object>()).GetValue();
				}
			}
		}

		[HarmonyPatch(typeof(Smelter))]
		public static class SmelterPatch
		{
			[HarmonyPrefix]
			[HarmonyPatch("OnAddOre")]
			public static bool SmelterOnAddOrePrefix(ref Smelter __instance, ref Switch sw, ref Humanoid user, ItemData item, ref bool __result)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				bool flag = !Input.GetKey(AFModifierKeyConfig.Value);
				int value = Traverse.Create((object)__instance).Method("GetQueueSize", Array.Empty<object>()).GetValue<int>();
				if (value >= __instance.m_maxOre)
				{
					((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null);
					return false;
				}
				if (item == null)
				{
					item = FindCookableItem(__instance, user.GetInventory(), flag);
				}
				if (item == null)
				{
					if (flag)
					{
						return true;
					}
					((Character)user).Message((MessageType)2, "$msg_noprocessableitems", 0, (Sprite)null);
					return false;
				}
				if (!Traverse.Create((object)__instance).Method("IsItemAllowed", new object[1] { ((Object)item.m_dropPrefab).name }).GetValue<bool>())
				{
					((Character)user).Message((MessageType)2, "$msg_wontwork", 0, (Sprite)null);
					return false;
				}
				((Character)user).Message((MessageType)2, "$msg_added " + item.m_shared.m_name, 0, (Sprite)null);
				int val = __instance.m_maxOre - value;
				int num = 1;
				if (!flag)
				{
					num = Math.Min(item.m_stack, val);
				}
				user.GetInventory().RemoveItem(item, num);
				for (int i = 0; i < num; i++)
				{
					__instance.m_nview.InvokeRPC("RPC_AddOre", new object[1] { ((Object)item.m_dropPrefab).name });
				}
				__result = true;
				return false;
			}

			[HarmonyPrefix]
			[HarmonyPatch("OnAddFuel")]
			public static bool Prefix(ref Smelter __instance, ref bool __result, Switch sw, Humanoid user, ItemData item)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				bool flag = !Input.GetKey(AFModifierKeyConfig.Value);
				string name = __instance.m_fuelItem.m_itemData.m_shared.m_name;
				if (item != null && item.m_shared.m_name != name)
				{
					((Character)user).Message((MessageType)2, "$msg_wrongitem", 0, (Sprite)null);
					return false;
				}
				float value = Traverse.Create((object)__instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>();
				if (value > (float)(__instance.m_maxFuel - 1))
				{
					((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null);
					return false;
				}
				item = user.GetInventory().GetItem(name, -1, false);
				if (item == null)
				{
					if (flag)
					{
						return true;
					}
					((Character)user).Message((MessageType)2, "$msg_donthaveany " + name, 0, (Sprite)null);
					return false;
				}
				((Character)user).Message((MessageType)2, "$msg_added " + name, 0, (Sprite)null);
				int val = (int)((float)__instance.m_maxFuel - value);
				int num = 1;
				if (!flag)
				{
					num = Math.Min(item.m_stack, val);
				}
				user.GetInventory().RemoveItem(item, num);
				for (int i = 0; i < num; i++)
				{
					__instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty<object>());
				}
				__result = true;
				return false;
			}

			[HarmonyPatch(typeof(Smelter), "OnHoverAddFuel")]
			[HarmonyPostfix]
			public static string AddFuel_OnHoverAddFuel_Patch(string __result, Smelter __instance)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				string text = __result;
				KeyCode value = AFModifierKeyConfig.Value;
				string text2 = ((object)(KeyCode)(ref value)).ToString();
				string text3 = ((object)(KeyCode)(ref AFModifierKeyUseConfig)).ToString();
				if ((Object)(object)__instance == (Object)null)
				{
					return text;
				}
				return text + "\n[<color=yellow><b>" + text2 + "+" + text3 + "</b></color>] " + AFTextConfig.Value;
			}

			[HarmonyPatch(typeof(Smelter), "OnHoverAddOre")]
			[HarmonyPostfix]
			public static string AddFuel_OnHoverAddOre_Patch(string __result, Smelter __instance)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				string text = __result;
				KeyCode value = AFModifierKeyConfig.Value;
				string text2 = ((object)(KeyCode)(ref value)).ToString();
				string text3 = ((object)(KeyCode)(ref AFModifierKeyUseConfig)).ToString();
				if ((Object)(object)__instance == (Object)null)
				{
					return text;
				}
				return text + "\n[<color=yellow><b>" + text2 + "+" + text3 + "</b></color>] " + AFTextConfig.Value;
			}

			public static void RPC_AddOre(Smelter instance, ZNetView m_nview, string name, int count)
			{
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
				if (m_nview.IsOwner() && Traverse.Create((object)instance).Method("IsItemAllowed", new object[1] { name }).GetValue<bool>())
				{
					int value = Traverse.Create((object)instance).Method("GetQueueSize", Array.Empty<object>()).GetValue<int>();
					for (int i = 0; i < count; i++)
					{
						m_nview.GetZDO().Set($"item{value + i}", name);
					}
					m_nview.GetZDO().Set("queued", value + count);
					instance.m_oreAddedEffects.Create(((Component)instance).transform.position, ((Component)instance).transform.rotation, (Transform)null, 1f, -1);
					ZLog.Log((object)$"Added ore {name} * {count}");
				}
			}

			public static void RPC_AddFuel(Smelter instance, ZNetView m_nview, float count)
			{
				//IL_004b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				if (m_nview.IsOwner())
				{
					float value = Traverse.Create((object)instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>();
					m_nview.GetZDO().Set("fuel", value + count);
					instance.m_fuelAddedEffects.Create(((Component)instance).transform.position, ((Component)instance).transform.rotation, ((Component)instance).transform, 1f, -1);
					ZLog.Log((object)$"Added fuel * {count}");
				}
			}
		}

		public static ConfigEntry<KeyCode> AFModifierKeyConfig;

		public static KeyCode AFModifierKeyUseConfig = (KeyCode)101;

		public static ConfigEntry<string> AFTextConfig;

		public static ItemData FindCookableItem(Smelter __instance, Inventory inventory, bool isAddOne)
		{
			IEnumerable<string> enumerable = null;
			enumerable = __instance.m_conversion.Select((ItemConversion n) => n.m_from.m_itemData.m_shared.m_name);
			if (enumerable == null)
			{
				return null;
			}
			foreach (string item in enumerable)
			{
				ItemData val = ((inventory != null) ? inventory.GetItem(item, -1, false) : null);
				if (val != null)
				{
					return val;
				}
			}
			return null;
		}
	}
	[HarmonyPatch]
	public class VB_DayCycle
	{
		[HarmonyPatch(typeof(EnvMan), "Awake")]
		private static class EnvMan_Awake_Patch
		{
			public static void Postfix(ref long ___m_dayLengthSec)
			{
				vanillaDayLengthSec = ___m_dayLengthSec;
				___m_dayLengthSec = (long)Mathf.Round((float)vanillaDayLengthSec / 0.5f);
			}
		}

		public static long vanillaDayLengthSec;
	}
	public class VB_Swampkey
	{
		[HarmonyPatch(typeof(Door), "Interact")]
		public static class SingleDoorPatch
		{
			private static void Postfix(Door __instance, ref bool __result, Humanoid character)
			{
				Player localPlayer = Player.m_localPlayer;
				if (!__result || !((Object)(object)character == (Object)(object)localPlayer))
				{
					return;
				}
				ItemDrop keyItem = __instance.m_keyItem;
				if ((Object)(object)keyItem != (Object)null && keyItem.m_itemData.m_shared.m_name == "$item_cryptkey")
				{
					Inventory inventory = character.GetInventory();
					if (inventory != null && inventory.ContainsItemByName("$item_cryptkey") && Random.value * 100f <= 33f)
					{
						inventory.RemoveItem("$item_cryptkey", 1, -1, true);
						((Character)character).Message((MessageType)1, Localization.instance.Localize("<color=yellow>Болотный ключ сломался</color>"), 0, (Sprite)null);
					}
				}
			}
		}
	}
	[HarmonyPatch]
	public static class VB_Timeout_Patch
	{
		public static CodeMatcher GetPosition(this CodeMatcher codeMatcher, out int position)
		{
			position = codeMatcher.Pos;
			return codeMatcher;
		}

		public static CodeMatcher AddLabel(this CodeMatcher codeMatcher, out Label label)
		{
			label = default(Label);
			codeMatcher.AddLabels((IEnumerable<Label>)new Label[1] { label });
			return codeMatcher;
		}

		public static CodeMatcher GetLabels(this CodeMatcher codeMatcher, out List<Label> label)
		{
			label = codeMatcher.Labels;
			return codeMatcher;
		}

		public static CodeMatcher GetOperand(this CodeMatcher codeMatcher, out object operand)
		{
			operand = codeMatcher.Operand;
			return codeMatcher;
		}

		internal static CodeMatcher Print(this CodeMatcher codeMatcher, int before, int after)
		{
			for (int i = -before; i <= after; i++)
			{
				int num = i;
				int num2 = codeMatcher.Pos + num;
				if (num2 > 0)
				{
					if (num2 >= codeMatcher.Length)
					{
						break;
					}
					try
					{
						CodeInstruction val = codeMatcher.InstructionAt(num);
						VBQOL.Logger.LogDebug((object)($"[{num}] " + (object)val));
					}
					catch (Exception ex)
					{
						VBQOL.Logger.LogDebug((object)ex.Message);
					}
				}
			}
			return codeMatcher;
		}

		public static bool IsVirtCall(this CodeInstruction i, string declaringType, string name)
		{
			return i.opcode == OpCodes.Callvirt && i.operand is MethodInfo methodInfo && methodInfo.DeclaringType?.Name == declaringType && methodInfo.Name == name;
		}
	}
	public class VB_SlopeDamagePatch
	{
		[HarmonyPatch(typeof(Attack), "DoMeleeAttack")]
		public class PatchAttackDoMeleeAttack
		{
			public static void Prefix(ref Attack __instance, ref float ___m_maxYAngle, ref float ___m_attackOffset, ref float ___m_attackHeight)
			{
				Humanoid character = __instance.m_character;
				Player val = (Player)(object)((character is Player) ? character : null);
				if (!((Object)(object)val == (Object)null) && !((Object)(object)val != (Object)(object)Player.m_localPlayer))
				{
					___m_maxYAngle = 180f;
					___m_attackOffset = 0f;
					___m_attackHeight = 1f;
				}
			}
		}
	}
	public class VB_ClearLogPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(ConsoleLogListener), "LogEvent")]
		private static bool ConsoleLogListenerLog(object sender, LogEventArgs eventArgs)
		{
			string text = eventArgs.Data.ToString();
			return !text.StartsWith("Failed to find expected binary shader data") && !text.Contains("Fetching PlatformPrefs 'GuiScale' before loading defaults") && !text.Contains("Missing audio clip in music respawn") && !text.Contains("Set button") && !text.Contains("Only custom filters can be played. Please add a custom filter or an audioclip to the audiosource (Amb_MainMenu).");
		}
	}
	public class VB_FeedFromHandPatch
	{
		[HarmonyPatch(typeof(Humanoid), "UseItem")]
		public static class Humanoid_UseItem_Prefix_Patch
		{
			public static bool Prefix(Humanoid __instance, ItemData item)
			{
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0152: Unknown result type (might be due to invalid IL or missing references)
				GameObject hoverObject = __instance.GetHoverObject();
				if ((Object)(object)hoverObject == (Object)null)
				{
					return true;
				}
				if (!Object.op_Implicit((Object)(object)hoverObject.GetComponent<MonsterAI>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Character>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Tameable>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Humanoid>()))
				{
					return true;
				}
				MonsterAI component = hoverObject.GetComponent<MonsterAI>();
				Character component2 = hoverObject.GetComponent<Character>();
				Tameable component3 = hoverObject.GetComponent<Tameable>();
				Humanoid component4 = hoverObject.GetComponent<Humanoid>();
				if (component2.IsTamed() && component.CanConsume(item))
				{
					string hoverName = component2.GetHoverName();
					if (component2.GetHealth() < component2.GetMaxHealth())
					{
						component2.Heal(50f, true);
						component3.ResetFeedingTimer();
						component3.Interact(component4, false, false);
						__instance.DoInteractAnimation(hoverObject.transform.position);
						((Character)__instance).Message((MessageType)2, hoverName + " $hud_tamelove", 0, (Sprite)null);
						Inventory inventory = __instance.GetInventory();
						inventory.RemoveOneItem(item);
						bool flag = false;
					}
					if (component3.IsHungry())
					{
						component2.Heal(50f, true);
						component3.ResetFeedingTimer();
						component3.Interact(component4, false, false);
						__instance.DoInteractAnimation(hoverObject.transform.position);
						((Character)__instance).Message((MessageType)2, hoverName + " $hud_tamelove", 0, (Sprite)null);
						Inventory inventory2 = __instance.GetInventory();
						inventory2.RemoveOneItem(item);
						return false;
					}
					((Character)__instance).Message((MessageType)2, hoverName + " $msg_nomore", 0, (Sprite)null);
					return false;
				}
				return true;
			}
		}
	}
	public class VB_SnakeCameraPatch
	{
		internal class SneakConfig
		{
			public enum CrouchPosition
			{
				Disabled,
				Crouching,
				CrouchStanding,
				CrouchWalking
			}

			public static CrouchPosition LowerCameraWhen = CrouchPosition.Crouching;

			public static float CameraHeightReduction = 0.5f;

			internal const float CameraMin = 0f;

			internal const float CameraMax = 1f;

			public static bool ChangeCollisionCrouchHeight = true;

			public static float CrouchHeightMultiplier = 0.8f;

			internal const float HeightMultMin = 0.75f;

			internal const float HeightMultMax = 1f;
		}

		[HarmonyPatch]
		internal class CameraPatches
		{
			[HarmonyPostfix]
			[HarmonyPatch(typeof(GameCamera), "GetCameraBaseOffset")]
			private static void GetCameraBaseOffset(Player player, ref Vector3 __result)
			{
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)player != (Object)(object)Player.m_localPlayer) && SneakConfig.LowerCameraWhen != 0 && !(__result != ((Component)((Character)player).m_eye).transform.position - ((Component)player).transform.position) && ((Character)player).IsCrouching() && ((Character)player).IsOnGround())
				{
					bool flag = ((Character)player).IsSneaking();
					if (SneakConfig.LowerCameraWhen == SneakConfig.CrouchPosition.Crouching || (SneakConfig.LowerCameraWhen == SneakConfig.CrouchPosition.CrouchWalking && flag) || (SneakConfig.LowerCameraWhen == SneakConfig.CrouchPosition.CrouchStanding && !flag))
					{
						__result += Vector3.up * (0f - Mathf.Clamp(SneakConfig.CameraHeightReduction, 0f, 1f));
					}
				}
			}
		}

		private static float? standingSize;

		private static float? crouchedSize;

		[HarmonyPatch(typeof(Player), "FixedUpdate")]
		[HarmonyPostfix]
		private static void FixedUpdate(Player __instance)
		{
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || !SneakConfig.ChangeCollisionCrouchHeight)
			{
				return;
			}
			CapsuleCollider collider = ((Character)__instance).GetCollider();
			if (Object.op_Implicit((Object)(object)collider))
			{
				if (!standingSize.HasValue)
				{
					standingSize = collider.height;
					CalculateCrouchedSize();
				}
				bool flag = ((Character)__instance).IsCrouching() && ((Character)__instance).IsOnGround();
				collider.height = (flag ? crouchedSize.Value : standingSize.Value);
				collider.center = new Vector3(0f, collider.height / 2f, 0f);
			}
		}

		internal static void CalculateCrouchedSize()
		{
			if (standingSize.HasValue)
			{
				_ = SneakConfig.CrouchHeightMultiplier;
				if (0 == 0)
				{
					crouchedSize = standingSize.Value * Mathf.Clamp(SneakConfig.CrouchHeightMultiplier, 0.75f, 1f);
				}
			}
		}
	}
	public class VB_BlastFurnaceTalesAll
	{
		[HarmonyPatch(typeof(Smelter), "Awake")]
		[HarmonyPostfix]
		private static void BlastFurnacePatch(ref Smelter __instance)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Expected O, but got Unknown
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Expected O, but got Unknown
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: 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_0120: Expected O, but got Unknown
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Expected O, but got Unknown
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Expected O, but got Unknown
			if (__instance.m_name != "$piece_blastfurnace")
			{
				return;
			}
			foreach (ItemConversion item in new List<ItemConversion>
			{
				new ItemConversion
				{
					m_from = ObjectDB.instance.GetItemPrefab("CopperOre").GetComponent<ItemDrop>(),
					m_to = ObjectDB.instance.GetItemPrefab("Copper").GetComponent<ItemDrop>()
				},
				new ItemConversion
				{
					m_from = ObjectDB.instance.GetItemPrefab("CopperScrap").GetComponent<ItemDrop>(),
					m_to = ObjectDB.instance.GetItemPrefab("Copper").GetComponent<ItemDrop>()
				},
				new ItemConversion
				{
					m_from = ObjectDB.instance.GetItemPrefab("TinOre").GetComponent<ItemDrop>(),
					m_to = ObjectDB.instance.GetItemPrefab("Tin").GetComponent<ItemDrop>()
				},
				new ItemConversion
				{
					m_from = ObjectDB.instance.GetItemPrefab("IronOre").GetComponent<ItemDrop>(),
					m_to = ObjectDB.instance.GetItemPrefab("Iron").GetComponent<ItemDrop>()
				},
				new ItemConversion
				{
					m_from = ObjectDB.instance.GetItemPrefab("IronScrap").GetComponent<ItemDrop>(),
					m_to = ObjectDB.instance.GetItemPrefab("Iron").GetComponent<ItemDrop>()
				},
				new ItemConversion
				{
					m_from = ObjectDB.instance.GetItemPrefab("SilverOre").GetComponent<ItemDrop>(),
					m_to = ObjectDB.instance.GetItemPrefab("Silver").GetComponent<ItemDrop>()
				}
			})
			{
				__instance.m_conversion.Add(item);
			}
		}
	}
	public class VB_BetterLaders
	{
		[HarmonyPatch(typeof(AutoJumpLedge), "OnTriggerStay")]
		public static class Ladder_Patch
		{
			private static bool Prefix(AutoJumpLedge __instance, Collider collider)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_0057: Unknown result type (might be due to invalid IL or missing references)
				//IL_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
				//IL_0103: Unknown result type (might be due to invalid IL or missing references)
				//IL_010e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0118: Unknown result type (might be due to invalid IL or missing references)
				//IL_011d: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00be: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
				Character component = ((Component)collider).GetComponent<Character>();
				if (Object.op_Implicit((Object)(object)component) && (Object)(object)component == (Object)(object)Player.m_localPlayer)
				{
					Vector3 position = ((Component)component).transform.position;
					Quaternion rotation = ((Component)__instance).gameObject.transform.rotation;
					float y = ((Quaternion)(ref rotation)).eulerAngles.y;
					rotation = ((Component)component).transform.rotation;
					float y2 = ((Quaternion)(ref rotation)).eulerAngles.y;
					float num = Math.Abs(Mathf.DeltaAngle(y, y2));
					if (num <= 12f)
					{
						if (!component.m_running)
						{
							((Component)component).transform.position = new Vector3(position.x, position.y + 0.06f, position.z) + ((Component)component).transform.forward * 0.08f;
						}
						else
						{
							((Component)component).transform.position = new Vector3(position.x, position.y + 0.08f, position.z) + ((Component)component).transform.forward * 0.08f;
						}
					}
				}
				return !((Object)(object)component == (Object)(object)Player.m_localPlayer);
			}
		}
	}
	public class VB_Pickable_UpdateRespawn_Patch
	{
		[HarmonyPatch(typeof(Pickable), "UpdateRespawn")]
		public static class Patch_Pickable_UpdateRespawn
		{
			private static Exception Finalizer(Pickable __instance, Exception __exception)
			{
				if ((Object)(object)__instance != (Object)null && __exception != null)
				{
					VBQOL.Logger.LogDebug((object)"Исправлен таймер расстения:");
					VBQOL.Logger.LogDebug((object)__exception);
					DateTime time = ZNet.instance.GetTime();
					__instance.m_nview.GetZDO().Set(ZDOVars.s_pickedTime, time.Ticks);
				}
				return null;
			}
		}
	}
	public class VB_ToolTierPatch
	{
		[HarmonyPatch]
		internal class Change_ToolTierPatch
		{
			[HarmonyPatch(typeof(ZNetScene), "Awake")]
			[HarmonyPostfix]
			public static void Patch(ZNetScene __instance)
			{
				__instance.GetPrefab("Beech1").GetComponent<TreeBase>().m_minToolTier = 0;
				__instance.GetPrefab("beech_log").GetComponent<TreeLog>().m_minToolTier = 0;
				__instance.GetPrefab("beech_log_half").GetComponent<TreeLog>().m_minToolTier = 0;
				__instance.GetPrefab("Beech_Stub").GetComponent<Destructible>().m_minToolTier = 0;
				__instance.GetPrefab("FirTree").GetComponent<TreeBase>().m_minToolTier = 0;
				__instance.GetPrefab("FirTree_log").GetComponent<TreeLog>().m_minToolTier = 0;
				__instance.GetPrefab("FirTree_log_half").GetComponent<TreeLog>().m_minToolTier = 0;
				__instance.GetPrefab("FirTree_Stub").GetComponent<Destructible>().m_minToolTier = 0;
				__instance.GetPrefab("Pinetree_01").GetComponent<TreeBase>().m_minToolTier = 1;
				__instance.GetPrefab("PineTree_log").GetComponent<TreeLog>().m_minToolTier = 1;
				__instance.GetPrefab("PineTree_log_half").GetComponent<TreeLog>().m_minToolTier = 1;
				__instance.GetPrefab("Pinetree_01_Stub").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("SwampTree1").GetComponent<TreeBase>().m_minToolTier = 2;
				__instance.GetPrefab("SwampTree1_log").GetComponent<TreeLog>().m_minToolTier = 2;
				__instance.GetPrefab("SwampTree1_Stub").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("Birch1").GetComponent<TreeBase>().m_minToolTier = 2;
				__instance.GetPrefab("Birch2").GetComponent<TreeBase>().m_minToolTier = 2;
				__instance.GetPrefab("Birch_log").GetComponent<TreeLog>().m_minToolTier = 2;
				__instance.GetPrefab("Birch_log_half").GetComponent<TreeLog>().m_minToolTier = 2;
				__instance.GetPrefab("BirchStub").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("Birch1_aut").GetComponent<TreeBase>().m_minToolTier = 2;
				__instance.GetPrefab("Birch2_aut").GetComponent<TreeBase>().m_minToolTier = 2;
				__instance.GetPrefab("caverock_ice_stalagtite").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("caverock_ice_stalagtite_falling").GetComponent<TreeLog>().m_minToolTier = 2;
				__instance.GetPrefab("caverock_ice_stalagmite").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("caverock_ice_stalagmite_broken").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("caverock_ice_pillar_wall").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("Oak1").GetComponent<TreeBase>().m_minToolTier = 3;
				__instance.GetPrefab("Oak_log").GetComponent<TreeLog>().m_minToolTier = 3;
				__instance.GetPrefab("Oak_log_half").GetComponent<TreeLog>().m_minToolTier = 3;
				__instance.GetPrefab("OakStub").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("YggaShoot1").GetComponent<TreeBase>().m_minToolTier = 4;
				__instance.GetPrefab("YggaShoot2").GetComponent<TreeBase>().m_minToolTier = 4;
				__instance.GetPrefab("YggaShoot3").GetComponent<TreeBase>().m_minToolTier = 4;
				__instance.GetPrefab("yggashoot_log").GetComponent<TreeLog>().m_minToolTier = 4;
				__instance.GetPrefab("yggashoot_log_half").GetComponent<TreeLog>().m_minToolTier = 4;
				__instance.GetPrefab("ShootStump").GetComponent<Destructible>().m_minToolTier = 4;
				__instance.GetPrefab("Leviathan").GetComponent<MineRock>().m_minToolTier = 1;
				__instance.GetPrefab("mudpile").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("mudpile2").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("mudpile_beacon").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("mudpile_old").GetComponent<MineRock>().m_minToolTier = 1;
				__instance.GetPrefab("mudpile_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("mudpile2_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("MineRock_Meteorite").GetComponent<MineRock>().m_minToolTier = 3;
				__instance.GetPrefab("Rock_3").GetComponent<Destructible>().m_minToolTier = 0;
				__instance.GetPrefab("Rock_3_frac").GetComponent<MineRock5>().m_minToolTier = 0;
				__instance.GetPrefab("rock4_coast").GetComponent<Destructible>().m_minToolTier = 0;
				__instance.GetPrefab("rock4_coast_frac").GetComponent<MineRock5>().m_minToolTier = 0;
				__instance.GetPrefab("rock4_forest").GetComponent<Destructible>().m_minToolTier = 0;
				__instance.GetPrefab("rock4_forest_frac").GetComponent<MineRock5>().m_minToolTier = 0;
				__instance.GetPrefab("rock4_copper").GetComponent<Destructible>().m_minToolTier = 0;
				__instance.GetPrefab("rock4_copper_frac").GetComponent<MineRock5>().m_minToolTier = 0;
				__instance.GetPrefab("rock1_mountain").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("rock1_mountain_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("rock2_mountain").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("rock2_mountain_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("rock3_mountain").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("rock3_mountain_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("rock2_heath").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("rock2_heath_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("rock4_heath").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("rock4_heath_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("HeathRockPillar").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("HeathRockPillar_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("RockThumb").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("RockThumb_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("RockFinger").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("RockFinger_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("RockFingerBroken").GetComponent<Destructible>().m_minToolTier = 1;
				__instance.GetPrefab("RockFingerBroken_frac").GetComponent<MineRock5>().m_minToolTier = 1;
				__instance.GetPrefab("rock_mistlands1").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("rock_mistlands1_frac").GetComponent<MineRock5>().m_minToolTier = 2;
				__instance.GetPrefab("cliff_mistlands1").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("cliff_mistlands1_frac").GetComponent<MineRock5>().m_minToolTier = 2;
				__instance.GetPrefab("cliff_mistlands2").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("cliff_mistlands2_frac").GetComponent<MineRock5>().m_minToolTier = 2;
				__instance.GetPrefab("cliff_mistlands1_creep").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("cliff_mistlands1_creep_frac").GetComponent<MineRock5>().m_minToolTier = 2;
				__instance.GetPrefab("silvervein").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("silvervein_frac").GetComponent<MineRock5>().m_minToolTier = 2;
				__instance.GetPrefab("rock3_silver").GetComponent<Destructible>().m_minToolTier = 2;
				__instance.GetPrefab("rock3_silver_frac").GetComponent<MineRock5>().m_minToolTier = 2;
				__instance.GetPrefab("giant_brain").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_brain_frac").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("giant_ribs").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_ribs_frac").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("giant_skull").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_skull_frac").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("giant_helmet1").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_helmet1_destruction").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("giant_helmet2").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_helmet2_destruction").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("giant_sword1").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_sword1_destruction").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("giant_sword2").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("giant_sword2_destruction").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("ice_rock1").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("ice_rock1_frac").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("rock3_ice").GetComponent<Destructible>().m_minToolTier = 3;
				__instance.GetPrefab("rock3_ice_frac").GetComponent<MineRock5>().m_minToolTier = 3;
				__instance.GetPrefab("ice1").GetComponent<Destructible>().m_minToolTier = 3;
			}
		}
	}
	[HarmonyPatch(typeof(InventoryGui))]
	public class VB_RecycleInventoryGui
	{
		[HarmonyPatch(typeof(Humanoid))]
		private class HumanoidPatch
		{
			[HarmonyPostfix]
			[HarmonyPatch("EquipItem")]
			private static void EquipItem(Humanoid __instance, ItemData item, bool triggerEquipEffects = true)
			{
				if (((Character)__instance).IsPlayer())
				{
					InventoryGui instance = InventoryGui.instance;
					if (instance != null)
					{
						instance.UpdateCraftingPanel(false);
					}
				}
			}

			[HarmonyPatch("UnequipItem")]
			[HarmonyPostfix]
			private static void UnequipItem(Humanoid __instance, ItemData item, bool triggerEquipEffects = true)
			{
				if (((Character)__instance).IsPlayer())
				{
					InventoryGui instance = InventoryGui.instance;
					if (instance != null)
					{
						instance.UpdateCraftingPanel(false);
					}
				}
			}
		}

		[HarmonyPatch(typeof(InventoryGui))]
		public class InventoryGuiPatch
		{
			[HarmonyPostfix]
			[HarmonyPatch("Update")]
			internal static void PostfixUpdate(InventoryGui __instance)
			{
				VBQOL.self?.RebuildRecycleTab();
			}

			[HarmonyPatch("OnTabCraftPressed")]
			[HarmonyPrefix]
			internal static bool PrefixOnTabCraftPressed(InventoryGui __instance)
			{
				((Selectable)VBQOL.self.recycleButton).interactable = true;
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("OnTabUpgradePressed")]
			internal static bool PrefixOnTabUpgradePressed(InventoryGui __instance)
			{
				((Selectable)VBQOL.self.recycleButton).interactable = true;
				return true;
			}

			[HarmonyPatch("SetupRequirement")]
			[HarmonyPostfix]
			internal static void PostfixSetupRequirement(Transform elementRoot, Requirement req, int quality)
			{
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				if (VBQOL.self.InTabDeconstruct())
				{
					TMP_Text component = ((Component)((Component)elementRoot).transform.Find("res_amount")).GetComponent<TMP_Text>();
					component.text = VBQOL.GetModifiedAmount(quality, req).ToString();
					((Graphic)component).color = Color.green;
				}
			}

			[HarmonyPatch("UpdateCraftingPanel")]
			[HarmonyPrefix]
			internal static bool PrefixUpdateCraftingPanel(InventoryGui __instance, bool focusView = false)
			{
				if ((Object)(object)VBQOL.self != (Object)null)
				{
					Player localPlayer = Player.m_localPlayer;
					if (Object.op_Implicit((Object)(object)localPlayer.GetCurrentCraftingStation()) && (((Object)((Component)localPlayer.GetCurrentCraftingStation()).gameObject).name.Contains("cauldron") || ((Object)((Component)localPlayer.GetCurrentCraftingStation()).gameObject).name.Contains("artisanstation")))
					{
						VBQOL.self.recycleObject.SetActive(false);
						((Selectable)VBQOL.self.recycleButton).interactable = true;
						return true;
					}
					if (!Object.op_Implicit((Object)(object)localPlayer.GetCurrentCraftingStation()) && !localPlayer.NoCostCheat())
					{
						((Selectable)__instance.m_tabCraft).interactable = false;
						((Selectable)__instance.m_tabUpgrade).interactable = true;
						((Component)__instance.m_tabUpgrade).gameObject.SetActive(false);
						VBQOL.self.recycleObject.SetActive(false);
						((Selectable)VBQOL.self.recycleButton).interactable = true;
					}
					else
					{
						((Component)__instance.m_tabUpgrade).gameObject.SetActive(true);
						VBQOL.self.recycleObject.SetActive(true);
					}
					List<Recipe> list = new List<Recipe>();
					localPlayer.GetAvailableRecipes(ref list);
					__instance.UpdateRecipeList(list);
					if (__instance.m_availableRecipes.Count <= 0)
					{
						__instance.SetRecipe(-1, focusView);
						return false;
					}
					if ((Object)(object)__instance.m_selectedRecipe.Key != (Object)null)
					{
						int selectedRecipeIndex = __instance.GetSelectedRecipeIndex(false);
						__instance.SetRecipe(selectedRecipeIndex, focusView);
						return false;
					}
					__instance.SetRecipe(0, focusView);
					return false;
				}
				return true;
			}

			[HarmonyPostfix]
			[HarmonyPatch("UpdateRecipeList")]
			internal static void PostfixUpdateRecipeList(InventoryGui __instance, List<Recipe> recipes)
			{
				if (!VBQOL.self.InTabDeconstruct())
				{
					return;
				}
				Player localPlayer = Player.m_localPlayer;
				Inventory inventory = ((Humanoid)localPlayer).GetInventory();
				__instance.m_availableRecipes.Clear();
				foreach (GameObject recipe in __instance.m_recipeList)
				{
					Object.Destroy((Object)(object)recipe);
				}
				__instance.m_recipeList.Clear();
				List<KeyValuePair<Recipe, ItemData>> list = new List<KeyValuePair<Recipe, ItemData>>();
				for (int i = 0; i < recipes.Count; i++)
				{
					Recipe val = recipes[i];
					if (val.m_item.m_itemData.m_shared.m_maxQuality < 1)
					{
						continue;
					}
					__instance.m_tempItemList.Clear();
					if (val.m_item.m_itemData.m_shared.m_maxStackSize == 1)
					{
						inventory.GetAllItems(val.m_item.m_itemData.m_shared.m_name, __instance.m_tempItemList);
					}
					else
					{
						for (int j = 0; j < inventory.m_inventory.Count; j++)
						{
							if (inventory.m_inventory[j].m_shared.m_name.Equals(val.m_item.m_itemData.m_shared.m_name) && inventory.m_inventory[j].m_stack >= val.m_amount)
							{
								__instance.m_tempItemList.Add(inventory.m_inventory[j]);
								break;
							}
						}
					}
					foreach (ItemData tempItem in __instance.m_tempItemList)
					{
						if (tempItem.m_quality >= 1)
						{
							list.Add(new KeyValuePair<Recipe, ItemData>(val, tempItem));
						}
					}
				}
				IEnumerable<int> equipped = from item in inventory.GetEquippedItems()
					select ((object)item).GetHashCode();
				list.RemoveAll((KeyValuePair<Recipe, ItemData> m) => equipped.Contains(((object)m.Value).GetHashCode()));
				List<ItemData> list2 = new List<ItemData>();
				inventory.GetBoundItems(list2);
				IEnumerable<int> hotbarItemsHashes = list2.Select((ItemData item) => ((object)item).GetHashCode());
				list.RemoveAll((KeyValuePair<Recipe, ItemData> m) => hotbarItemsHashes.Contains(((object)m.Value).GetHashCode()));
				foreach (KeyValuePair<Recipe, ItemData> item in list)
				{
					__instance.AddRecipeToList(localPlayer, item.Key, item.Value, true);
				}
				float num = (float)__instance.m_recipeList.Count * __instance.m_recipeListSpace;
				num = Mathf.Max(__instance.m_recipeListBaseSize, num);
				__instance.m_recipeListRoot.SetSizeWithCurrentAnchors((Axis)1, num);
			}

			[HarmonyPrefix]
			[HarmonyPatch("UpdateRecipe")]
			internal static bool PrefixUpdateRecipe(InventoryGui __instance, Player player, float dt)
			{
				//IL_03d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
				if (VBQOL.self.InTabDeconstruct())
				{
					CraftingStation currentCraftingStation = player.GetCurrentCraftingStation();
					if (Object.op_Implicit((Object)(object)currentCraftingStation))
					{
						__instance.m_craftingStationName.text = Localization.instance.Localize(currentCraftingStation.m_name);
						((Component)__instance.m_craftingStationIcon).gameObject.SetActive(true);
						__instance.m_craftingStationIcon.sprite = currentCraftingStation.m_icon;
						int level = currentCraftingStation.GetLevel(true);
						__instance.m_craftingStationLevel.text = level.ToString();
						((Component)__instance.m_craftingStationLevelRoot).gameObject.SetActive(true);
					}
					else
					{
						__instance.m_craftingStationName.text = Localization.instance.Localize("$hud_crafting");
						((Component)__instance.m_craftingStationIcon).gameObject.SetActive(false);
						((Component)__instance.m_craftingStationLevelRoot).gameObject.SetActive(false);
					}
					if (Object.op_Implicit((Object)(object)__instance.m_selectedRecipe.Key))
					{
						((Behaviour)__instance.m_recipeIcon).enabled = true;
						((Behaviour)__instance.m_recipeName).enabled = true;
						ItemData value = __instance.m_selectedRecipe.Value;
						if (value.m_quality == 1)
						{
							((Behaviour)__instance.m_recipeDecription).enabled = false;
						}
						else
						{
							((Behaviour)__instance.m_recipeDecription).enabled = true;
						}
						int num = ((value == null) ? 1 : ((value.m_quality >= 1) ? (value.m_quality - 1) : 0));
						bool flag = num <= __instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_maxQuality;
						int num2 = value?.m_variant ?? __instance.m_selectedVariant;
						__instance.m_recipeIcon.sprite = __instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_icons[num2];
						string text = Localization.instance.Localize(__instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_name);
						if (__instance.m_selectedRecipe.Key.m_amount > 1)
						{
							text = text + " x" + __instance.m_selectedRecipe.Key.m_amount;
						}
						__instance.m_recipeName.text = text;
						__instance.m_recipeDecription.text = Localization.instance.Localize(ItemData.GetTooltip(__instance.m_selectedRecipe.Key.m_item.m_itemData, num, true, (float)Game.m_worldLevel));
						if (value != null)
						{
							((Component)__instance.m_itemCraftType).gameObject.SetActive(true);
							string text2 = Localization.instance.Localize(value.m_shared.m_name);
							__instance.m_itemCraftType.text = "Предмет будет разобран";
						}
						else
						{
							((Component)__instance.m_itemCraftType).gameObject.SetActive(false);
						}
						((Component)__instance.m_variantButton).gameObject.SetActive(__instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_variants > 1 && __instance.m_selectedRecipe.Value == null);
						__instance.SetupRequirementList(num + 1, player, flag);
						int num3 = 0;
						CraftingStation requiredStation = __instance.m_selectedRecipe.Key.GetRequiredStation(num);
						if ((Object)(object)requiredStation != (Object)null && flag)
						{
							((Component)__instance.m_minStationLevelIcon).gameObject.SetActive(true);
							__instance.m_minStationLevelText.text = num3.ToString();
							if ((Object)(object)currentCraftingStation == (Object)null || currentCraftingStation.GetLevel(true) < num3)
							{
								((Graphic)__instance.m_minStationLevelText).color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : __instance.m_minStationLevelBasecolor);
							}
							else
							{
								((Graphic)__instance.m_minStationLevelText).color = __instance.m_minStationLevelBasecolor;
							}
						}
						else
						{
							((Component)__instance.m_minStationLevelIcon).gameObject.SetActive(false);
						}
						bool flag2 = true;
						bool flag3 = VBQOL.HaveEmptySlotsForRecipe(((Humanoid)player).GetInventory(), __instance.m_selectedRecipe.Key, num + 1);
						bool flag4 = !Object.op_Implicit((Object)(object)requiredStation) || (Object.op_Implicit((Object)(object)currentCraftingStation) && currentCraftingStation.CheckUsable(player, false));
						((Selectable)__instance.m_craftButton).interactable = ((flag2 && flag4) || player.NoCostCheat()) && flag3 && flag;
						TMP_Text componentInChildren = ((Component)__instance.m_craftButton).GetComponentInChildren<TMP_Text>();
						componentInChildren.text = "Разбор";
						UITooltip component = ((Component)__instance.m_craftButton).GetComponent<UITooltip>();
						if (!flag3)
						{
							component.m_text = Localization.instance.Localize("$inventory_full");
						}
						else if (!flag4)
						{
							component.m_text = Localization.instance.Localize("$msg_missingstation");
						}
						else
						{
							component.m_text = "";
						}
					}
					else
					{
						((Behaviour)__instance.m_recipeIcon).enabled = false;
						((Behaviour)__instance.m_recipeName).enabled = false;
						((Behaviour)__instance.m_recipeDecription).enabled = false;
						((Component)__instance.m_qualityPanel).gameObject.SetActive(false);
						((Component)__instance.m_minStationLevelIcon).gameObject.SetActive(false);
						((Component)__instance.m_craftButton).GetComponent<UITooltip>().m_text = "";
						((Component)__instance.m_variantButton).gameObject.SetActive(false);
						((Component)__instance.m_itemCraftType).gameObject.SetActive(false);
						for (int i = 0; i < __instance.m_recipeRequirementList.Length; i++)
						{
							InventoryGui.HideRequirement(__instance.m_recipeRequirementList[i].transform);
						}
						((Selectable)__instance.m_craftButton).interactable = false;
					}
					if (__instance.m_craftTimer < 0f)
					{
						((Component)__instance.m_craftProgressPanel).gameObject.SetActive(false);
						((Component)__instance.m_craftButton).gameObject.SetActive(true);
						return false;
					}
					((Component)__instance.m_craftButton).gameObject.SetActive(false);
					((Component)__instance.m_craftProgressPanel).gameObject.SetActive(true);
					__instance.m_craftProgressBar.SetMaxValue(__instance.m_craftDuration);
					__instance.m_craftProgressBar.SetValue(__instance.m_craftTimer);
					__instance.m_craftTimer += dt;
					if (__instance.m_craftTimer >= __instance.m_craftDuration)
					{
						if (VBQOL.self.InTabDeconstruct())
						{
							VBQOL.DoRecycle(player, __instance);
						}
						else
						{
							__instance.DoCrafting(player);
						}
						__instance.m_craftTimer = -1f;
					}
					return false;
				}
				return true;
			}
		}
	}
	[HarmonyPatch]
	public class VB_FirePlaceUtilites
	{
		public static KeyCode configPOKey;

		public static ConfigEntry<bool> extinguishItemsConfig;

		public static ConfigEntry<string> extinguishStringConfig;

		public static ConfigEntry<string> igniteStringConfig;

		public static ConfigEntry<KeyCode> keyPOCodeStringConfig;

		public static Fireplace GetAndCheckFireplace(Player player, bool checkIfBurning)
		{
			GameObject hoverObject = ((Humanoid)player).GetHoverObject();
			Fireplace val = (((Object)(object)hoverObject != (Object)null) ? hoverObject.GetComponentInParent<Fireplace>() : null);
			if ((Object)(object)val == (Object)null)
			{
				return null;
			}
			Fireplace component = ((Component)((Component)val).GetComponent<ZNetView>()).GetComponent<Fireplace>();
			if ((Object)(object)component == (Object)null)
			{
				return null;
			}
			if (checkIfBurning)
			{
				if (!component.IsBurning())
				{
					return null;
				}
				if (component.m_wet)
				{
					return null;
				}
			}
			return component;
		}

		[HarmonyPatch(typeof(Fireplace), "UpdateFireplace")]
		[HarmonyPostfix]
		public static void FireplaceUpdateFireplace_Patch(Fireplace __instance)
		{
			ZDO zDO = __instance.m_nview.GetZDO();
			float @float = zDO.GetFloat("fuel", 0f);
			if (!zDO.GetBool("enabledFire", false))
			{
				if (@float <= 0f)
				{
					return;
				}
				zDO.Set("enabledFire", true);
				zDO.Set("fuel", zDO.GetFloat("hiddenFuelAmount", 0f) + @float);
			}
			if (zDO.GetFloat("hiddenFuelAmount", 0f) != @float)
			{
				float num = @float;
				zDO.Set("hiddenFuelAmount", num);
			}
			if (zDO.GetFloat("fuel", 0f) > __instance.m_maxFuel)
			{
				zDO.Set("fuel", __instance.m_maxFuel);
			}
		}

		[HarmonyPatch(typeof(Fireplace), "GetHoverText")]
		[HarmonyPostfix]
		public static string FireplaceGetHoverText_Patch(string __result, Fireplace __instance)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			string text = __result;
			KeyCode value = keyPOCodeStringConfig.Value;
			string text2 = ((object)(KeyCode)(ref value)).ToString();
			if ((Object)(object)__instance == (Object)null)
			{
				return text;
			}
			ZDO zDO = __instance.m_nview.GetZDO();
			float @float = zDO.GetFloat("hiddenFuelAmount", 0f);
			if (extinguishItemsConfig.Value && !__instance.IsBurning() && @float > 0f)
			{
				int num = (int)__instance.m_maxFuel;
				text = text.Replace($"0/{num}", $"{(int)Mathf.Ceil(@float)}/{num}") + "\n[<color=yellow><b>" + text2 + "</b></color>] " + igniteStringConfig.Value;
			}
			if (!__instance.IsBurning())
			{
				return text;
			}
			if (__instance.m_wet)
			{
				return text;
			}
			if (extinguishItemsConfig.Value)
			{
				text = text + "\n[<color=yellow><b>" + text2 + "</b></color>] " + extinguishStringConfig.Value;
			}
			return text;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Player), "Update")]
		public static void PlayerUpdate_Patch(Player __instance)
		{
			//IL_0013: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)__instance) || !Input.GetKeyUp(configPOKey) || !extinguishItemsConfig.Value)
			{
				return;
			}
			Fireplace andCheckFireplace = GetAndCheckFireplace(__instance, checkIfBurning: false);
			if (!((Object)(object)andCheckFireplace == (Object)null))
			{
				ZDO zDO = andCheckFireplace.m_nview.GetZDO();
				bool flag = !zDO.GetBool("enabledFire", false);
				zDO.Set("enabledFire", flag);
				if (!flag)
				{
					andCheckFireplace.m_fuelAddedEffects.Create(((Component)andCheckFireplace).transform.position, ((Component)andCheckFireplace).transform.rotation, (Transform)null, 1f, -1);
					zDO.Set("fuel", 0f);
				}
				if (flag)
				{
					andCheckFireplace.m_fuelAddedEffects.Create(((Component)andCheckFireplace).transform.position, ((Component)andCheckFireplace).transform.rotation, (Transform)null, 1f, -1);
					zDO.Set("fuel", zDO.GetFloat("hiddenFuelAmount", 0f));
				}
			}
		}
	}
	public class VB_BuildDamage
	{
		public static class RPC_HealthChanged_Patch
		{
			public static bool Prefix(long peer, Piece ___m_piece, WearNTear __instance)
			{
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				foreach (PrivateArea allArea in PrivateArea.m_allAreas)
				{
					if (allArea.IsEnabled() && allArea.IsInside(((Component)__instance).transform.position, 0f))
					{
						if (___m_piece == null)
						{
							return true;
						}
						if (uncreatedDamageMultConfig.Value == 0f && ___m_piece.GetCreator() == 0)
						{
							return false;
						}
						if (nonCreatorDamageMultConfig.Value == 0f && ___m_piece.GetCreator() != 0L && peer != ___m_piece.GetCreator())
						{
							return false;
						}
						if (creatorDamageMultConfig.Value == 0f && ___m_piece.GetCreator() != 0L && peer == ___m_piece.GetCreator())
						{
							return false;
						}
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(WearNTear), "RPC_Damage")]
		public static class RPC_Damage_Patch
		{
			public static void Prefix(ref HitData hit, Piece ___m_piece, WearNTear __instance)
			{
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				foreach (PrivateArea allArea in PrivateArea.m_allAreas)
				{
					if (allArea.IsEnabled() && allArea.IsInside(((Component)__instance).transform.position, 0f))
					{
						if (!enableModBDConfig.Value)
						{
							break;
						}
						float num = 1f;
						_ = hit.m_attacker;
						num = (((ZDOID)(ref hit.m_attacker)).IsNone() ? naturalDamageMultConfig.Value : ((___m_piece != null && ___m_piece.GetCreator() == 0) ? uncreatedDamageMultConfig.Value : ((!(hit.m_attacker == ((Character)Player.m_localPlayer).GetZDOID()) || !((Object)(object)___m_piece != (Object)null) || !___m_piece.IsCreator()) ? nonCreatorDamageMultConfig.Value : creatorDamageMultConfig.Value)));
						MultiplyDamage(ref hit, num);
					}
				}
			}

			private static void MultiplyDamage(ref HitData hit, float value)
			{
				value = Math.Max(0f, value);
				hit.m_damage.m_damage *= value;
				hit.m_damage.m_blunt *= value;
				hit.m_damage.m_slash *= value;
				hit.m_damage.m_pierce *= value;
				hit.m_damage.m_chop *= value;
				hit.m_damage.m_pickaxe *= value;
				hit.m_damage.m_fire *= value;
				hit.m_damage.m_frost *= value;
				hit.m_damage.m_lightning *= value;
				hit.m_damage.m_poison *= value;
				hit.m_damage.m_spirit *= value;
			}
		}

		[HarmonyPatch(typeof(WearNTear), "ApplyDamage")]
		public static class ApplyDamage_Patch
		{
			public static void Prefix(ref float damage, WearNTear __instance)
			{
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				foreach (PrivateArea allArea in PrivateArea.m_allAreas)
				{
					if (allArea.IsEnabled() && allArea.IsInside(((Component)__instance).transform.position, 0f))
					{
						if (!enableModBDConfig.Value || Environment.StackTrace.Contains("RPC_Damage"))
						{
							break;
						}
						damage *= naturalDamageMultConfig.Value;
					}
				}
			}
		}

		public static ConfigEntry<bool> enableModBDConfig;

		public static ConfigEntry<float> creatorDamageMultConfig;

		public static ConfigEntry<float> nonCreatorDamageMultConfig;

		public static ConfigEntry<float> uncreatedDamageMultConfig;

		public static ConfigEntry<float> naturalDamageMultConfig;
	}
	[HarmonyPatch(typeof(MessageHud))]
	public static class VB_BetterPickupNotifications
	{
		private class PickupMessage : MsgData
		{
			public float Timer;
		}

		private class PickupDisplay
		{
			public GameObject RootGO;

			private Image IconComp;

			private TMP_Text TextComp;

			private int Index;

			public PickupDisplay(int index)
			{
				Index = index;
				CreateUI();
			}

			private void CreateUI()
			{
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: Unknown result type (might be due to invalid IL or missing references)
				//IL_009c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_0107: Unknown result type (might be due to invalid IL or missing references)
				//IL_0116: Unknown result type (might be due to invalid IL or missing references)
				//IL_011b: Unknown result type (might be due to invalid IL or missing references)
				//IL_012b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0130: Unknown result type (might be due to invalid IL or missing references)
				//IL_0138: Unknown result type (might be due to invalid IL or missing references)
				//IL_0147: Unknown result type (might be due to invalid IL or missing references)
				//IL_014c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0151: Unknown result type (might be due to invalid IL or missing references)
				RootGO = Object.Instantiate<GameObject>(((Component)((Component)MessageHud.instance.m_messageText).gameObject.transform.parent).gameObject, ((Component)MessageHud.instance.m_messageText).gameObject.transform.parent.parent);
				RootGO.transform.SetAsFirstSibling();
				IconComp = RootGO.GetComponentInChildren<Image>();
				TextComp = RootGO.GetComponentInChildren<TMP_Text>();
				Transform transform = RootGO.transform;
				Vector3 position = transform.position;
				Vector3 up = Vector3.up;
				Rect rect = ((Graphic)IconComp).rectTransform.rect;
				transform.position = position + up * (0f - ((Rect)(ref rect)).height * MessageVerticalSpacingModifier.Value) * (float)(Index + 1);
				Transform transform2 = ((Component)TextComp).gameObject.transform;
				Vector3 position2 = transform2.position;
				Vector3 up2 = Vector3.up;
				rect = ((Graphic)IconComp).rectTransform.rect;
				Vector3 val = up2 * (0f - ((Rect)(ref rect)).height) * MessageTextVerticalModifier.Value;
				Vector3 right = Vector3.right;
				rect = ((Graphic)IconComp).rectTransform.rect;
				transform2.position = position2 + (val + right * ((Rect)(ref rect)).width * MessageTextHorizontalSpacingModifier.Value);
			}

			public void Display(PickupMessage msg)
			{
				try
				{
					((Graphic)TextComp).canvasRenderer.SetAlpha(1f);
					((Graphic)TextComp).CrossFadeAlpha(1f, 0f, true);
					if (((MsgData)msg).m_amount > 1)
					{
						TextComp.text = ((MsgData)msg).m_text + " x" + ((MsgData)msg).m_amount;
					}
					else
					{
						TextComp.text = ((MsgData)msg).m_text;
					}
					IconComp.sprite = ((MsgData)msg).m_icon;
					((Graphic)IconComp).canvasRenderer.SetAlpha(1f);
					((Graphic)IconComp).CrossFadeAlpha(1f, 0f, true);
				}
				catch
				{
					if (msg != null && (Object)(object)((MsgData)msg).m_icon != (Object)null)
					{
						CreateUI();
						Display(msg);
					}
				}
			}

			public void FadeAway()
			{
				((Graphic)TextComp).CrossFadeAlpha(0f, MessageFadeTime.Value, true);
				((Graphic)IconComp).CrossFadeAlpha(0f, MessageFadeTime.Value, true);
			}
		}

		public static ConfigEntry<float> MessageLifetime;

		public static ConfigEntry<float> MessageFadeTime;

		public static ConfigEntry<float> MessageBumpTime;

		public static ConfigEntry<bool> ResetMessageTimerOnDupePickup;

		public static ConfigEntry<float> MessageVerticalSpacingModifier;

		public static ConfigEntry<float> MessageTextHorizontalSpacingModifier;

		public static ConfigEntry<float> MessageTextVerticalModifier;

		private static List<PickupMessage> PickupMessages;

		private static List<PickupDisplay> PickupDisplays;

		[HarmonyPatch("ShowMessage")]
		[HarmonyPrefix]
		public static bool ShowMessagePrefix(MessageHud __instance, MessageType type, string text, int amount, Sprite icon)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Invalid comparison between Unknown and I4
			if (Hud.IsUserHidden())
			{
				return false;
			}
			text = Localization.instance.Localize(text);
			if ((int)type == 2 || string.IsNullOrWhiteSpace(text) || amount < 1 || (Object)(object)icon == (Object)null)
			{
				return true;
			}
			int i;
			for (i = 0; i < PickupMessages.Count && (PickupMessages[i] == null || !(((MsgData)PickupMessages[i]).m_text == text)); i++)
			{
			}
			if (i == PickupMessages.Count)
			{
				i = PickupMessages.IndexOf(null);
				if (i < 0)
				{
					i = PickupMessages.Count;
					PickupMessages.Add(null);
					PickupDisplays.Add(new PickupDisplay(i));
				}
				PickupMessages[i] = new PickupMessage
				{
					m_text = text,
					m_amount = amount,
					m_icon = icon,
					Timer = MessageLifetime.Value
				};
				PickupDisplays[i].Display(PickupMessages[i]);
			}
			else
			{
				PickupMessage pickupMessage = PickupMessages[i];
				((MsgData)pickupMessage).m_amount = ((MsgData)pickupMessage).m_amount + amount;
				if (ResetMessageTimerOnDupePickup.Value)
				{
					PickupMessages[i].Timer = MessageLifetime.Value;
				}
				else
				{
					PickupMessages[i].Timer += MessageBumpTime.Value;
					if (PickupMessages[i].Timer > MessageLifetime.Value)
					{
						PickupMessages[i].Timer = MessageLifetime.Value;
					}
					PickupDisplays[i].Display(PickupMessages[i]);
				}
			}
			return false;
		}

		[HarmonyPatch("UpdateMessage")]
		[HarmonyPrefix]
		public static bool UpdateMessagePrefix(MessageHud __instance, float dt)
		{
			for (int i = 0; i < PickupMessages.Count; i++)
			{
				if (PickupMessages[i] != null)
				{
					PickupMessages[i].Timer -= dt;
					if (PickupMessages[i].Timer <= 0f)
					{
						PickupMessages[i] = null;
						PickupDisplays[i].FadeAway();
					}
				}
			}
			return true;
		}

		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		public static void AwakePostfix()
		{
			PickupMessages = new List<PickupMessage>();
			PickupDisplays = new List<PickupDisplay>();
		}

		[HarmonyPatch("OnDestroy")]
		[HarmonyPostfix]
		public static void OnDestroyPostfix()
		{
			PickupMessages = null;
			PickupDisplays = null;
		}
	}
	public static class VB_CustomSlotManager
	{
		public static readonly Dictionary<Humanoid, Dictionary<string, ItemData>> customSlotItemData = new Dictionary<Humanoid, Dictionary<string, ItemData>>();

		public static string GetCustomSlotName(ItemData item)
		{
			return item.m_dropPrefab.GetComponent<VB_CustomSlotItem>().m_slotName;
		}

		public static bool IsCustomSlotItem(ItemData item)
		{
			return item != null && Object.op_Implicit((Object)(object)item.m_dropPrefab) && Object.op_Implicit((Object)(object)item.m_dropPrefab.GetComponent<VB_CustomSlotItem>());
		}

		public static ItemData GetPrefabItemData(Humanoid humanoid, string slotName)
		{
			if (!DoesSlotExist(humanoid, slotName))
			{
				return null;
			}
			return customSlotItemData[humanoid][slotName].m_dropPrefab.GetComponent<ItemDrop>().m_itemData;
		}

		public static ItemData GetSlotItem(Humanoid humanoid, string slotName)
		{
			if (DoesSlotExist(humanoid, slotName))
			{
				return customSlotItemData[humanoid][slotName];
			}
			return null;
		}

		public static void SetSlotItem(Humanoid humanoid, string slotName, ItemData item)
		{
			customSlotItemData[humanoid][slotName] = item;
		}

		public static bool DoesSlotExist(Humanoid humanoid, string slotName)
		{
			return customSlotItemData[humanoid] != null && customSlotItemData[humanoid].ContainsKey(slotName);
		}

		public static bool IsSlotOccupied(Humanoid humanoid, string slotName)
		{
			return customSlotItemData[humanoid] != null && customSlotItemData[humanoid].ContainsKey(slotName) && customSlotItemData[humanoid][slotName] != null;
		}

		public static void ApplyCustomSlotItem(GameObject prefab, string slotName)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)prefab.GetComponent<VB_CustomSlotItem>()))
			{
				prefab.AddComponent<VB_CustomSlotItem>();
			}
			prefab.GetComponent<VB_CustomSlotItem>().m_slotName = slotName;
			prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_itemType = (ItemType)0;
		}
	}
	internal class VB_CustomSlotItem : MonoBehaviour
	{
		[HarmonyPatch]
		public class Patches
		{
			[HarmonyPatch]
			public class PatchSlot
			{
				[HarmonyPostfix]
				[HarmonyPatch(typeof(ZNetScene), "Awake")]
				private static void PrefabPostfix(ref ZNetScene __instance)
				{
					VB_CustomSlotManager.ApplyCustomSlotItem(__instance.GetPrefab("Wishbone"), "wishbone");
					VB_CustomSlotManager.ApplyCustomSlotItem(__instance.GetPrefab("Demister"), "wisplight");
				}
			}

			[HarmonyPatch(typeof(ItemData), "IsEquipable")]
			[HarmonyPostfix]
			private static void IsEquipablePostfix(ref bool __result, ref ItemData __instance)
			{
				__result = __result || VB_CustomSlotManager.IsCustomSlotItem(__instance);
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(Humanoid), "Awake")]
			private static void HumanoidEntryPostfix(ref Humanoid __instance)
			{
				VB_CustomSlotManager.customSlotItemData[__instance] = new Dictionary<string, ItemData>();
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(Player), "Load")]
			private static void InventoryLoadPostfix(ref Player __instance)
			{
				foreach (ItemData equippedItem in ((Humanoid)__instance).m_inventory.GetEquippedItems())
				{
					if (VB_CustomSlotManager.IsCustomSlotItem(equippedItem))
					{
						string customSlotName = VB_CustomSlotManager.GetCustomSlotName(equippedItem);
						VB_CustomSlotManager.SetSlotItem((Humanoid)(object)__instance, customSlotName, equippedItem);
					}
				}
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(Humanoid), "EquipItem")]
			private static void EquipItemPostfix(ref bool __result, ref Humanoid __instance, ItemData item, bool triggerEquipEffects = true)
			{
				if (__result && VB_CustomSlotManager.IsCustomSlotItem(item))
				{
					string customSlotName = VB_CustomSlotManager.GetCustomSlotName(item);
					if (VB_CustomSlotManager.IsSlotOccupied(__instance, customSlotName))
					{
						__instance.UnequipItem(VB_CustomSlotManager.GetSlotItem(__instance, customSlotName), triggerEquipEffects);
					}
					VB_CustomSlotManager.SetSlotItem(__instance, customSlotName, item);
					if (__instance.IsItemEquiped(item))
					{
						item.m_equipped = true;
					}
					__instance.SetupEquipment();
					if (triggerEquipEffects)
					{
						__instance.TriggerEquipEffect(item);
					}
					__result = true;
				}
			}

			[HarmonyPatch(typeof(Humanoid), "UnequipItem")]
			[HarmonyPostfix]
			private static void UnequipItemPostfix(ref Humanoid __instance, ItemData item, bool triggerEquipEffects = true)
			{
				if (VB_CustomSlotManager.IsCustomSlotItem(item))
				{
					string customSlotName = VB_CustomSlotManager.GetCustomSlotName(item);
					if (item == VB_CustomSlotManager.GetSlotItem(__instance, customSlotName))
					{
						VB_CustomSlotManager.SetSlotItem(__instance, customSlotName, null);
					}
					__instance.UpdateEquipmentStatusEffects();
				}
			}

			[HarmonyPatch(typeof(Humanoid), "IsItemEquiped")]
			[HarmonyPostfix]
			private static void IsItemEquipedPostfix(ref bool __result, ref Humanoid __instance, ItemData item)
			{
				if (VB_CustomSlotManager.IsCustomSlotItem(item))
				{
					string customSlotName = VB_CustomSlotManager.GetCustomSlotName(item);
					bool flag = VB_CustomSlotManager.DoesSlotExist(__instance, customSlotName) && VB_CustomSlotManager.GetSlotItem(__instance, customSlotName) == item;
					__result |= flag;
				}
			}

			[HarmonyPatch(typeof(Humanoid), "GetEquipmentWeight")]
			[HarmonyPostfix]
			private static void GetEquipmentWeightPostfix(ref float __result, ref Humanoid __instance)
			{
				foreach (string key in VB_CustomSlotManager.customSlotItemData[__instance].Keys)
				{
					if (VB_CustomSlotManager.IsSlotOccupied(__instance, key))
					{
						__result += VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_weight;
					}
				}
			}

			[HarmonyPatch(typeof(Humanoid), "UnequipAllItems")]
			[HarmonyPostfix]
			private static void UnequipAllItemsPostfix(ref Humanoid __instance)
			{
				foreach (string item in VB_CustomSlotManager.customSlotItemData[__instance].Keys.ToList())
				{
					if (VB_CustomSlotManager.IsSlotOccupied(__instance, item))
					{
						__instance.UnequipItem(VB_CustomSlotManager.GetSlotItem(__instance, item), false);
					}
				}
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(Humanoid), "GetSetCount")]
			private static void GetSetCountPostfix(ref int __result, ref Humanoid __instance, string setName)
			{
				foreach (string item in VB_CustomSlotManager.customSlotItemData[__instance].Keys.ToList())
				{
					if (VB_CustomSlotManager.IsSlotOccupied(__instance, item) && VB_CustomSlotManager.GetSlotItem(__instance, item).m_shared.m_setName == setName)
					{
						__result++;
					}
				}
			}

			public static HashSet<StatusEffect> GetStatusEffectsFromCustomSlotItems(Humanoid __instance)
			{
				HashSet<StatusEffect> hashSet = new HashSet<StatusEffect>();
				foreach (string key in VB_CustomSlotManager.customSlotItemData[__instance].Keys)
				{
					if (VB_CustomSlotManager.IsSlotOccupied(__instance, key))
					{
						if (Object.op_Implicit((Object)(object)VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_equipStatusEffect))
						{
							StatusEffect equipStatusEffect = VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_equipStatusEffect;
							hashSet.Add(equipStatusEffect);
						}
						if (__instance.HaveSetEffect(VB_CustomSlotManager.GetSlotItem(__instance, key)))
						{
							StatusEffect setStatusEffect = VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_setStatusEffect;
							hashSet.Add(setStatusEffect);
						}
					}
				}
				return hashSet;
			}

			[HarmonyPatch(typeof(Humanoid), "UpdateEquipmentStatusEffects")]
			[HarmonyTranspiler]
			private static IEnumerable<CodeInstruction> UpdateEquipmentStatusEffectsTranspiler(IEnumerable<CodeInstruction> instructions)
			{
				List<CodeInstruction> codes = instructions.ToList();
				if (codes[0].opcode != OpCodes.Newobj || codes[1].opcode != OpCodes.Stloc_0)
				{
					throw new Exception("CustomSlotItemLib Transpiler injection point NOT found!! Game has most likely updated and broken this mod!");
				}
				yield return codes[0];
				yield return codes[1];
				yield return new CodeInstruction(OpCodes.Ldloc_0, (object)null);
				yield return new CodeInstruction(OpCodes.Ldarg_0, (object)null);
				yield return CodeInstruction.Call(typeof(Patches), "GetStatusEffectsFromCustomSlotItems", (Type[])null, (Type[])null);
				yield return CodeInstruction.Call(typeof(HashSet<StatusEffect>), "UnionWith", (Type[])null, (Type[])null);
				for (int i = 2; i < codes.Count; i++)
				{
					yield return codes[i];
				}
			}
		}

		public string m_slotName;
	}
	[BepInPlugin("VitByr.VBQOL", "VBQOL", "0.2.2")]
	internal class VBQOL : BaseUnityPlugin
	{
		public enum TabPositions
		{
			Left,
			Middle,
			Right
		}

		[HarmonyPatch]
		public static class Patches
		{
			[HarmonyPrefix]
			[HarmonyPatch(typeof(Character), "IsSwimming")]
			public static bool IsSwimming_Prefix(Humanoid __instance, float ___m_swimTimer, ref bool __result)
			{
				if (___m_swimTimer >= 0.5f)
				{
					return true;
				}
				StackTrace stackTrace = new StackTrace();
				string text = "";
				for (int i = 2; i < stackTrace.FrameCount && i < 10; i++)
				{
					text = text + GeneralExtensions.FullDescription(stackTrace.GetFrame(i).GetMethod()) + "_";
				}
				if (!((Character)__instance).IsPlayer() || (!text.Contains("UpdateEquipment") && !text.Contains("EquipItem")))
				{
					return true;
				}
				if ((__instance.GetRightItem() != null && !EiW_Custom.Value.Split(',').Contains(((Object)__instance.GetRightItem().m_dropPrefab).name)) || (__instance.GetLeftItem() != null && !EiW_Custom.Value.Split(',').Contains(((Object)__instance.GetLeftItem().m_dropPrefab).name)))
				{
					__instance.HideHandItems();
				}
				return false;
			}

			[HarmonyPrefix]
			[HarmonyPatch(typeof(Humanoid), "EquipItem")]
			private static void EquipItem_Prefix()
			{
			}

			[HarmonyPatch(typeof(Humanoid), "UpdateEquipment")]
			[HarmonyPrefix]
			private static void UpdateEquipment_Prefix()
			{
			}
		}

		[CompilerGenerated]
		[Embedded]
		internal sealed class EmbeddedAttribute : Attribute
		{
		}

		[CompilerGenerated]
		[Embedded]
		[AttributeUsage(AttributeTargets.Module)]
		internal sealed class RefSafetyRulesAttribute : Attribute
		{
			public readonly int Version;

			public RefSafetyRulesAttribute(int A_1)
			{
				Version = A_1;
			}
		}

		[HarmonyPatch(typeof(ZNet), "Start")]
		private static class FejdStartup_Start_Patch
		{
			[UsedImplicitly]
			private static void Postfix()
			{
				if (IsServer)
				{
					Application.targetFrameRate = ((BaseUnityPlugin)self).Config.Bind<int>("01 - General", "Target_FPS", Application.targetFrameRate, "Целевой FPS").Value;
				}
			}
		}

		[HarmonyPatch]
		private static class PatchMethods
		{
			[HarmonyTargetMethods]
			private static IEnumerable<MethodBase> Target()
			{
				yield return AccessTools.Method(typeof(ZSteamSocket), "Send", new Type[1] { typeof(ZPackage) }, (Type[])null);
				yield return AccessTools.Method(typeof(ZSteamSocket), "Flush", (Type[])null, (Type[])null);
				yield return AccessTools.Method(typeof(ZSteamSocket), "Update", (Type[])null, (Type[])null);
			}

			[HarmonyTranspiler]
			private static IEnumerable<CodeInstruction> FixingIssue(IEnumerable<CodeInstruction> code)
			{
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0094: Expected O, but got Unknown
				List<CodeInstruction> list = new List<CodeInstruction>(code);
				MethodInfo methodInfo = AccessTools.Method(typeof(VBQOL), IsServer ? "Replacement_Server" : "Replacement_Client", (Type[])null, (Type[])null);
				MethodInfo targetMethod = AccessTools.Method(typeof(ZSteamSocket), "SendQueuedPackages", (Type[])null, (Type[])null);
				int num = list.FindIndex((CodeInstruction ins) => ins.opcode == OpCodes.Call && ins.operand == targetMethod);
				if (num == -1)
				{
					Logger.LogError((object)"VBQOL: Не удалось найти callvirt to ZSteamSocket.SendQueuedPackages");
					return list;
				}
				list[num] = new CodeInstruction(OpCodes.Call, (object)methodInfo);
				return list;
			}
		}

		private const string ModName = "VBQOL";

		private const string ModVersion = "0.2.2";

		private const string ModGUID = "VitByr.VBQOL";

		private Harmony harmony = new Harmony("VitByr.VBQOL");

		internal static VBQOL self;

		private static ConfigEntry<string> EiW_Custom;

		internal ConfigEntry<int> nomorecrashes;

		internal GameObject recycleObject;

		internal Button recycleButton;

		internal float width;

		private Vector3 craftingPos;

		internal ConfigEntry<TabPositions> tabPosition;

		internal ConfigEntry<float> resourceMultiplier;

		internal ConfigEntry<bool> preserveOriginalItem;

		internal ConfigEntry<string> recyclebuttontext;

		private static string ConfigFileName = "VitByr.VBQOL.cfg";

		private static string ConfigFileFullPath = Paths.ConfigPath + Path.DirectorySeparatorChar + ConfigFileName;

		private DateTime LastConfigChange;

		private static ConfigEntry<bool> serverConfigLocked = null;

		public Action OnConfigurationChanged;

		public static readonly ManualLogSource Logger = Logger.CreateLogSource("VBQOL");

		public readonly ConfigSync configSync = new ConfigSync("VBQOL")
		{
			DisplayName = "VBQOL",
			CurrentVersion = "0.2.2",
			MinimumRequiredVersion = "0.2.2"
		};

		private static ConfigEntry<float> Timeout { get; set; }

		private static bool IsServer => (int)SystemInfo.graphicsDeviceType == 4;

		internal bool InTabDeconstruct()
		{
			return !((Selectable)recycleButton).interactable;
		}

		private void Awake()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_02f5: 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_030d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			self = this;
			Harmony.CreateAndPatchAll(typeof(VB_ClearLogPatch), (string)null);
			serverConfigLocked = config("01 - Awake", "Lock Configuration", value: true, new ConfigDescription("Вкл/ Выкл синхронизацию с сервером.", (AcceptableValueBase)null, Array.Empty<object>()));
			configSync.AddLockingConfigEntry<bool>(serverConfigLocked);
			nomorecrashes = config("01 - General", "Target_FPS", Application.targetFrameRate, "Целевой FPS", synchronizedSetting: false);
			Timeout = config("01 - General", "Timeout", 90f, "Время ожидания в секундах");
			VB_AddAllFuel.AFModifierKeyConfig = config<KeyCode>("02 - AddAllFuel", "AFModifierKey", (KeyCode)304, "Клавиша для добавления сразу стака в печь/ плавильню.", synchronizedSetting: false);
			VB_AddAllFuel.AFTextConfig = config("02 - AddAllFuel", "AF_Extinguish_Text", "Добавить стак", "Текст отображаемый при наведении печь/костер", synchronizedSetting: false);
			VB_BuildDamage.enableModBDConfig = config("03 - BuildDamage", "BD_Enable_Section", value: true, "Включите или отключите этот раздел");
			VB_BuildDamage.creatorDamageMultConfig = config("03 - BuildDamage", "BD_CreatorDamageMult", 0.75f, "Множитель урона от создателя постройки");
			VB_BuildDamage.nonCreatorDamageMultConfig = config("03 - BuildDamage", "BD_NonCreatorDamageMult", 0.05f, "Множитель урона от не создателя постройки");
			VB_BuildDamage.uncreatedDamageMultConfig = config("03 - BuildDamage", "BD_UncreatedDamageMult", 0.75f, "Множитель урона постройкам не созданным игроком");
			VB_BuildDamage.naturalDamageMultConfig = config("03 - BuildDamage", "BD_NaturalDamageMult", 0.75f, "Множитель урона от погоды и монстров.");
			VB_BetterPickupNotifications.MessageLifetime = config("04 - BetterPickupNotifications", "BPN_MessageLifetime", 4f, "Как долго уведомление отображается в HUD, прежде чем исчезнуть", synchronizedSetting: false);
			VB_BetterPickupNotifications.MessageFadeTime = config("04 - BetterPickupNotifications", "BPN_MessageFadeTime", 2f, "Как долго исчезают уведомления", synchronizedSetting: false);
			VB_BetterPickupNotifications.MessageBumpTime = config("04 - BetterPickupNotifications", "BPN_MessageBumpTime", 2f, "Сколько времени добавлять к сроку действия уведомления при получении дублирующегося элемента", synchronizedSetting: false);
			VB_BetterPickupNotifications.ResetMessageTimerOnDupePickup = config("04 - BetterPickupNotifications", "BPN_ResetMessageTimerOnDupePickup", value: false, "Сбрасывает таймер уведомления на максимальное время жизни при получении дублирующегося предмета", synchronizedSetting: false);
			VB_BetterPickupNotifications.MessageVerticalSpacingModifier = config("04 - BetterPickupNotifications", "BPN_MessageVerticalSpacingModifier", 1.25f, "Вертикальное разделение между сообщениями");
			VB_BetterPickupNotifications.MessageTextHorizontalSpacingModifier = config("04 - BetterPickupNotifications", "BPN_MessageTextHorizontalSpacingModifier", 2f, "Горизонтальный интервал между иконкой и текста уведомлений", synchronizedSetting: false);
			VB_BetterPickupNotifications.MessageTextVerticalModifier = config("04 - BetterPickupNotifications", "BPN_MessageTextVerticalModifier", 1f, "Вертикальное выравнивание текста уведомлений", synchronizedSetting: false);
			EiW_Custom = config("05 - EquipInWater", "EiW_Custom", "KnifeFlint,KnifeCopper,KnifeChitin,KnifeSilver,KnifeBlackMetal,KnifeButcher,KnifeSkollAndHati,SpearFlint,SpearBronze,SpearElderbark,SpearWolfFang,SpearChitin,SpearCarapace,PickaxeAntler,PickaxeBronze,PickaxeIron,PickaxeBlackMetal,Hammer,Hoe,FistFenrirClaw", "Разрешить использовать оружие/инструмент в воде");
			VB_FirePlaceUtilites.extinguishItemsConfig = config("06 - EnableFire", "EF_Enable", value: true, "Вкл/Выкл секцию");
			VB_FirePlaceUtilites.extinguishStringConfig = config("06 - EnableFire", "EF_Extinguish_Fire_Text", "Тушить огонь", "Текст отображаемый при наведении курсора на огонь", synchronizedSetting: false);
			VB_FirePlaceUtilites.igniteStringConfig = config("06 - EnableFire", "EF_Ignite_Fire_Text", "Разжечь огонь", "Текст, отображаемый при наведении курсора на огонь, если тот потушен", synchronizedSetting: false);
			VB_FirePlaceUtilites.keyPOCodeStringConfig = config<KeyCode>("06 - EnableFire", "EF_Put_Out_Fire_Key", (KeyCode)308, "Клавиша чтобы потушить огонь.", synchronizedSetting: false);
			Type typeFromHandle = typeof(KeyCode);
			KeyCode value = VB_FirePlaceUtilites.keyPOCodeStringConfig.Value;
			VB_FirePlaceUtilites.configPOKey = (KeyCode)Enum.Parse(typeFromHandle, ((object)(KeyCode)(ref value)).ToString());
			tabPosition = config("07 - Recycle", "R_TabPosition", TabPositions.Left, "Положение вкладки Разобрать в меню крафта. (Требуется перезапуск)", synchronizedSetting: false);
			resourceMultiplier = config("07 - Recycle", "R_ResourceMultiplier", 0.35f, "Количество ресурсов, возвращаемых в результате разбора (от 0 до 1, где 1 возвращает 100% ресурсов, а 0 - 0%)");
			preserveOriginalItem = config("07 - Recycle", "R_PreserveOriginalItem", value: true, "Сохранять ли данные оригинального предмета при понижении уровня. Полезно для модов, добавляющих дополнительные свойства к предметам, например EpicLoot.\nОтключите, если возникли проблемы.");
			recyclebuttontext = config("07 - Recycle", "R_RecycleButtonText", "Разобрать", "Текст кнопки в меню крафта", synchronizedSetting: false);
			QualitySettings.softParticles = false;
			QualitySettings.particleRaycastBudget = 1024;
			QualitySettings.softVegetation = false;
			QualitySettings.streamingMipmapsMemoryBudget = 4096f;
			SetupWatcher();
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_AddAllFuel), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_Swampkey), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_BlastFurnaceTalesAll), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_FeedFromHandPatch), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_Pickable_UpdateRespawn_Patch), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_SlopeDamagePatch), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_SnakeCameraPatch), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_Timeout_Patch), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_CraftingStationLevelRange), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_AshLandsFix), (string)null);
			Harmony.CreateAndPatchAll(typeof(VB_WardPatch), (string)null);
		}

		public static int GetModifiedAmount(int quality, Requirement requirement)
		{
			return (int)Math.Round(self.resourceMultiplier.Value * (float)requirement.GetAmount(quality), 0);
		}

		public static bool HaveEmptySlotsForRecipe(Inventory inventory, Recipe recipe, int quality)
		{
			int emptySlots = inventory.GetEmptySlots();
			int num = 0;
			Requirement[] resources = recipe.m_resources;
			foreach (Requirement requirement in resources)
			{
				if (GetModifiedAmount(quality, requirement) > 0)
				{
					num++;
				}
			}
			if (emptySlo