Decompiled source of Immersive Auto Fuelers v1.1.1

plugins/ImmersiveAutoFuelers/ImmersiveAutoFuelers.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.UI;

[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: CompilationRelaxations(8)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace WoodkeeperMod;

[BepInPlugin("camde.valheim.immersiveautofuelers", "Immersive Auto Fuelers", "1.1.1")]
public sealed class Plugin : BaseUnityPlugin
{
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	private static class ConfigNetwork
	{
		private static void Postfix(ZRoutedRpc __instance)
		{
			if (object.ReferenceEquals(registeredRpc, __instance))
			{
				return;
			}
			registeredRpc = __instance;
			hasServerSettings = false;
			__instance.Register("IAF_RequestConfig", (Action<long>)delegate(long sender)
			{
				if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer())
				{
					__instance.InvokeRoutedRPC(sender, "IAF_ConfigV2", new object[4] { BuildMenu.Value, FuelRadius.Value, LampMenu.Value, LampFuelRadius.Value });
				}
			});
			__instance.Register<bool, float, bool, float>("IAF_ConfigV2", (Method<bool, float, bool, float>)delegate(long sender, bool menu, float radius, bool lampMenu, float lampRadius)
			{
				if (Object.op_Implicit((Object)(object)ZNet.instance) && !ZNet.instance.IsServer())
				{
					ZNetPeer serverPeer = ZNet.instance.GetServerPeer();
					if (serverPeer != null && serverPeer.m_uid == sender && !float.IsNaN(radius) && !float.IsInfinity(radius) && !float.IsNaN(lampRadius) && !float.IsInfinity(lampRadius))
					{
						radius = Mathf.Clamp(radius, 1f, 128f);
						lampRadius = Mathf.Clamp(lampRadius, 1f, 128f);
						bool flag = !hasServerSettings || serverMenu != menu || serverRadius != radius || serverLampMenu != lampMenu || serverLampRadius != lampRadius;
						serverLampMenu = lampMenu;
						serverLampRadius = lampRadius;
						serverMenu = menu;
						serverRadius = radius;
						hasServerSettings = true;
						if (flag)
						{
							ApplyConfig();
						}
					}
				}
			});
		}
	}

	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	private static class Register
	{
		private static void Prefix(ZNetScene __instance)
		{
			if (!Object.op_Implicit((Object)(object)Prefab))
			{
				Build(__instance);
			}
			if (!__instance.m_prefabs.Contains(Prefab))
			{
				__instance.m_prefabs.Add(Prefab);
			}
			if (Object.op_Implicit((Object)(object)LampPrefab) && !__instance.m_prefabs.Contains(LampPrefab))
			{
				__instance.m_prefabs.Add(LampPrefab);
			}
			if (Object.op_Implicit((Object)(object)Scuttle.Prefab) && !__instance.m_prefabs.Contains(Scuttle.Prefab))
			{
				__instance.m_prefabs.Add(Scuttle.Prefab);
			}
			AddToHammer(ObjectDB.instance);
		}
	}

	[HarmonyPatch(typeof(ObjectDB), "Awake")]
	private static class DatabaseReady
	{
		private static void Postfix(ObjectDB __instance)
		{
			AddToHammer(__instance);
		}
	}

	[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
	private static class DatabaseCopied
	{
		private static void Postfix(ObjectDB __instance)
		{
			AddToHammer(__instance);
		}
	}

	[HarmonyPatch(typeof(Piece), "DropResources")]
	private static class LegacyRefund
	{
		private static void Prefix(Piece __instance, out Requirement[] __state)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			__state = null;
			if (!Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<Woodkeeper>()))
			{
				return;
			}
			ZNetView component = ((Component)__instance).GetComponent<ZNetView>();
			if (Object.op_Implicit((Object)(object)component) && component.IsValid())
			{
				byte[] byteArray = component.GetZDO().GetByteArray("woodkeeper_axe", (byte[])null);
				if (byteArray != null && byteArray.Length != 0)
				{
					__state = __instance.m_resources;
					Requirement[] array = (Requirement[])(object)new Requirement[1];
					Requirement val = new Requirement();
					val.m_resItem = ObjectDB.instance.GetItemPrefab("Wood").GetComponent<ItemDrop>();
					val.m_amount = 50;
					val.m_amountPerLevel = 0;
					val.m_recover = true;
					array[0] = val;
					__instance.m_resources = array;
				}
			}
		}

		private static Exception Finalizer(Piece __instance, Requirement[] __state, Exception __exception)
		{
			if (__state != null)
			{
				__instance.m_resources = __state;
			}
			return __exception;
		}
	}

	[HarmonyPatch(typeof(Fireplace), "Awake")]
	private static class RegisterFireToggle
	{
		private static void Postfix(Fireplace __instance)
		{
			ZNetView view = ((Component)__instance).GetComponent<ZNetView>();
			if (!Object.op_Implicit((Object)(object)view) || !view.IsValid())
			{
				return;
			}
			view.Register("Woodkeeper_ToggleAutoFuel", (Action<long>)delegate
			{
				if (view.IsOwner() && Woodkeeper.InRange(__instance))
				{
					ZDO zDO = view.GetZDO();
					zDO.Set("woodkeeper_auto_fuel_disabled", !zDO.GetBool("woodkeeper_auto_fuel_disabled", false));
				}
			});
		}
	}

	[HarmonyPatch(typeof(Fireplace), "GetHoverText")]
	private static class FireHover
	{
		private static void Postfix(Fireplace __instance, ref string __result)
		{
			if (!string.IsNullOrEmpty(__result) && Woodkeeper.InRange(__instance))
			{
				bool flag = ((Component)__instance).GetComponent<ZNetView>().GetZDO().GetBool("woodkeeper_auto_fuel_disabled", false);
				Woodkeeper woodkeeper = Woodkeeper.Supplier(__instance);
				string status = (flag ? "" : L10n.Status(Object.op_Implicit((Object)(object)woodkeeper) ? woodkeeper.Kind : 0));
				string hint = L10n.Hint(flag);
				__result = Rules.InsertFuelStatus(__result, status, hint);
				string[] array = __result.Split('\n');
				if (array.Length > 1)
				{
					array[1] = "<nobr>" + array[1] + "</nobr>";
				}
				__result = string.Join("\n", array);
			}
		}
	}

	[HarmonyPatch(typeof(Fireplace), "Interact")]
	private static class FireInteract
	{
		private static bool Prefix(Fireplace __instance, bool hold, bool alt, ref bool __result)
		{
			if (!alt || !Woodkeeper.InRange(__instance))
			{
				return true;
			}
			__result = false;
			if (!hold)
			{
				ZNetView component = ((Component)__instance).GetComponent<ZNetView>();
				if (!component.HasOwner())
				{
					component.ClaimOwnership();
				}
				component.InvokeRPC("Woodkeeper_ToggleAutoFuel", new object[0]);
				__result = true;
			}
			return false;
		}
	}

	internal const string PrefabName = "piece_woodkeeper";

	internal static GameObject Root;

	internal static GameObject Prefab;

	internal static ManualLogSource Log;

	private Harmony harmony;

	internal static ConfigEntry<bool> BuildMenu;

	internal static ConfigEntry<float> FuelRadius;

	internal static ConfigEntry<bool> LampMenu;

	internal static ConfigEntry<float> LampFuelRadius;

	internal static GameObject LampPrefab;

	private static bool serverLampMenu;

	private static float serverLampRadius;

	private static bool serverMenu;

	private static bool hasServerSettings;

	private static float serverRadius;

	private static ZRoutedRpc registeredRpc;

	private float nextConfigRequest;

	private float nextLocalizationCheck;

	private static Sprite menuIcon;

	internal static float LampRadius
	{
		get
		{
			if (!hasServerSettings)
			{
				return LampFuelRadius.Value;
			}
			return serverLampRadius;
		}
	}

	internal static float Radius
	{
		get
		{
			if (!hasServerSettings)
			{
				return FuelRadius.Value;
			}
			return serverRadius;
		}
	}

	private static bool MenuEnabled
	{
		get
		{
			if (!hasServerSettings)
			{
				return BuildMenu.Value;
			}
			return serverMenu;
		}
	}

	internal static bool ConfigReady
	{
		get
		{
			if (Object.op_Implicit((Object)(object)ZNet.instance) && !ZNet.instance.IsServer())
			{
				return hasServerSettings;
			}
			return true;
		}
	}

	private static void ApplyConfig()
	{
		L10n.Refresh();
		AddToHammer(ObjectDB.instance);
		if (Object.op_Implicit((Object)(object)Prefab))
		{
			Prefab.GetComponent<Piece>().m_description = "$iaf_desc_rack";
		}
		if (Object.op_Implicit((Object)(object)LampPrefab))
		{
			LampPrefab.GetComponent<Piece>().m_description = "$iaf_desc_lamp";
		}
		if (Object.op_Implicit((Object)(object)Player.m_localPlayer))
		{
			AccessTools.Method(typeof(Player), "UpdateAvailablePiecesList", (Type[])null, (Type[])null).Invoke(Player.m_localPlayer, null);
		}
	}

	private void Update()
	{
		Diagnostics.Pump();
		if (Time.unscaledTime >= nextLocalizationCheck)
		{
			nextLocalizationCheck = Time.unscaledTime + 3f;
			L10n.TryConfigHook();
		}
		if (!Object.op_Implicit((Object)(object)ZNet.instance) || ZRoutedRpc.instance == null)
		{
			hasServerSettings = false;
		}
		else
		{
			if (Time.unscaledTime < nextConfigRequest)
			{
				return;
			}
			nextConfigRequest = Time.unscaledTime + 3f;
			if (!ZNet.instance.IsServer())
			{
				ZNetPeer serverPeer = ZNet.instance.GetServerPeer();
				if (serverPeer != null)
				{
					ZRoutedRpc.instance.InvokeRoutedRPC(serverPeer.m_uid, "IAF_RequestConfig", new object[0]);
					ZRoutedRpc.instance.InvokeRoutedRPC(serverPeer.m_uid, "IAF_RequestScuttle", new object[0]);
				}
			}
		}
	}

	private static Sprite GetMenuIcon()
	{
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Expected O, but got Unknown
		//IL_009d: 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)
		if (Object.op_Implicit((Object)(object)menuIcon))
		{
			return menuIcon;
		}
		using Stream stream = typeof(Plugin).Assembly.GetManifestResourceStream("Woodkeeper.Icon.png");
		if (stream == null)
		{
			throw new InvalidOperationException("Woodkeeper menu icon resource is missing.");
		}
		using MemoryStream memoryStream = new MemoryStream();
		stream.CopyTo(memoryStream);
		Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
		((Object)val).name = "Woodkeeper_MenuIcon";
		if (!ImageConversion.LoadImage(val, memoryStream.ToArray(), true))
		{
			throw new InvalidOperationException("Woodkeeper menu icon could not be decoded.");
		}
		((Texture)val).filterMode = (FilterMode)1;
		((Texture)val).wrapMode = (TextureWrapMode)1;
		menuIcon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f);
		((Object)menuIcon).name = "Woodkeeper_MenuIcon";
		return menuIcon;
	}

	private void Awake()
	{
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Expected O, but got Unknown
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_019d: Expected O, but got Unknown
		//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ff: Expected O, but got Unknown
		//IL_021a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Expected O, but got Unknown
		Log = ((BaseUnityPlugin)this).Logger;
		L10n.Prepare();
		Diagnostics.Init(((BaseUnityPlugin)this).Config);
		Scuttle.Configure(((BaseUnityPlugin)this).Config);
		ConfigEntry<bool> val = default(ConfigEntry<bool>);
		bool flag = !((BaseUnityPlugin)this).Config.TryGetEntry<bool>("Wood Keeper", "Show in build menu", ref val) || val.Value;
		ConfigEntry<float> val2 = default(ConfigEntry<float>);
		float num = (((BaseUnityPlugin)this).Config.TryGetEntry<float>("Wood Keeper", "Fuel radius", ref val2) ? val2.Value : 12f);
		BuildMenu = ((BaseUnityPlugin)this).Config.Bind<bool>("Firewood Rack", "Show in build menu", flag, L10n.Text("cfg_show_desc"));
		FuelRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Firewood Rack", "Fuel radius", num, new ConfigDescription(L10n.Text("cfg_radius_desc"), (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 128f), new object[0]));
		BuildMenu.SettingChanged += delegate
		{
			ApplyConfig();
		};
		FuelRadius.SettingChanged += delegate
		{
			ApplyConfig();
		};
		LampMenu = ((BaseUnityPlugin)this).Config.Bind<bool>("Lamplighters Barrel", "Show in build menu", true, L10n.Text("cfg_show_desc"));
		LampFuelRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Lamplighters Barrel", "Fuel radius", 12f, new ConfigDescription(L10n.Text("cfg_radius_desc"), (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 128f), new object[0]));
		LampMenu.SettingChanged += delegate
		{
			ApplyConfig();
		};
		LampFuelRadius.SettingChanged += delegate
		{
			ApplyConfig();
		};
		Root = new GameObject("Woodkeeper_Prefabs");
		Root.SetActive(false);
		Object.DontDestroyOnLoad((Object)(object)Root);
		harmony = new Harmony("camde.valheim.immersiveautofuelers");
		harmony.PatchAll(typeof(Plugin).Assembly);
		L10n.Initialize(harmony);
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Immersive Auto Fuelers 1.1.1 loaded.");
	}

	private void OnApplicationQuit()
	{
		Diagnostics.Shutdown();
	}

	private void OnDestroy()
	{
		Diagnostics.Shutdown();
		if (harmony != null)
		{
			harmony.UnpatchSelf();
		}
	}

	internal static GameObject Visual(GameObject source, Transform parent, string name)
	{
		GameObject val = Object.Instantiate<GameObject>(source, parent);
		((Object)val).name = name;
		foreach (Component item in val.GetComponentsInChildren<Component>(true).Reverse())
		{
			if (Object.op_Implicit((Object)(object)item) && !(item is Transform) && !(item is Renderer) && !(item is MeshFilter) && !(item is LODGroup))
			{
				Object.DestroyImmediate((Object)(object)item);
			}
		}
		KeepVisibleLODs(val);
		val.SetActive(true);
		return val;
	}

	internal static void KeepVisibleLODs(GameObject visual)
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		LODGroup[] componentsInChildren = visual.GetComponentsInChildren<LODGroup>(true);
		foreach (LODGroup val in componentsInChildren)
		{
			List<LOD> list = new List<LOD>();
			LOD[] lODs = val.GetLODs();
			for (int j = 0; j < lODs.Length; j++)
			{
				LOD val2 = lODs[j];
				Renderer[] array = val2.renderers.Where((Renderer r) => Object.op_Implicit((Object)(object)r) && (!Object.op_Implicit((Object)(object)((Component)r).GetComponent<MeshFilter>()) || (Object.op_Implicit((Object)(object)((Component)r).GetComponent<MeshFilter>().sharedMesh) && ((Component)r).GetComponent<MeshFilter>().sharedMesh.vertexCount > 0))).ToArray();
				if (array.Length > 0)
				{
					list.Add(new LOD(val2.screenRelativeTransitionHeight, array));
				}
			}
			if (list.Count != 0)
			{
				LOD value = list[list.Count - 1];
				value.screenRelativeTransitionHeight = 0f;
				list[list.Count - 1] = value;
				val.SetLODs(list.ToArray());
				val.RecalculateBounds();
			}
		}
	}

	private static void Build(ZNetScene scene)
	{
		//IL_0214: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: Unknown result type (might be due to invalid IL or missing references)
		//IL_0245: Unknown result type (might be due to invalid IL or missing references)
		//IL_024f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0291: Unknown result type (might be due to invalid IL or missing references)
		//IL_0296: Unknown result type (might be due to invalid IL or missing references)
		//IL_036c: Unknown result type (might be due to invalid IL or missing references)
		//IL_037e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0388: Unknown result type (might be due to invalid IL or missing references)
		//IL_039a: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0403: Unknown result type (might be due to invalid IL or missing references)
		//IL_040d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0428: Unknown result type (might be due to invalid IL or missing references)
		//IL_0432: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_04bd: Expected O, but got Unknown
		//IL_04ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_04f1: Expected O, but got Unknown
		//IL_051d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0524: Expected O, but got Unknown
		//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0306: Unknown result type (might be due to invalid IL or missing references)
		//IL_0308: 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)
		Func<string, GameObject> func = (string name) => scene.m_prefabs.Find((GameObject p) => Object.op_Implicit((Object)(object)p) && ((Object)p).name == name);
		GameObject val = func("piece_chest_wood");
		GameObject val2 = func("wood_stack");
		GameObject val3 = func("piece_workbench");
		if (Object.op_Implicit((Object)(object)val3) && Object.op_Implicit((Object)(object)val3.GetComponent<CraftingStation>()))
		{
			PlacementRadius.Template = val3.GetComponent<CraftingStation>().m_areaMarker;
		}
		GameObject val4 = func("bar_iron_stack");
		GameObject val5 = func("bar_bronze_stack");
		GameObject val6 = func("Wood");
		GameObject val7 = func("Iron");
		GameObject val8 = func("Bronze");
		if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2) || !Object.op_Implicit((Object)(object)val4) || !Object.op_Implicit((Object)(object)val5) || !Object.op_Implicit((Object)(object)val6) || !Object.op_Implicit((Object)(object)val7) || !Object.op_Implicit((Object)(object)val8))
		{
			throw new InvalidOperationException("Woodkeeper: required vanilla prefabs are missing.");
		}
		Prefab = Object.Instantiate<GameObject>(val, Root.transform);
		((Object)Prefab).name = "piece_woodkeeper";
		Transform[] array = ((IEnumerable)Prefab.transform).Cast<Transform>().ToArray();
		foreach (Transform val9 in array)
		{
			Object.DestroyImmediate((Object)(object)((Component)val9).gameObject);
		}
		Collider[] components = Prefab.GetComponents<Collider>();
		foreach (Collider val10 in components)
		{
			Object.DestroyImmediate((Object)(object)val10);
		}
		Renderer[] components2 = Prefab.GetComponents<Renderer>();
		foreach (Renderer val11 in components2)
		{
			Object.DestroyImmediate((Object)(object)val11);
		}
		Animator[] components3 = Prefab.GetComponents<Animator>();
		foreach (Animator val12 in components3)
		{
			Object.DestroyImmediate((Object)(object)val12);
		}
		GameObject val13 = RackModel.Create(Prefab.transform, val4, val5, func("piece_chest_barrel"));
		GameObject val14 = Visual(val2, Prefab.transform, "VanillaWoodPile");
		val14.transform.localPosition = Vector3.zero;
		val14.transform.localRotation = Quaternion.Euler(0f, 0f, 180f);
		val14.transform.localScale = Vector3.one * 0.5f;
		float num5 = float.PositiveInfinity;
		MeshFilter[] componentsInChildren = val14.GetComponentsInChildren<MeshFilter>(true);
		foreach (MeshFilter val15 in componentsInChildren)
		{
			if (Object.op_Implicit((Object)(object)val15.sharedMesh))
			{
				Bounds bounds = val15.sharedMesh.bounds;
				for (int num7 = 0; num7 < 8; num7++)
				{
					Vector3 val16 = ((Bounds)(ref bounds)).center + Vector3.Scale(((Bounds)(ref bounds)).extents, new Vector3(((num7 & 1) == 0) ? (-1f) : 1f, ((num7 & 2) == 0) ? (-1f) : 1f, ((num7 & 4) == 0) ? (-1f) : 1f));
					float y = Prefab.transform.InverseTransformPoint(((Component)val15).transform.TransformPoint(val16)).y;
					num5 = Mathf.Min(num5, y);
				}
			}
		}
		val14.transform.localPosition = new Vector3(0f, float.IsInfinity(num5) ? 0.78f : (0.28f - num5), 0f);
		Transform transform = val13.transform;
		transform.localPosition *= 0.81f;
		Transform transform2 = val13.transform;
		transform2.localScale *= 0.81f;
		Transform transform3 = val14.transform;
		transform3.localPosition *= 0.81f;
		Transform transform4 = val14.transform;
		transform4.localScale *= 0.81f;
		BoxCollider val17 = Prefab.AddComponent<BoxCollider>();
		val17.center = new Vector3(0.255f, 0.59f, 0f) * 0.81f;
		val17.size = new Vector3(1.91f, 1.18f, 1.05f) * 0.81f;
		Piece component = Prefab.GetComponent<Piece>();
		component.m_name = "$iaf_rack";
		component.m_description = "$iaf_desc_rack";
		component.m_icon = GetMenuIcon();
		GameObject val18 = func("forge");
		if (!Object.op_Implicit((Object)(object)val18) || !Object.op_Implicit((Object)(object)val18.GetComponent<CraftingStation>()))
		{
			throw new InvalidOperationException("Forge crafting station missing.");
		}
		component.m_craftingStation = val18.GetComponent<CraftingStation>();
		Requirement[] array2 = (Requirement[])(object)new Requirement[3];
		Requirement val19 = new Requirement();
		val19.m_resItem = val6.GetComponent<ItemDrop>();
		val19.m_amount = 30;
		val19.m_amountPerLevel = 0;
		val19.m_recover = true;
		array2[0] = val19;
		Requirement val20 = new Requirement();
		val20.m_resItem = val7.GetComponent<ItemDrop>();
		val20.m_amount = 6;
		val20.m_amountPerLevel = 0;
		val20.m_recover = true;
		array2[1] = val20;
		Requirement val21 = new Requirement();
		val21.m_resItem = val8.GetComponent<ItemDrop>();
		val21.m_amount = 3;
		val21.m_amountPerLevel = 0;
		val21.m_recover = true;
		array2[2] = val21;
		component.m_resources = array2;
		Container component2 = Prefab.GetComponent<Container>();
		component2.m_name = "$iaf_rack";
		component2.m_open = (component2.m_closed = null);
		component2.m_width = 3;
		component2.m_height = 2;
		WearNTear component3 = Prefab.GetComponent<WearNTear>();
		component3.m_new = (component3.m_worn = (component3.m_broken = (component3.m_wet = null)));
		component3.m_snow = (component3.m_snowWorn = (component3.m_snowBroken = null));
		component3.m_fragmentRoots = (GameObject[])(object)new GameObject[2] { val13, val14 };
		component3.m_nonSolidRenderers = new List<Renderer>();
		Prefab.AddComponent<Woodkeeper>();
		Prefab.AddComponent<FuelerAudit>();
		Prefab.SetActive(true);
		BuildLamp(scene, val, val4, val5);
		try
		{
			Scuttle.Build(scene, val5);
		}
		catch (Exception ex)
		{
			Log.LogError((object)("Scuttle creation failed; other fuelers remain available: " + ex));
			if (Object.op_Implicit((Object)(object)Scuttle.Prefab))
			{
				Object.DestroyImmediate((Object)(object)Scuttle.Prefab);
			}
			Scuttle.Prefab = null;
		}
		FuelerLod.Build(Prefab);
		FuelerLod.Build(LampPrefab);
		FuelerLod.Build(Scuttle.Prefab);
		Log.LogInfo((object)("Woodkeeper prefab created; inventory " + component2.m_width + " x " + component2.m_height));
	}

	private static void BuildLamp(ZNetScene scene, GameObject chest, GameObject iron, GameObject bronze)
	{
		//IL_00f7: 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_01c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c9: Expected O, but got Unknown
		//IL_0206: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_0277: Unknown result type (might be due to invalid IL or missing references)
		//IL_0281: Unknown result type (might be due to invalid IL or missing references)
		//IL_029c: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
		LampPrefab = Object.Instantiate<GameObject>(Prefab, Root.transform);
		((Object)LampPrefab).name = "piece_iaf_lamplighter_barrel";
		Transform[] array = ((IEnumerable)LampPrefab.transform).Cast<Transform>().ToArray();
		foreach (Transform val in array)
		{
			Object.DestroyImmediate((Object)(object)((Component)val).gameObject);
		}
		LampPrefab.GetComponent<Woodkeeper>().IsLamp = true;
		GameObject resin = scene.m_prefabs.Find((GameObject p) => Object.op_Implicit((Object)(object)p) && ((Object)p).name == "Resin");
		GameObject val2 = BucketModel.Create(LampPrefab.transform, scene.m_prefabs.Find((GameObject p) => Object.op_Implicit((Object)(object)p) && ((Object)p).name == "piece_chest_barrel"), iron, bronze, resin);
		val2.transform.localScale = Vector3.one * 0.75f;
		Piece component = LampPrefab.GetComponent<Piece>();
		component.m_name = "$iaf_lamp";
		component.m_description = "$iaf_desc_lamp";
		string[] source = new string[4] { "BarrelRings", "Wood", "Bronze", "Resin" };
		int[] amounts = new int[4] { 1, 12, 3, 25 };
		component.m_resources = source.Select(delegate(string name, int num)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			Requirement val4 = new Requirement();
			val4.m_resItem = scene.m_prefabs.Find((GameObject p) => Object.op_Implicit((Object)(object)p) && ((Object)p).name == name).GetComponent<ItemDrop>();
			val4.m_amount = amounts[num];
			val4.m_amountPerLevel = 0;
			val4.m_recover = true;
			return val4;
		}).ToArray();
		using (Stream stream = typeof(Plugin).Assembly.GetManifestResourceStream("IAF.LampIcon.png"))
		{
			using MemoryStream memoryStream = new MemoryStream();
			stream.CopyTo(memoryStream);
			Texture2D val3 = new Texture2D(2, 2, (TextureFormat)4, false);
			ImageConversion.LoadImage(val3, memoryStream.ToArray(), true);
			((Texture)val3).filterMode = (FilterMode)1;
			((Texture)val3).wrapMode = (TextureWrapMode)1;
			component.m_icon = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0.5f, 0.5f), 100f);
		}
		LampPrefab.GetComponent<Container>().m_name = component.m_name;
		BoxCollider component2 = LampPrefab.GetComponent<BoxCollider>();
		component2.center = new Vector3(0f, 0.58f, 0f) * 0.75f;
		component2.size = new Vector3(1f, 1.16f, 0.9f) * 0.75f;
		LampPrefab.GetComponent<WearNTear>().m_fragmentRoots = (GameObject[])(object)new GameObject[1] { val2 };
	}

	internal static void AddToHammer(ObjectDB db)
	{
		if (!Object.op_Implicit((Object)(object)db) || !Object.op_Implicit((Object)(object)Prefab))
		{
			return;
		}
		Scuttle.AddToHammer(db);
		GameObject itemPrefab = db.GetItemPrefab("Hammer");
		if (!Object.op_Implicit((Object)(object)itemPrefab))
		{
			return;
		}
		PieceTable buildPieces = itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces;
		Prefab.GetComponent<Piece>().m_enabled = MenuEnabled;
		if (!Object.op_Implicit((Object)(object)buildPieces))
		{
			return;
		}
		if (MenuEnabled && !buildPieces.m_pieces.Contains(Prefab))
		{
			buildPieces.m_pieces.Add(Prefab);
		}
		if (!MenuEnabled)
		{
			buildPieces.m_pieces.Remove(Prefab);
		}
		if (Object.op_Implicit((Object)(object)LampPrefab))
		{
			bool flag = (hasServerSettings ? serverLampMenu : LampMenu.Value);
			LampPrefab.GetComponent<Piece>().m_enabled = flag;
			if (flag && !buildPieces.m_pieces.Contains(LampPrefab))
			{
				buildPieces.m_pieces.Add(LampPrefab);
			}
			if (!flag)
			{
				buildPieces.m_pieces.Remove(LampPrefab);
			}
		}
	}
}
internal static class Rules
{
	internal const float RangeSquared = 144f;

	internal static float RadiusSquared(float radius)
	{
		return radius * radius;
	}

	internal static string InsertFuelStatus(string hover, string status, string hint = "")
	{
		int num = hover.IndexOf('\n');
		int num2 = ((num < 0) ? (-1) : hover.IndexOf('\n', num + 1));
		if (num < 0)
		{
			return hover + ((status.Length > 0) ? (" " + status) : "") + hint;
		}
		int num3 = ((num2 < 0) ? hover.Length : num2);
		int num4 = hover.LastIndexOf(')', num3 - 1, num3 - num);
		if (status.Length > 0)
		{
			int num5 = ((num4 >= 0) ? num4 : num3);
			while (num5 > num && hover[num5 - 1] == ' ')
			{
				num5--;
			}
			string text = " " + status;
			hover = hover.Insert(num5, text);
			num3 += text.Length;
		}
		return hover.Insert(num3, hint);
	}

	internal static bool IsSupportedFire(string prefab)
	{
		switch (prefab)
		{
		default:
			return prefab == "bonfire";
		case "fire_pit":
		case "fire_pit_iron":
		case "hearth":
			return true;
		}
	}

	internal static bool CanFuelStation(string prefab, string fuel)
	{
		if (prefab == "piece_oven" || prefab == "piece_bathtub")
		{
			return fuel == "Wood";
		}
		return false;
	}

	internal static bool IsWood(ItemData item)
	{
		if (item != null && Object.op_Implicit((Object)(object)item.m_dropPrefab))
		{
			return IsWoodName(((Object)item.m_dropPrefab).name);
		}
		return false;
	}

	internal static bool IsWoodName(string name)
	{
		if (!(name == "Wood") && !(name == "RoundLog"))
		{
			return name == "FineWood";
		}
		return true;
	}

	internal static bool CanFuel(string prefab, string requiredFuel)
	{
		if (IsSupportedFire(prefab))
		{
			return IsWoodName(requiredFuel);
		}
		return false;
	}

	internal static bool CanLampFuel(string prefab, string requiredFuel)
	{
		switch (requiredFuel)
		{
		case "Resin":
			switch (prefab)
			{
			default:
				return prefab == "piece_snowlantern";
			case "piece_groundtorch_wood":
			case "piece_groundtorch":
			case "piece_walltorch":
			case "piece_jackoturnip":
				return true;
			}
		case "Guck":
			return prefab == "piece_groundtorch_green";
		case "GreydwarfEye":
			return prefab == "piece_groundtorch_blue";
		default:
			return false;
		}
	}

	internal static bool CanScuttleFuel(string prefab, string fuel)
	{
		if (fuel == "Coal")
		{
			if (!(prefab == "piece_brazierfloor01"))
			{
				return prefab == "piece_brazierceiling01";
			}
			return true;
		}
		if (fuel == "GreydwarfEye")
		{
			return prefab == "piece_brazierfloor02";
		}
		return false;
	}

	internal static string ConnectionName(string prefab, string fallback)
	{
		return prefab switch
		{
			"piece_brazierfloor01" => "Standing Brazier", 
			"piece_brazierceiling01" => "Hanging Brazier", 
			"piece_brazierfloor02" => "Standing Blue Brazier", 
			"piece_oven" => "Stone Oven", 
			"piece_bathtub" => "Hot Tub", 
			"fire_pit" => "Camp fire", 
			"fire_pit_iron" => "Iron fire pit", 
			"hearth" => "Hearth", 
			"bonfire" => "Bonfire", 
			"piece_groundtorch_wood" => "Standing Wood Torch", 
			"piece_groundtorch" => "Standing Iron Torch", 
			"piece_groundtorch_blue" => "Standing Blue Torch", 
			"piece_groundtorch_green" => "Standing Green Torch", 
			"piece_walltorch" => "Sconce", 
			"piece_jackoturnip" => "Jack-o-turnip", 
			"piece_snowlantern" => "Snow lantern", 
			_ => fallback, 
		};
	}

	internal static bool CanConsumeFuel(int kind, string required, string stored)
	{
		if (kind == 0)
		{
			if (IsWoodName(required))
			{
				return IsWoodName(stored);
			}
			return false;
		}
		if (string.IsNullOrEmpty(required) || required != stored)
		{
			return false;
		}
		switch (kind)
		{
		case 1:
			if (!(required == "Resin") && !(required == "Guck"))
			{
				return required == "GreydwarfEye";
			}
			return true;
		case 2:
			if (!(required == "Coal"))
			{
				return required == "GreydwarfEye";
			}
			return true;
		default:
			return false;
		}
	}

	internal static int WoodPriority(ItemData item)
	{
		if (!(((Object)item.m_dropPrefab).name == "Wood"))
		{
			if (!(((Object)item.m_dropPrefab).name == "RoundLog"))
			{
				return 2;
			}
			return 1;
		}
		return 0;
	}

	internal static int Room(float capacity, float current)
	{
		if (float.IsNaN(capacity) || float.IsNaN(current) || float.IsInfinity(capacity) || float.IsInfinity(current))
		{
			return 0;
		}
		return Math.Max(0, (int)Math.Floor(capacity - Math.Max(0f, current)));
	}

	internal static float HourlyRate(float secondsPerFuel)
	{
		if (!(secondsPerFuel > 0f) || float.IsInfinity(secondsPerFuel))
		{
			return 0f;
		}
		return 3600f / secondsPerFuel;
	}
}
public sealed class Woodkeeper : MonoBehaviour
{
	internal const string DisabledKey = "woodkeeper_auto_fuel_disabled";

	internal const string ToggleRpc = "Woodkeeper_ToggleAutoFuel";

	private const string AxeKey = "woodkeeper_axe";

	private const string ReturnedKey = "woodkeeper_axe_returned";

	public bool IsLamp;

	public bool IsScuttle;

	internal readonly Dictionary<string, float> Rates = new Dictionary<string, float>();

	private static readonly HashSet<Woodkeeper> Stacks = new HashSet<Woodkeeper>();

	private static readonly MethodInfo Refresh = AccessTools.Method(typeof(Container), "CheckForChanges", (Type[])null, (Type[])null);

	private static readonly MethodInfo SettleFire = AccessTools.Method(typeof(Fireplace), "UpdateFireplace", (Type[])null, (Type[])null);

	private static Fireplace[] fires = (Fireplace[])(object)new Fireplace[0];

	private static float nextDiscovery;

	private static readonly Dictionary<Fireplace, Woodkeeper> suppliers = new Dictionary<Fireplace, Woodkeeper>();

	private Container container;

	private ZNetView view;

	private float nextScan;

	private readonly Dictionary<ZDOID, float> ownershipSettling = new Dictionary<ZDOID, float>();

	private static Vector3 supplierRadii;

	internal int Kind
	{
		get
		{
			if (!IsScuttle)
			{
				if (!IsLamp)
				{
					return 0;
				}
				return 1;
			}
			return 2;
		}
	}

	internal string DisplayName
	{
		get
		{
			if (!IsScuttle)
			{
				if (!IsLamp)
				{
					return "Firewood Rack";
				}
				return "Lamplighter's Barrel";
			}
			return "Brazier Scuttle";
		}
	}

	private void Awake()
	{
		container = ((Component)this).GetComponent<Container>();
		view = ((Component)this).GetComponent<ZNetView>();
		WearNTear component = ((Component)this).GetComponent<WearNTear>();
		if (Object.op_Implicit((Object)(object)component))
		{
			component.m_onDestroyed = (Action)Delegate.Combine(component.m_onDestroyed, new Action(ReturnAxe));
		}
	}

	private void OnEnable()
	{
		Stacks.Add(this);
		suppliers.Clear();
		nextScan = Time.unscaledTime + Random.Range(0f, 5f);
	}

	private void OnDisable()
	{
		Stacks.Remove(this);
		suppliers.Clear();
	}

	private void ReturnAxe()
	{
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Expected O, but got Unknown
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Expected O, but got Unknown
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)view) || !view.IsValid() || !view.IsOwner())
		{
			return;
		}
		ZDO zDO = view.GetZDO();
		if (zDO.GetBool("woodkeeper_axe_returned", false))
		{
			return;
		}
		byte[] byteArray = zDO.GetByteArray("woodkeeper_axe", (byte[])null);
		if (byteArray != null && byteArray.Length != 0)
		{
			Inventory val = new Inventory("Woodkeeper axe", (Sprite)null, 1, 1);
			val.Load(new ZPackage(byteArray));
			ItemData val2 = val.GetAllItems().FirstOrDefault();
			if (val2 == null)
			{
				throw new InvalidOperationException("Woodkeeper: saved axe could not be restored.");
			}
			ItemDrop.DropItem(val2, 1, ((Component)this).transform.position + Vector3.up * 0.7f, Quaternion.identity);
			zDO.Set("woodkeeper_axe_returned", true);
		}
	}

	private static bool Live(Woodkeeper stack)
	{
		if (Object.op_Implicit((Object)(object)stack) && Object.op_Implicit((Object)(object)stack.view) && stack.view.IsValid() && Object.op_Implicit((Object)(object)stack.container))
		{
			return stack.container.GetInventory() != null;
		}
		return false;
	}

	internal static bool InRange(Fireplace fire)
	{
		return Object.op_Implicit((Object)(object)Supplier(fire));
	}

	internal static Woodkeeper Supplier(Fireplace fire)
	{
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: 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_0051: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)fire) || !Plugin.ConfigReady || !Scuttle.Ready)
		{
			return ComputeSupplier(fire);
		}
		Targets();
		Vector3 val = default(Vector3);
		((Vector3)(ref val))..ctor(Plugin.Radius, Plugin.LampRadius, Scuttle.Radius);
		if (supplierRadii != val)
		{
			suppliers.Clear();
			supplierRadii = val;
		}
		if (suppliers.TryGetValue(fire, out var value) && (!Object.op_Implicit((Object)(object)value) || Live(value)))
		{
			return value;
		}
		value = ComputeSupplier(fire);
		suppliers[fire] = value;
		return value;
	}

	private static Woodkeeper ComputeSupplier(Fireplace fire)
	{
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)fire) || !fire.m_canRefill || fire.m_infiniteFuel || !Object.op_Implicit((Object)(object)fire.m_fuelItem) || (!Rules.CanFuel(Utils.GetPrefabName(((Component)fire).gameObject), ((Object)fire.m_fuelItem).name) && !Rules.CanLampFuel(Utils.GetPrefabName(((Component)fire).gameObject), ((Object)fire.m_fuelItem).name) && !Rules.CanScuttleFuel(Utils.GetPrefabName(((Component)fire).gameObject), ((Object)fire.m_fuelItem).name)))
		{
			return null;
		}
		ZNetView component = ((Component)fire).GetComponent<ZNetView>();
		Piece component2 = ((Component)fire).GetComponent<Piece>();
		if (!Object.op_Implicit((Object)(object)component) || !component.IsValid() || !Object.op_Implicit((Object)(object)component2) || !component2.IsPlacedByPlayer())
		{
			return null;
		}
		return Nearest(((Component)fire).transform.position, Rules.CanScuttleFuel(Utils.GetPrefabName(((Component)fire).gameObject), ((Object)fire.m_fuelItem).name) ? 2 : (Rules.CanLampFuel(Utils.GetPrefabName(((Component)fire).gameObject), ((Object)fire.m_fuelItem).name) ? 1 : 0));
	}

	internal static Woodkeeper Nearest(Vector3 position, bool lamp)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return Nearest(position, lamp ? 1 : 0);
	}

	internal static Woodkeeper Nearest(Vector3 position, int kind)
	{
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		if (!Plugin.ConfigReady || (kind == 2 && !Scuttle.Ready))
		{
			return null;
		}
		Woodkeeper woodkeeper = null;
		float num = Rules.RadiusSquared(kind switch
		{
			1 => Plugin.LampRadius, 
			2 => Scuttle.Radius, 
			_ => Plugin.Radius, 
		});
		foreach (Woodkeeper stack in Stacks)
		{
			if (Object.op_Implicit((Object)(object)stack) && stack.Kind == kind && Live(stack))
			{
				Vector3 val = ((Component)stack).transform.position - position;
				float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
				if (!(sqrMagnitude > num) && (!Object.op_Implicit((Object)(object)woodkeeper) || sqrMagnitude != num || string.CompareOrdinal(((object)Unsafe.As<ZDOID, ZDOID>(ref stack.view.GetZDO().m_uid)/*cast due to .constrained prefix*/).ToString(), ((object)Unsafe.As<ZDOID, ZDOID>(ref woodkeeper.view.GetZDO().m_uid)/*cast due to .constrained prefix*/).ToString()) < 0))
				{
					woodkeeper = stack;
					num = sqrMagnitude;
				}
			}
		}
		return woodkeeper;
	}

	internal SortedDictionary<string, int> Connections(out float woodPerHour, bool localize = true)
	{
		woodPerHour = 0f;
		Rates.Clear();
		Dictionary<string, float> rates = Rates;
		Dictionary<string, float> rates2 = Rates;
		Dictionary<string, float> rates3 = Rates;
		float num = (Rates["GreydwarfEye"] = 0f);
		float num3 = (rates3["Guck"] = num);
		float value = (rates2["Resin"] = num3);
		rates["Coal"] = value;
		SortedDictionary<string, int> sortedDictionary = new SortedDictionary<string, int>();
		Fireplace[] array = Targets();
		foreach (Fireplace val in array)
		{
			if ((Object)(object)Supplier(val) != (Object)(object)this || ((Component)val).GetComponent<ZNetView>().GetZDO().GetBool("woodkeeper_auto_fuel_disabled", false))
			{
				continue;
			}
			string fallback = ((Localization.instance != null) ? Localization.instance.Localize(val.m_name) : val.m_name);
			fallback = (localize ? L10n.ConnectionName(Utils.GetPrefabName(((Component)val).gameObject), fallback) : Rules.ConnectionName(Utils.GetPrefabName(((Component)val).gameObject), fallback));
			if (!sortedDictionary.ContainsKey(fallback))
			{
				sortedDictionary[fallback] = 0;
			}
			sortedDictionary[fallback]++;
			if (val.IsBurning() && ((Component)val).GetComponent<ZNetView>().GetZDO().GetInt("state", 1) == 1)
			{
				float num6 = Rules.HourlyRate(val.m_secPerFuel);
				woodPerHour += num6;
				if (Kind != 0)
				{
					Rates[((Object)val.m_fuelItem).name] += num6;
				}
			}
		}
		ExtraWoodTargets.Connections(this, sortedDictionary, ref woodPerHour, localize);
		return sortedDictionary;
	}

	private bool CanSupply(Component target, out ZNetView targetView)
	{
		targetView = target.GetComponent<ZNetView>();
		Piece component = target.GetComponent<Piece>();
		if (Object.op_Implicit((Object)(object)targetView) && targetView.IsValid() && Object.op_Implicit((Object)(object)component) && component.IsPlacedByPlayer() && !targetView.GetZDO().GetBool("woodkeeper_auto_fuel_disabled", false) && (Object)(object)Supplier((Fireplace)(object)((target is Fireplace) ? target : null)) == (Object)(object)this && view.IsOwner())
		{
			return !container.IsInUse();
		}
		return false;
	}

	internal bool OwnTarget(ZNetView target)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		ZDOID uid = target.GetZDO().m_uid;
		if (!target.IsOwner())
		{
			target.ClaimOwnership();
			ownershipSettling[uid] = Time.unscaledTime + 5f;
			return false;
		}
		if (ownershipSettling.TryGetValue(uid, out var value))
		{
			if (Time.unscaledTime < value)
			{
				return false;
			}
			ownershipSettling.Remove(uid);
		}
		if (target.IsOwner() && view.IsOwner() && !container.IsInUse())
		{
			return !target.GetZDO().GetBool("woodkeeper_auto_fuel_disabled", false);
		}
		return false;
	}

	internal int TakeWood(int wanted, out bool cheated)
	{
		cheated = false;
		int num = 0;
		Inventory inventory = container.GetInventory();
		foreach (ItemData item in (from i in inventory.GetAllItems()
			where Rules.IsWood(i) && Rules.CanConsumeFuel(0, "Wood", ((Object)i.m_dropPrefab).name)
			select i).OrderBy(Rules.WoodPriority).ToList())
		{
			int num2 = Math.Min(item.m_stack, wanted - num);
			if (num2 > 0 && inventory.RemoveItem(item, num2))
			{
				num += num2;
				cheated |= item.m_cheated;
			}
			if (num >= wanted)
			{
				break;
			}
		}
		return num;
	}

	private void Update()
	{
		if (Time.unscaledTime < nextScan)
		{
			return;
		}
		nextScan = Time.unscaledTime + 5f;
		if (!Live(this) || !view.IsOwner() || container.IsInUse())
		{
			return;
		}
		try
		{
			Scan();
		}
		catch (Exception ex)
		{
			Plugin.Log.LogError((object)("Woodkeeper fueling scan failed: " + ex));
		}
	}

	internal static Fireplace[] Targets()
	{
		if (Time.unscaledTime >= nextDiscovery)
		{
			fires = (from f in Object.FindObjectsByType<Fireplace>((FindObjectsSortMode)0)
				where Object.op_Implicit((Object)(object)f) && Object.op_Implicit((Object)(object)((Component)f).GetComponent<ZNetView>()) && ((Component)f).GetComponent<ZNetView>().IsValid()
				orderby ((Component)f).GetComponent<ZNetView>().GetZDO().GetFloat("fuel", 0f)
				select f).ToArray();
			nextDiscovery = Time.unscaledTime + 5f;
			suppliers.Clear();
		}
		return fires;
	}

	private void Scan()
	{
		//IL_0377: Unknown result type (might be due to invalid IL or missing references)
		//IL_0381: Expected O, but got Unknown
		//IL_015d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Expected O, but got Unknown
		//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
		Targets();
		Refresh.Invoke(container, null);
		if (!container.GetInventory().GetAllItems().Any(delegate(ItemData i)
		{
			if (Kind == 0)
			{
				return Rules.IsWood(i);
			}
			if (Object.op_Implicit((Object)(object)i.m_dropPrefab))
			{
				if (!IsScuttle)
				{
					if (!(((Object)i.m_dropPrefab).name == "Resin") && !(((Object)i.m_dropPrefab).name == "Guck"))
					{
						return ((Object)i.m_dropPrefab).name == "GreydwarfEye";
					}
					return true;
				}
				if (!(((Object)i.m_dropPrefab).name == "Coal"))
				{
					return ((Object)i.m_dropPrefab).name == "GreydwarfEye";
				}
				return true;
			}
			return false;
		}))
		{
			return;
		}
		ExtraWoodTargets.Fill(this);
		Fireplace[] array = fires;
		foreach (Fireplace val in array)
		{
			if (!Object.op_Implicit((Object)(object)val) || (Object)(object)Supplier(val) != (Object)(object)this || !CanSupply((Component)(object)val, out var targetView) || Rules.Room(val.m_maxFuel, targetView.GetZDO().GetFloat("fuel", 0f)) == 0 || !OwnTarget(targetView) || !CanSupply((Component)(object)val, out targetView))
			{
				continue;
			}
			SettleFire.Invoke(val, null);
			if (!CanSupply((Component)(object)val, out targetView) || !targetView.IsOwner())
			{
				continue;
			}
			long ticks = ZNet.instance.GetTime().Ticks;
			long num2 = targetView.GetZDO().GetLong("iaf_last_fuel_transfer", 0L);
			if (num2 > 0 && ticks >= num2 && (double)(ticks - num2) / 10000000.0 < (double)val.m_secPerFuel)
			{
				continue;
			}
			float num3 = targetView.GetZDO().GetFloat("fuel", 0f);
			int num4 = Rules.Room(val.m_maxFuel, num3);
			if (num4 == 0)
			{
				continue;
			}
			ZPackage val2 = new ZPackage();
			container.GetInventory().Save(val2);
			int num5 = 0;
			Diagnostics.Context = "fuel:" + Diagnostics.Id((Component)(object)this) + "->" + Diagnostics.Id((Component)(object)val);
			try
			{
				num5 = ((Kind != 0) ? TakeMatchingFuel(((Object)val.m_fuelItem).name, num4) : TakeWood(num4, out var _));
				if (num5 != 0)
				{
					if (!targetView.IsOwner() || !view.IsOwner())
					{
						throw new InvalidOperationException("Fuel transfer ownership changed.");
					}
					targetView.GetZDO().Set(ZDOVars.s_fuel, num3 + (float)num5);
					if (Math.Abs(targetView.GetZDO().GetFloat(ZDOVars.s_fuel, 0f) - (num3 + (float)num5)) > 0.001f)
					{
						throw new InvalidOperationException("Fuel deposit was not retained.");
					}
					targetView.GetZDO().Set("iaf_last_fuel_transfer", ticks);
					Diagnostics.Transfer(this, (Component)(object)val, ((Object)val.m_fuelItem).name, num5, num3, num3 + (float)num5, val.m_secPerFuel);
					Plugin.Log.LogInfo((object)string.Concat("Fuel transfer: ", DisplayName, " -> ", Utils.GetPrefabName(((Component)val).gameObject), " ", targetView.GetZDO().m_uid, ": ", num5, " ", ((Object)val.m_fuelItem).name, ", fuel ", num3.ToString("0.###"), " -> ", (num3 + (float)num5).ToString("0.###")));
				}
			}
			catch (Exception ex)
			{
				if (Object.op_Implicit((Object)(object)targetView) && targetView.IsValid() && targetView.IsOwner())
				{
					targetView.GetZDO().Set(ZDOVars.s_fuel, num3);
				}
				container.GetInventory().Load(new ZPackage(val2.GetArray()));
				Plugin.Log.LogError((object)("Fuel transfer rolled back; inventory restored: " + ex));
				Diagnostics.Write(true, "transfer_rollback", (Component)(object)val, "supplier", Diagnostics.Id((Component)(object)this), "error", ex.ToString());
			}
			finally
			{
				Diagnostics.Context = "unattributed";
			}
		}
	}

	private int TakeMatchingFuel(string required, int wanted)
	{
		int num = 0;
		Inventory inventory = container.GetInventory();
		foreach (ItemData item in (from i in inventory.GetAllItems()
			where Object.op_Implicit((Object)(object)i.m_dropPrefab) && Rules.CanConsumeFuel(Kind, required, ((Object)i.m_dropPrefab).name)
			select i).ToList())
		{
			int num2 = Math.Min(item.m_stack, wanted - num);
			if (num2 > 0 && inventory.RemoveItem(item, num2))
			{
				num += num2;
			}
			if (num >= wanted)
			{
				break;
			}
		}
		return num;
	}
}
internal static class RackModel
{
	internal sealed class Geometry
	{
		internal readonly List<Vector3> vertices = new List<Vector3>();

		internal readonly List<Vector2> uv = new List<Vector2>();

		internal readonly List<int>[] triangles = new List<int>[3]
		{
			new List<int>(),
			new List<int>(),
			new List<int>()
		};

		internal void Face(int material, params Vector3[] points)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			int count = vertices.Count;
			vertices.AddRange(points);
			for (int i = 0; i < points.Length; i++)
			{
				uv.Add(new Vector2((float)((i != 0 && i != 3) ? 1 : 0), (float)((i >= 2) ? 1 : 0)));
			}
			for (int j = 1; j < points.Length - 1; j++)
			{
				triangles[material].Add(count);
				triangles[material].Add(count + j);
				triangles[material].Add(count + j + 1);
			}
		}

		internal void Bar(Vector3 a, Vector3 b, float width, int material = 2)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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_009b: 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_00ae: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: 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_00c9: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//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_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			//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_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = b - a;
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			Vector3 val2 = Vector3.Cross(normalized, (Mathf.Abs(normalized.y) > 0.9f) ? Vector3.forward : Vector3.up);
			Vector3 val3 = ((Vector3)(ref val2)).normalized * width * 0.5f;
			Vector3 val4 = Vector3.Cross(normalized, val3);
			Vector3 val5 = ((Vector3)(ref val4)).normalized * width * 0.5f;
			Vector3[] array = (Vector3[])(object)new Vector3[4]
			{
				val3 + val5,
				-val3 + val5,
				-val3 - val5,
				val3 - val5
			};
			for (int i = 0; i < 4; i++)
			{
				int num = (i + 1) % 4;
				Face(material, a + array[i], a + array[num], b + array[num], b + array[i]);
			}
			Face(material, a + array[3], a + array[2], a + array[1], a + array[0]);
			Face(material, b + array[0], b + array[1], b + array[2], b + array[3]);
		}

		internal void Turned(Vector3 center, float[] heights, float[] radii, int material)
		{
			//IL_0032: 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_0054: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: 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_00fc: 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)
			Vector3[][] array = new Vector3[heights.Length][];
			for (int i = 0; i < heights.Length; i++)
			{
				array[i] = (Vector3[])(object)new Vector3[8];
				for (int j = 0; j < 8; j++)
				{
					float num = (float)j * (float)Math.PI / 4f;
					ref Vector3 reference = ref array[i][j];
					reference = center + new Vector3(Mathf.Cos(num) * radii[i], heights[i], Mathf.Sin(num) * radii[i]);
				}
			}
			for (int k = 0; k < array.Length - 1; k++)
			{
				for (int l = 0; l < 8; l++)
				{
					int num2 = (l + 1) % 8;
					Face(material, array[k][l], array[k + 1][l], array[k + 1][num2], array[k][num2]);
				}
			}
			Face(material, array[0]);
			Face(material, array[^1].Reverse().ToArray());
		}

		internal void Cap(Vector3 center)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			Turned(center, new float[8] { -0.065f, -0.04f, -0.02f, 0f, 0.025f, 0.06f, 0.095f, 0.115f }, new float[8] { 0.055f, 0.055f, 0.03f, 0.027f, 0.054f, 0.069f, 0.05f, 0.008f }, 0);
		}
	}

	private static void AddToolSet(Geometry g)
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: 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_0062: 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_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_010a: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: 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_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_0144: Unknown result type (might be due to invalid IL or missing references)
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_054d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0552: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0214: Unknown result type (might be due to invalid IL or missing references)
		//IL_0216: Unknown result type (might be due to invalid IL or missing references)
		//IL_0220: Unknown result type (might be due to invalid IL or missing references)
		//IL_0225: Unknown result type (might be due to invalid IL or missing references)
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_022c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0236: Unknown result type (might be due to invalid IL or missing references)
		//IL_023b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0240: Unknown result type (might be due to invalid IL or missing references)
		//IL_0247: Unknown result type (might be due to invalid IL or missing references)
		//IL_024c: Unknown result type (might be due to invalid IL or missing references)
		//IL_025d: Unknown result type (might be due to invalid IL or missing references)
		//IL_025f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0269: Unknown result type (might be due to invalid IL or missing references)
		//IL_026e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0273: Unknown result type (might be due to invalid IL or missing references)
		//IL_027a: Unknown result type (might be due to invalid IL or missing references)
		//IL_027f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_0286: Unknown result type (might be due to invalid IL or missing references)
		//IL_0290: Unknown result type (might be due to invalid IL or missing references)
		//IL_0295: Unknown result type (might be due to invalid IL or missing references)
		//IL_029a: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0577: Unknown result type (might be due to invalid IL or missing references)
		//IL_0578: Unknown result type (might be due to invalid IL or missing references)
		//IL_0582: Unknown result type (might be due to invalid IL or missing references)
		//IL_0587: Unknown result type (might be due to invalid IL or missing references)
		//IL_0588: Unknown result type (might be due to invalid IL or missing references)
		//IL_058d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0592: Unknown result type (might be due to invalid IL or missing references)
		//IL_0597: Unknown result type (might be due to invalid IL or missing references)
		//IL_0599: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0300: Unknown result type (might be due to invalid IL or missing references)
		//IL_0302: Unknown result type (might be due to invalid IL or missing references)
		//IL_030c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0311: Unknown result type (might be due to invalid IL or missing references)
		//IL_0316: Unknown result type (might be due to invalid IL or missing references)
		//IL_0320: Unknown result type (might be due to invalid IL or missing references)
		//IL_0325: Unknown result type (might be due to invalid IL or missing references)
		//IL_03da: Unknown result type (might be due to invalid IL or missing references)
		//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0425: Unknown result type (might be due to invalid IL or missing references)
		//IL_0427: Unknown result type (might be due to invalid IL or missing references)
		//IL_0431: Unknown result type (might be due to invalid IL or missing references)
		//IL_0436: Unknown result type (might be due to invalid IL or missing references)
		//IL_043b: Unknown result type (might be due to invalid IL or missing references)
		//IL_043d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0447: Unknown result type (might be due to invalid IL or missing references)
		//IL_044c: Unknown result type (might be due to invalid IL or missing references)
		//IL_045c: Unknown result type (might be due to invalid IL or missing references)
		//IL_045e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0468: Unknown result type (might be due to invalid IL or missing references)
		//IL_046d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0472: Unknown result type (might be due to invalid IL or missing references)
		//IL_0474: Unknown result type (might be due to invalid IL or missing references)
		//IL_0476: Unknown result type (might be due to invalid IL or missing references)
		//IL_0480: Unknown result type (might be due to invalid IL or missing references)
		//IL_0485: Unknown result type (might be due to invalid IL or missing references)
		//IL_048a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0494: Unknown result type (might be due to invalid IL or missing references)
		//IL_049b: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_04bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_04db: Unknown result type (might be due to invalid IL or missing references)
		//IL_04dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_04eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_04fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_04fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_050d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0512: Unknown result type (might be due to invalid IL or missing references)
		//IL_033a: Unknown result type (might be due to invalid IL or missing references)
		//IL_033c: Unknown result type (might be due to invalid IL or missing references)
		//IL_034c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0351: Unknown result type (might be due to invalid IL or missing references)
		//IL_0356: Unknown result type (might be due to invalid IL or missing references)
		//IL_0360: Unknown result type (might be due to invalid IL or missing references)
		//IL_0365: Unknown result type (might be due to invalid IL or missing references)
		//IL_036a: Unknown result type (might be due to invalid IL or missing references)
		//IL_036d: Unknown result type (might be due to invalid IL or missing references)
		//IL_036f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0371: Unknown result type (might be due to invalid IL or missing references)
		//IL_0387: Unknown result type (might be due to invalid IL or missing references)
		//IL_038c: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = default(Vector3);
		((Vector3)(ref val))..ctor(1f, 0f, 0f);
		int count = g.vertices.Count;
		g.Turned(val, new float[4] { 0.015f, 0.035f, 0.07f, 0.105f }, new float[4] { 0.21f, 0.21f, 0.17f, 0.065f }, 2);
		g.Bar(val + Vector3.up * 0.08f, val + Vector3.up * 1.03f, 0.035f);
		g.Turned(val, new float[3] { 1.01f, 1.045f, 1.08f }, new float[3] { 0.035f, 0.047f, 0.015f }, 0);
		Vector3 val2 = default(Vector3);
		for (int i = 0; i < 4; i++)
		{
			float num = ((float)i * 90f + 45f) * ((float)Math.PI / 180f);
			((Vector3)(ref val2))..ctor(Mathf.Cos(num), 0f, Mathf.Sin(num));
			Vector3 val3 = val + val2 * 0.145f;
			g.Bar(val + Vector3.up * 0.94f, val3 + Vector3.up * 0.94f, 0.027f);
			g.Bar(val3 + Vector3.up * 0.94f, val3 + Vector3.up * 0.97f, 0.027f);
			if (i != 3)
			{
				g.Turned(val3, new float[11]
				{
					0.96f, 0.975f, 0.995f, 1.025f, 1.06f, 1.075f, 1.09f, 1.105f, 1.135f, 1.16f,
					1.175f
				}, new float[11]
				{
					0.035f, 0.035f, 0.02f, 0.03f, 0.02f, 0.027f, 0.018f, 0.03f, 0.042f, 0.03f,
					0.008f
				}, 0);
				g.Bar(val3 + Vector3.up * 0.95f, val3 + Vector3.up * 0.23f, 0.018f);
			}
			switch (i)
			{
			case 0:
				g.Turned(val3, new float[2] { 0.12f, 0.23f }, new float[2] { 0.003f, 0.015f }, 2);
				g.Bar(val3 + Vector3.up * 0.25f, val3 + Vector3.up * 0.18f + val2 * 0.06f, 0.018f);
				g.Bar(val3 + Vector3.up * 0.18f + val2 * 0.06f, val3 + Vector3.up * 0.205f + val2 * 0.09f, 0.013f);
				continue;
			case 1:
				AddShovel(g, val3, val2);
				continue;
			case 2:
			{
				g.Bar(val3 + Vector3.left * 0.06f + Vector3.up * 0.26f, val3 + Vector3.right * 0.06f + Vector3.up * 0.26f, 0.04f, 0);
				for (int j = 0; j < 7; j++)
				{
					Vector3 val4 = val3 + Vector3.right * ((float)(j - 3) * 0.018f) + Vector3.up * 0.24f;
					g.Bar(val4, val4 + Vector3.down * (0.11f + (float)(j % 2) * 0.012f), 0.014f, 1);
				}
				continue;
			}
			}
			float[] array = new float[2] { -1f, 1f };
			foreach (float num2 in array)
			{
				Vector3 val5 = val3 + Vector3.right * 0.05f * num2;
				g.Turned(val5, new float[7] { 0.96f, 0.98f, 1.02f, 1.07f, 1.105f, 1.14f, 1.17f }, new float[7] { 0.026f, 0.026f, 0.019f, 0.024f, 0.018f, 0.031f, 0.008f }, 0);
				g.Bar(val5 + Vector3.up * 0.96f, val3 + Vector3.up * 0.54f, 0.016f);
				Vector3 a = val3 + Vector3.up * 0.54f;
				Vector3 val6 = val3 + Vector3.up * 0.36f + Vector3.right * 0.065f * num2;
				Vector3 val7 = val3 + Vector3.up * 0.16f + Vector3.right * 0.035f * num2;
				g.Bar(a, val6, 0.016f);
				g.Bar(val6, val7, 0.016f);
				g.Bar(val7, val7 + Vector3.right * ((0f - num2) * 0.018f), 0.02f);
			}
		}
		Quaternion val8 = Quaternion.Euler(0f, 45f, 0f);
		Vector3 val9 = default(Vector3);
		((Vector3)(ref val9))..ctor(0f, 0f, -0.25f);
		for (int l = count; l < g.vertices.Count; l++)
		{
			g.vertices[l] = val + val8 * (g.vertices[l] - val) + val9;
		}
	}

	internal static void AddShovel(Geometry g, Vector3 pos, Vector3 radial)
	{
		//IL_000c: 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)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: 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_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: 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)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f3: 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_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0114: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: 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_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0123: Unknown result type (might be due to invalid IL or missing references)
		//IL_0128: Unknown result type (might be due to invalid IL or missing references)
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0139: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: 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)
		//IL_0158: Unknown result type (might be due to invalid IL or missing references)
		//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_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: 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_018b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: Unknown result type (might be due to invalid IL or missing references)
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0208: Unknown result type (might be due to invalid IL or missing references)
		//IL_0209: Unknown result type (might be due to invalid IL or missing references)
		//IL_0216: Unknown result type (might be due to invalid IL or missing references)
		//IL_0217: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Unknown result type (might be due to invalid IL or missing references)
		//IL_0226: Unknown result type (might be due to invalid IL or missing references)
		//IL_0241: Unknown result type (might be due to invalid IL or missing references)
		//IL_0242: Unknown result type (might be due to invalid IL or missing references)
		//IL_024f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Unknown result type (might be due to invalid IL or missing references)
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0260: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		//IL_026f: Unknown result type (might be due to invalid IL or missing references)
		//IL_028a: Unknown result type (might be due to invalid IL or missing references)
		//IL_028b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0295: Unknown result type (might be due to invalid IL or missing references)
		//IL_029a: Unknown result type (might be due to invalid IL or missing references)
		//IL_029f: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_02af: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0380: Unknown result type (might be due to invalid IL or missing references)
		//IL_0385: Unknown result type (might be due to invalid IL or missing references)
		//IL_039b: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0402: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = Vector3.Cross(Vector3.up, radial);
		Vector3 normalized = ((Vector3)(ref val)).normalized;
		Vector3 val2 = pos + Vector3.up * 0.3f - normalized * 0.065f;
		Vector3 val3 = pos + Vector3.up * 0.3f + normalized * 0.065f;
		Vector3 val4 = pos + Vector3.up * 0.105f - normalized * 0.065f + radial * 0.015f;
		Vector3 val5 = pos + Vector3.up * 0.105f + normalized * 0.065f + radial * 0.015f;
		Vector3 val6 = val4 - normalized * 0.03f + radial * 0.04f;
		Vector3 val7 = val5 + normalized * 0.03f + radial * 0.04f;
		Vector3 val8 = val2 - normalized * 0.02f + radial * 0.035f;
		Vector3 val9 = val3 + normalized * 0.02f + radial * 0.035f;
		Vector3[][] array = new Vector3[4][]
		{
			(Vector3[])(object)new Vector3[4] { val2, val3, val5, val4 },
			(Vector3[])(object)new Vector3[4] { val8, val2, val4, val6 },
			(Vector3[])(object)new Vector3[4] { val3, val9, val7, val5 },
			(Vector3[])(object)new Vector3[4]
			{
				pos + Vector3.up * 0.35f - normalized * 0.022f,
				pos + Vector3.up * 0.35f + normalized * 0.022f,
				val3,
				val2
			}
		};
		Vector3[][] array2 = array;
		foreach (Vector3[] array3 in array2)
		{
			g.Face(2, array3);
			g.Face(2, (from p in array3.Reverse()
				select p - radial * 0.008f).ToArray());
			for (int num = 0; num < array3.Length; num++)
			{
				int num2 = (num + 1) % array3.Length;
				g.Face(2, array3[num], array3[num2], array3[num2] - radial * 0.008f, array3[num] - radial * 0.008f);
			}
		}
	}

	internal static Material Pick(GameObject source, params string[] hints)
	{
		Material[] array = (from m in source.GetComponentsInChildren<MeshRenderer>(true).SelectMany((MeshRenderer r) => ((Renderer)r).sharedMaterials)
			where Object.op_Implicit((Object)(object)m) && ((Object)m).name.IndexOf("fire", StringComparison.OrdinalIgnoreCase) < 0 && ((Object)m).name.IndexOf("flame", StringComparison.OrdinalIgnoreCase) < 0
			select m).Distinct().ToArray();
		foreach (string hint in hints)
		{
			Func<Material, bool> predicate = (Material m) => ((Object)m).name.IndexOf(hint, StringComparison.OrdinalIgnoreCase) >= 0;
			Material val = array.FirstOrDefault(predicate);
			if (Object.op_Implicit((Object)(object)val))
			{
				return val;
			}
		}
		if (array.Length == 0)
		{
			throw new InvalidOperationException("Woodkeeper: vanilla model materials missing.");
		}
		return array[0];
	}

	internal static Material BarrelMetal(GameObject barrel)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Expected O, but got Unknown
		return new Material(Pick(barrel, "barrelplayer"));
	}

	internal static void MapBarrelMetalUV(Geometry geometry, params int[] slots)
	{
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		HashSet<int> hashSet = new HashSet<int>();
		foreach (int num in slots)
		{
			foreach (int item in geometry.triangles[num])
			{
				if (hashSet.Add(item))
				{
					Vector2 val = geometry.uv[item];
					geometry.uv[item] = new Vector2(0.76f + val.x * 0.2f, 0.04f + val.y * 0.92f);
				}
			}
		}
	}

	internal static GameObject Create(Transform parent, GameObject ironStack, GameObject bronzeStack, GameObject barrel)
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: 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_0397: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ed: Expected O, but got Unknown
		//IL_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_0123: 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_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_0458: Unknown result type (might be due to invalid IL or missing references)
		//IL_045f: Expected O, but got Unknown
		//IL_04b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_04be: Expected O, but got Unknown
		//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_04de: Expected O, but got Unknown
		//IL_050e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_024a: Unknown result type (might be due to invalid IL or missing references)
		//IL_024f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Unknown result type (might be due to invalid IL or missing references)
		//IL_0256: Unknown result type (might be due to invalid IL or missing references)
		//IL_025a: Unknown result type (might be due to invalid IL or missing references)
		//IL_025f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0262: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_026b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0270: Unknown result type (might be due to invalid IL or missing references)
		//IL_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_0277: Unknown result type (might be due to invalid IL or missing references)
		//IL_027e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0283: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0305: Unknown result type (might be due to invalid IL or missing references)
		//IL_0307: Unknown result type (might be due to invalid IL or missing references)
		//IL_0321: Unknown result type (might be due to invalid IL or missing references)
		Geometry geometry = new Geometry();
		float[] array = new float[2] { -0.4f, 0.4f };
		Vector3 a = default(Vector3);
		Vector3 val = default(Vector3);
		Vector3 val2 = default(Vector3);
		Vector3 a2 = default(Vector3);
		Vector3 val4 = default(Vector3);
		foreach (float num in array)
		{
			float[] array2 = new float[2] { -0.7f, 0.7f };
			foreach (float num2 in array2)
			{
				geometry.Bar(new Vector3(num2, 0.76f, num), new Vector3(num2, 0.88f, num), 0.065f);
				geometry.Cap(new Vector3(num2, 0.88f, num));
				geometry.Bar(new Vector3(num2, 0.765f, num), new Vector3(num2, 0.8f, num), 0.082f, 0);
			}
			((Vector3)(ref a))..ctor(-0.7f, 0.8f, num);
			for (int k = 1; k <= 10; k++)
			{
				float num3 = (float)k / 10f;
				((Vector3)(ref val))..ctor(-0.7f + 1.4f * num3, 0.28f + 0.52f * Mathf.Pow(2f * num3 - 1f, 2f), num);
				geometry.Bar(a, val, 0.065f);
				a = val;
			}
			float[] array3 = new float[2] { -0.47f, 0.47f };
			foreach (float num4 in array3)
			{
				((Vector3)(ref val2))..ctor(num4 * 1.13f, 0.035f, num * 1.22f);
				float num5 = 0.28f + 0.52f * Mathf.Pow(num4 / 0.7f, 2f);
				geometry.Bar(val2, new Vector3(num4, num5 + 0.05f, num), 0.075f);
				geometry.Bar(val2 + Vector3.left * 0.075f, val2 + Vector3.right * 0.075f, 0.035f);
				geometry.Turned(new Vector3(val2.x, 0f, val2.z), new float[6] { 0.018f, 0.032f, 0.045f, 0.06f, 0.083f, 0.098f }, new float[6] { 0.095f, 0.095f, 0.08f, 0.055f, 0.05f, 0.041f }, 0);
				Vector3 val3 = new Vector3(num4, num5 + 0.05f, num) - val2;
				Vector3 normalized = ((Vector3)(ref val3)).normalized;
				geometry.Bar(val2 + normalized * 0.1f, val2 + normalized * 0.145f, 0.09f, 0);
			}
			((Vector3)(ref a2))..ctor(-0.49f, 0.16f, num);
			for (int m = 1; m <= 16; m++)
			{
				float num6 = (float)m / 16f;
				((Vector3)(ref val4))..ctor(-0.49f + 0.98f * num6, 0.16f + 0.075f * Mathf.Sin(num6 * (float)Math.PI), num);
				geometry.Bar(a2, val4, 0.03f);
				a2 = val4;
			}
			geometry.Turned(new Vector3(0f, 0f, num), new float[3] { 0.22f, 0.245f, 0.27f }, new float[3] { 0.018f, 0.034f, 0.012f }, 0);
		}
		float[] array4 = new float[2] { -0.45f, 0.45f };
		foreach (float num7 in array4)
		{
			geometry.Bar(new Vector3(num7, 0.32f, -0.4f), new Vector3(num7, 0.32f, 0.4f), 0.055f);
		}
		AddToolSet(geometry);
		MapBarrelMetalUV(geometry, 1, 2);
		Mesh val5 = new Mesh();
		((Object)val5).name = "Woodkeeper_IronRack";
		val5.SetVertices(geometry.vertices);
		val5.SetUVs(0, geometry.uv);
		val5.subMeshCount = 3;
		for (int num8 = 0; num8 < 3; num8++)
		{
			val5.SetTriangles(geometry.triangles[num8], num8);
		}
		val5.RecalculateNormals();
		val5.RecalculateTangents();
		val5.RecalculateBounds();
		GameObject val6 = new GameObject("IronRack");
		val6.transform.SetParent(parent, false);
		val6.layer = ((Component)parent).gameObject.layer;
		val6.AddComponent<MeshFilter>().sharedMesh = val5;
		Material val7 = BarrelMetal(barrel);
		Material val8 = new Material(Pick(bronzeStack, "bronze", "metal"));
		val8.mainTextureScale *= 0.65f;
		Material val9 = new Material(val7);
		((Object)val9).name = "Woodkeeper_BrushBristles";
		if (val9.HasProperty("_Color"))
		{
			val9.SetColor("_Color", new Color(0.18f, 0.18f, 0.17f));
		}
		((Renderer)val6.AddComponent<MeshRenderer>()).sharedMaterials = (Material[])(object)new Material[3] { val8, val9, val7 };
		return val6;
	}
}
[HarmonyPatch(typeof(Hud), "UpdateCrosshair")]
internal static class FuelHoverLayout
{
	private static TMP_Text changed;

	private static TextWrappingModes originalWrapping;

	private static TextOverflowModes originalOverflow;

	private static void Postfix(Hud __instance)
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		TMP_Text hoverName = (TMP_Text)(object)__instance.m_hoverName;
		bool flag = Object.op_Implicit((Object)(object)hoverName) && hoverName.text != null && hoverName.text.Contains("<link=\"iaf_supplier\">");
		if (Object.op_Implicit((Object)(object)changed) && (!flag || (Object)(object)changed != (Object)(object)hoverName))
		{
			changed.textWrappingMode = originalWrapping;
			changed.overflowMode = originalOverflow;
			changed = null;
		}
		if (flag)
		{
			if ((Object)(object)changed != (Object)(object)hoverName)
			{
				changed = hoverName;
				originalWrapping = hoverName.textWrappingMode;
				originalOverflow = hoverName.overflowMode;
			}
			hoverName.textWrappingMode = (TextWrappingModes)0;
			hoverName.overflowMode = (TextOverflowModes)0;
		}
	}
}
[HarmonyPatch(typeof(InventoryGui), "UpdateContainerWeight")]
internal static class ConnectionUi
{
	private static GameObject tab;

	private static GameObject popup;

	private static TMP_Text number;

	private static TMP_Text details;

	private static TMP_Text burnRate;

	private static Woodkeeper current;

	private static float nextRefresh;

	private static Sprite connectionIcon;

	private static Image symbol;

	private static Image nativeSymbol;

	private static readonly FieldInfo CurrentContainer = AccessTools.Field(typeof(InventoryGui), "m_currentContainer");

	private static readonly FieldInfo GuiAnimator = AccessTools.Field(typeof(InventoryGui), "m_animator");

	internal static void LanguageChanged()
	{
		nextRefresh = 0f;
	}

	private static Sprite GetConnectionIcon()
	{
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Expected O, but got Unknown
		//IL_0092: 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)
		if (Object.op_Implicit((Object)(object)connectionIcon))
		{
			return c