Decompiled source of GreydwarfWorkers v1.0.1

BepInEx/plugins/GreydwarfWorkers/GreydwarfWorkers.dll

Decompiled 13 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using Jotunn.Managers;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("GreydwarfWorkers")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GreydwarfWorkers")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("5fe28502-d2ff-414f-a3ea-6261dfdcc2e4")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace GreydwarfWorkers;

public enum GatherResourceType
{
	Wood,
	Stone,
	Coal,
	Iron,
	FineWood,
	CoreWood,
	Copper,
	Tin,
	Silver,
	BlackMetal
}
public class GatherResourceDefinition
{
	public GatherResourceType Type { get; }

	public string ItemName { get; }

	public string DisplayName { get; }

	public GatherResourceDefinition(GatherResourceType type, string itemName, string displayName)
	{
		Type = type;
		ItemName = itemName;
		DisplayName = displayName;
	}
}
public class GreydwarfWorkerUI : MonoBehaviour
{
	private enum WorkerJob
	{
		Gathering,
		RefuelSmelter,
		PutOreInSmelter,
		RefuelLightsources,
		RefuelCharcoalKiln,
		DropInventory
	}

	private GameObject m_panel;

	private GameObject m_workerList;

	private GameObject m_inventoryPanel;

	private GameObject m_inventoryList;

	private GameObject m_jobPanel;

	private GameObject m_jobList;

	private ScrollRect m_workerScrollRect;

	private GreydwarfWorker m_selectedWorker;

	private GreydwarfWorkersPlugin m_plugin;

	private float m_inventoryRefreshTimer = 0f;

	private Text m_jobStatusText;

	private Text m_gatherResourceText;

	private const float PanelWidth = 700f;

	private const float PanelHeight = 600f;

	private const float InventoryPanelWidth = 600f;

	private const float InventoryPanelHeight = 550f;

	private const float InventoryRefreshInterval = 0.25f;

	private const float RowHeight = 60f;

	private const float RowSpacing = 10f;

	private const float JobPanelWidth = 600f;

	private const float JobPanelHeight = 620f;

	private const float JobButtonHeight = 50f;

	private const float JobButtonSpacing = 12f;

	private readonly Dictionary<string, Text> m_inventoryAmountTexts = new Dictionary<string, Text>();

	public static bool IsOpen { get; private set; }

	private void Awake()
	{
	}

	private void Update()
	{
		if ((Object)(object)m_jobPanel != (Object)null && m_jobPanel.activeSelf)
		{
			UpdateGatherResourceButton();
			RefreshJobStatus();
		}
		if ((Object)(object)m_inventoryPanel != (Object)null && m_inventoryPanel.activeSelf)
		{
			m_inventoryRefreshTimer += Time.deltaTime;
			if (m_inventoryRefreshTimer >= 0.25f)
			{
				m_inventoryRefreshTimer = 0f;
				UpdateInventoryAmounts();
			}
		}
		if (Input.GetKeyDown((KeyCode)27))
		{
			if ((Object)(object)m_jobPanel != (Object)null && m_jobPanel.activeSelf)
			{
				CloseJobMenu();
			}
			else if ((Object)(object)m_inventoryPanel != (Object)null && m_inventoryPanel.activeSelf)
			{
				CloseInventory();
			}
			else if ((Object)(object)m_panel != (Object)null && m_panel.activeSelf)
			{
				Close();
			}
		}
	}

	public void Initialize(GreydwarfWorkersPlugin plugin)
	{
		m_plugin = plugin;
	}

	public void Toggle()
	{
		if ((Object)(object)m_jobPanel != (Object)null && m_jobPanel.activeSelf)
		{
			CloseJobMenu();
			return;
		}
		if ((Object)(object)m_inventoryPanel != (Object)null && m_inventoryPanel.activeSelf)
		{
			CloseInventory();
			return;
		}
		if ((Object)(object)m_panel == (Object)null)
		{
			CreateUI();
		}
		if (!((Object)(object)m_panel == (Object)null))
		{
			bool flag = !m_panel.activeSelf;
			if (flag)
			{
				RefreshWorkerList();
			}
			m_panel.SetActive(flag);
			IsOpen = flag;
		}
	}

	public void Close()
	{
		if ((Object)(object)m_inventoryPanel != (Object)null)
		{
			m_inventoryPanel.SetActive(false);
		}
		if ((Object)(object)m_panel != (Object)null)
		{
			m_panel.SetActive(false);
			IsOpen = false;
		}
		if ((Object)(object)m_jobPanel != (Object)null)
		{
			m_jobPanel.SetActive(false);
		}
		m_selectedWorker = null;
	}

	private void CreateUI()
	{
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)m_panel != (Object)null))
		{
			if (GUIManager.Instance == null)
			{
				Debug.LogError((object)"[Greydwarf Workers] GUIManager is not available.");
				return;
			}
			if ((Object)(object)GUIManager.CustomGUIFront == (Object)null)
			{
				Debug.LogError((object)"[Greydwarf Workers] CustomGUIFront is not available.");
				return;
			}
			m_panel = GUIManager.Instance.CreateWoodpanel(GUIManager.CustomGUIFront.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), 700f, 600f, true);
			((Object)m_panel).name = "GreydwarfWorkerPanel";
			CreateTitle();
			CreateCloseButton();
			CreateWorkerList();
			CreateInventoryPanel();
			CreateJobPanel();
			m_panel.SetActive(false);
		}
	}

	private void CreateTitle()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		GUIManager.Instance.CreateText("GREYDWARF WORKERS", m_panel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -45f), GUIManager.Instance.AveriaSerifBold, 30, GUIManager.Instance.ValheimOrange, true, Color.black, 500f, 45f, false);
	}

	private void CreateCloseButton()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: 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_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Expected O, but got Unknown
		GameObject val = GUIManager.Instance.CreateButton("X", m_panel.transform, new Vector2(1f, 1f), new Vector2(1f, 1f), new Vector2(-35f, -35f), 50f, 50f);
		((Object)val).name = "GreydwarfWorkerCloseButton";
		Button component = val.GetComponent<Button>();
		if ((Object)(object)component != (Object)null)
		{
			((UnityEvent)component.onClick).AddListener(new UnityAction(Close));
		}
	}

	private void CreateWorkerList()
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c7: 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_01eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0202: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GUIManager.Instance.CreateScrollView(m_panel.transform, false, true, 12f, 5f, GUIManager.Instance.ValheimScrollbarHandleColorBlock, new Color(0f, 0f, 0f, 0.15f), 640f, 470f);
		((Object)val).name = "GreydwarfWorkerScrollView";
		RectTransform component = val.GetComponent<RectTransform>();
		component.anchoredPosition = new Vector2(0f, -20f);
		m_workerScrollRect = val.GetComponentInChildren<ScrollRect>(true);
		Scrollbar verticalScrollbar = m_workerScrollRect.verticalScrollbar;
		if ((Object)(object)verticalScrollbar != (Object)null)
		{
			RectTransform component2 = ((Component)verticalScrollbar).GetComponent<RectTransform>();
			component2.anchoredPosition = new Vector2(3f, component2.anchoredPosition.y);
		}
		if ((Object)(object)m_workerScrollRect == (Object)null || (Object)(object)m_workerScrollRect.content == (Object)null)
		{
			Debug.LogError((object)"[Greydwarf Workers] Failed to create worker scroll view.");
			return;
		}
		m_workerScrollRect.horizontal = false;
		m_workerScrollRect.vertical = true;
		m_workerScrollRect.movementType = (MovementType)2;
		m_workerScrollRect.scrollSensitivity = 35f;
		m_workerList = ((Component)m_workerScrollRect.content).gameObject;
		VerticalLayoutGroup component3 = m_workerList.GetComponent<VerticalLayoutGroup>();
		if ((Object)(object)component3 != (Object)null)
		{
			((Behaviour)component3).enabled = false;
		}
		ContentSizeFitter component4 = m_workerList.GetComponent<ContentSizeFitter>();
		if ((Object)(object)component4 != (Object)null)
		{
			((Behaviour)component4).enabled = false;
		}
		RectTransform component5 = m_workerList.GetComponent<RectTransform>();
		component5.anchorMin = new Vector2(0.5f, 0.5f);
		component5.anchorMax = new Vector2(0.5f, 0.5f);
		component5.pivot = new Vector2(0.5f, 0.5f);
		component5.anchoredPosition = Vector2.zero;
		component5.sizeDelta = new Vector2(640f, 470f);
	}

	private void RefreshWorkerList()
	{
		//IL_0135: 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_01c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_workerList == (Object)null)
		{
			return;
		}
		ClearWorkerList();
		List<Character> allCharacters = Character.GetAllCharacters();
		List<GreydwarfWorker> list = new List<GreydwarfWorker>();
		foreach (Character item in allCharacters)
		{
			if ((Object)(object)item == (Object)null || !((Object)item).name.Contains("Greydwarf"))
			{
				continue;
			}
			Tameable component = ((Component)item).GetComponent<Tameable>();
			if (!((Object)(object)component == (Object)null) && component.IsTamed())
			{
				GreydwarfWorker component2 = ((Component)item).GetComponent<GreydwarfWorker>();
				if (!((Object)(object)component2 == (Object)null))
				{
					list.Add(component2);
				}
			}
		}
		list.Sort(delegate(GreydwarfWorker a, GreydwarfWorker b)
		{
			Character component4 = ((Component)a).GetComponent<Character>();
			Character component5 = ((Component)b).GetComponent<Character>();
			string x = (((Object)(object)component4 != (Object)null) ? component4.GetHoverName() : "Greydwarf");
			string y = (((Object)(object)component5 != (Object)null) ? component5.GetHoverName() : "Greydwarf");
			return StringComparer.OrdinalIgnoreCase.Compare(x, y);
		});
		float num = (float)list.Count * 70f;
		float num2 = 470f;
		float num3 = Mathf.Max(num2, num);
		RectTransform component3 = m_workerList.GetComponent<RectTransform>();
		component3.sizeDelta = new Vector2(640f, num3);
		float num4 = num * 0.5f - 30f;
		for (int num5 = 0; num5 < list.Count; num5++)
		{
			CreateWorkerRow(list[num5], num4 - (float)num5 * 70f);
		}
		if (list.Count == 0)
		{
			GUIManager.Instance.CreateText("No tamed Greydwarves found.", m_workerList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), GUIManager.Instance.AveriaSerif, 22, Color.white, true, Color.black, 500f, 40f, false);
		}
		if ((Object)(object)m_workerScrollRect != (Object)null)
		{
			m_workerScrollRect.verticalNormalizedPosition = 1f;
		}
	}

	private void CreateWorkerRow(GreydwarfWorker worker, float yPosition)
	{
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: 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_0129: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: 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_0171: Unknown result type (might be due to invalid IL or missing references)
		//IL_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_0191: 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_01ce: 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_01ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fd: 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_0230: Unknown result type (might be due to invalid IL or missing references)
		//IL_023f: 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_025f: 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_0296: 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_02b4: 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_034b: Unknown result type (might be due to invalid IL or missing references)
		//IL_035a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0315: Unknown result type (might be due to invalid IL or missing references)
		//IL_031f: Expected O, but got Unknown
		//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c5: Expected O, but got Unknown
		Character component = ((Component)worker).GetComponent<Character>();
		string text = (((Object)(object)component != (Object)null) ? component.GetHoverName() : "Greydwarf");
		string text2 = (((Object)(object)component != (Object)null) ? $"{component.GetHealth():0} / {component.GetMaxHealth():0}" : "0 / 0");
		string text3;
		if (worker.IsWorking)
		{
			text3 = "Working";
		}
		else
		{
			MonsterAI val = (((Object)(object)component != (Object)null) ? ((Component)component).GetComponent<MonsterAI>() : null);
			text3 = ((!((Object)(object)val != (Object)null) || !((Object)(object)val.GetFollowTarget() != (Object)null)) ? "Inactive" : "Following");
		}
		GameObject val2 = new GameObject("GreydwarfWorkerRow");
		val2.transform.SetParent(m_workerList.transform, false);
		RectTransform val3 = val2.AddComponent<RectTransform>();
		val3.anchorMin = new Vector2(0.5f, 0.5f);
		val3.anchorMax = new Vector2(0.5f, 0.5f);
		val3.pivot = new Vector2(0.5f, 0.5f);
		val3.anchoredPosition = new Vector2(0f, yPosition);
		val3.sizeDelta = new Vector2(620f, 60f);
		GUIManager.Instance.CreateText(text, val2.transform, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(140f, 0f), GUIManager.Instance.AveriaSerifBold, 22, Color.white, true, Color.black, 220f, 35f, false);
		GUIManager.Instance.CreateText("HP: " + text2, val2.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(-40f, 10f), GUIManager.Instance.AveriaSerif, 18, Color.white, true, Color.black, 180f, 30f, false);
		GUIManager.Instance.CreateText(text3, val2.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(-40f, -12f), GUIManager.Instance.AveriaSerif, 17, Color.white, true, Color.black, 180f, 28f, false);
		GameObject val4 = GUIManager.Instance.CreateButton("Inventory", val2.transform, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-210f, 0f), 140f, 45f);
		((Object)val4).name = "GreydwarfInventoryButton";
		Button component2 = val4.GetComponent<Button>();
		if ((Object)(object)component2 != (Object)null)
		{
			GreydwarfWorker selectedWorker = worker;
			((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
			{
				OpenInventory(selectedWorker);
			});
		}
		GameObject val5 = GUIManager.Instance.CreateButton("Job", val2.transform, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-60f, 0f), 100f, 45f);
		((Object)val5).name = "GreydwarfJobButton";
		Button component3 = val5.GetComponent<Button>();
		if ((Object)(object)component3 != (Object)null)
		{
			GreydwarfWorker selectedWorker2 = worker;
			((UnityEvent)component3.onClick).AddListener((UnityAction)delegate
			{
				OpenJobMenu(selectedWorker2);
			});
		}
	}

	private void OpenJobMenu(GreydwarfWorker worker)
	{
		if ((Object)(object)worker == (Object)null || (Object)(object)m_jobPanel == (Object)null)
		{
			return;
		}
		m_selectedWorker = worker;
		UpdateGatherResourceButton();
		RefreshJobStatus();
		Character component = ((Component)worker).GetComponent<Character>();
		string text = (((Object)(object)component != (Object)null) ? component.GetHoverName() : "Greydwarf");
		Transform val = m_jobPanel.transform.Find("GreydwarfJobTitle");
		if ((Object)(object)val != (Object)null)
		{
			Text component2 = ((Component)val).GetComponent<Text>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.text = text + "'s JOBS";
			}
		}
		m_panel.SetActive(false);
		m_jobPanel.SetActive(true);
	}

	private void CloseJobMenu()
	{
		if ((Object)(object)m_jobPanel != (Object)null)
		{
			m_jobPanel.SetActive(false);
		}
		m_selectedWorker = null;
		if ((Object)(object)m_panel != (Object)null)
		{
			m_panel.SetActive(true);
			RefreshWorkerList();
		}
	}

	private void OnJobSelected(WorkerJob job)
	{
		if ((Object)(object)m_selectedWorker == (Object)null)
		{
			return;
		}
		if ((Object)(object)m_plugin == (Object)null)
		{
			Debug.LogError((object)"[Greydwarf Workers] Plugin reference is missing.");
			return;
		}
		if (job != WorkerJob.DropInventory)
		{
			StopSelectedWorker();
		}
		switch (job)
		{
		case WorkerJob.Gathering:
			m_plugin.StartGathering(m_selectedWorker);
			break;
		case WorkerJob.RefuelSmelter:
			m_plugin.RefuelSmelter(m_selectedWorker);
			break;
		case WorkerJob.PutOreInSmelter:
			m_plugin.PutOreInSmelter(m_selectedWorker);
			break;
		case WorkerJob.RefuelLightsources:
			m_plugin.RefuelLightsources(m_selectedWorker);
			break;
		case WorkerJob.RefuelCharcoalKiln:
			m_plugin.RefuelCharcoalKiln(m_selectedWorker);
			break;
		case WorkerJob.DropInventory:
			m_plugin.DropInventory(m_selectedWorker);
			break;
		}
		CloseJobMenu();
	}

	private void CreateInventoryPanel()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: 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_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)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Expected O, but got Unknown
		//IL_01af: 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_01db: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Expected O, but got Unknown
		m_inventoryPanel = GUIManager.Instance.CreateWoodpanel(GUIManager.CustomGUIFront.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), 600f, 550f, true);
		((Object)m_inventoryPanel).name = "GreydwarfInventoryPanel";
		GameObject val = GUIManager.Instance.CreateText("INVENTORY", m_inventoryPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -45f), GUIManager.Instance.AveriaSerifBold, 30, GUIManager.Instance.ValheimOrange, true, Color.black, 400f, 45f, false);
		((Object)val).name = "GreydwarfInventoryTitle";
		GameObject val2 = GUIManager.Instance.CreateButton("X", m_inventoryPanel.transform, new Vector2(1f, 1f), new Vector2(1f, 1f), new Vector2(-35f, -35f), 50f, 50f);
		((Object)val2).name = "GreydwarfInventoryCloseButton";
		Button component = val2.GetComponent<Button>();
		if ((Object)(object)component != (Object)null)
		{
			((UnityEvent)component.onClick).AddListener(new UnityAction(CloseInventory));
		}
		m_inventoryList = new GameObject("GreydwarfInventoryList");
		m_inventoryList.transform.SetParent(m_inventoryPanel.transform, false);
		RectTransform val3 = m_inventoryList.AddComponent<RectTransform>();
		val3.anchorMin = new Vector2(0.5f, 0.5f);
		val3.anchorMax = new Vector2(0.5f, 0.5f);
		val3.pivot = new Vector2(0.5f, 0.5f);
		val3.anchoredPosition = new Vector2(0f, -15f);
		val3.sizeDelta = new Vector2(520f, 420f);
		m_inventoryPanel.SetActive(false);
	}

	private void OpenInventory(GreydwarfWorker worker)
	{
		if (!((Object)(object)worker == (Object)null) && !((Object)(object)m_inventoryPanel == (Object)null))
		{
			m_selectedWorker = worker;
			m_inventoryRefreshTimer = 0f;
			RefreshInventory();
			m_panel.SetActive(false);
			m_inventoryPanel.SetActive(true);
		}
	}

	private void RefreshInventory()
	{
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: 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)
		if ((Object)(object)m_inventoryList == (Object)null || (Object)(object)m_selectedWorker == (Object)null)
		{
			return;
		}
		ClearInventoryList();
		Character component = ((Component)m_selectedWorker).GetComponent<Character>();
		string text = (((Object)(object)component != (Object)null) ? component.GetHoverName() : "Greydwarf");
		Transform val = m_inventoryPanel.transform.Find("GreydwarfInventoryTitle");
		if ((Object)(object)val != (Object)null)
		{
			Text component2 = ((Component)val).GetComponent<Text>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.text = text + "'s INVENTORY";
			}
		}
		WorkerInventory component3 = ((Component)m_selectedWorker).GetComponent<WorkerInventory>();
		if ((Object)(object)component3 == (Object)null || component3.IsEmpty())
		{
			GUIManager.Instance.CreateText("Inventory is empty.", m_inventoryList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), GUIManager.Instance.AveriaSerif, 22, Color.white, true, Color.black, 450f, 40f, false);
			return;
		}
		Dictionary<string, int> allItems = component3.GetAllItems();
		float num = (float)allItems.Count * 70f;
		float num2 = num * 0.5f - 30f;
		int num3 = 0;
		foreach (KeyValuePair<string, int> item in allItems)
		{
			CreateInventoryRow(component3, item.Key, item.Value, num2 - (float)num3 * 70f);
			num3++;
		}
	}

	private void CreateInventoryRow(WorkerInventory inventory, string itemName, int amount, float yPosition)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: 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_008b: 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_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: 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_0152: Unknown result type (might be due to invalid IL or missing references)
		//IL_0163: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject("GreydwarfInventoryRow");
		val.transform.SetParent(m_inventoryList.transform, false);
		RectTransform val2 = val.AddComponent<RectTransform>();
		val2.anchorMin = new Vector2(0.5f, 0.5f);
		val2.anchorMax = new Vector2(0.5f, 0.5f);
		val2.pivot = new Vector2(0.5f, 0.5f);
		val2.anchoredPosition = new Vector2(0f, yPosition);
		val2.sizeDelta = new Vector2(500f, 60f);
		string displayItemName = GetDisplayItemName(itemName);
		int capacity = inventory.GetCapacity(itemName);
		GUIManager.Instance.CreateText(displayItemName, val.transform, new Vector2(0f, 0.5f), new Vector2(0f, 0.5f), new Vector2(120f, 0f), GUIManager.Instance.AveriaSerifBold, 21, Color.white, true, Color.black, 250f, 35f, false);
		GameObject val3 = GUIManager.Instance.CreateText(amount + " / " + capacity, val.transform, new Vector2(1f, 0.5f), new Vector2(1f, 0.5f), new Vector2(-80f, 0f), GUIManager.Instance.AveriaSerif, 21, Color.white, true, Color.black, 150f, 35f, false);
		Text component = val3.GetComponent<Text>();
		if ((Object)(object)component != (Object)null)
		{
			m_inventoryAmountTexts[itemName] = component;
		}
	}

	private void CreateJobPanel()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: 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_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)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: 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_019a: 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_01ba: 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_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Expected O, but got Unknown
		//IL_0223: 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_024f: 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_027b: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Expected O, but got Unknown
		//IL_0342: 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_0360: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b3: Expected O, but got Unknown
		m_jobPanel = GUIManager.Instance.CreateWoodpanel(GUIManager.CustomGUIFront.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), 600f, 620f, true);
		((Object)m_jobPanel).name = "GreydwarfJobPanel";
		GameObject val = GUIManager.Instance.CreateText("JOBS", m_jobPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -45f), GUIManager.Instance.AveriaSerifBold, 30, GUIManager.Instance.ValheimOrange, true, Color.black, 400f, 45f, false);
		((Object)val).name = "GreydwarfJobTitle";
		GameObject val2 = GUIManager.Instance.CreateButton("X", m_jobPanel.transform, new Vector2(1f, 1f), new Vector2(1f, 1f), new Vector2(-35f, -35f), 50f, 50f);
		((Object)val2).name = "GreydwarfJobCloseButton";
		Button component = val2.GetComponent<Button>();
		if ((Object)(object)component != (Object)null)
		{
			((UnityEvent)component.onClick).AddListener(new UnityAction(CloseJobMenu));
		}
		m_jobStatusText = GUIManager.Instance.CreateText("Current Job: Inactive", m_jobPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -95f), GUIManager.Instance.AveriaSerif, 20, Color.white, true, Color.black, 500f, 35f, false).GetComponent<Text>();
		m_jobList = new GameObject("GreydwarfJobList");
		m_jobList.transform.SetParent(m_jobPanel.transform, false);
		RectTransform val3 = m_jobList.AddComponent<RectTransform>();
		val3.anchorMin = new Vector2(0.5f, 0.5f);
		val3.anchorMax = new Vector2(0.5f, 0.5f);
		val3.pivot = new Vector2(0.5f, 0.5f);
		val3.anchoredPosition = new Vector2(0f, -50f);
		val3.sizeDelta = new Vector2(520f, 490f);
		string[] array = new string[5] { "Refuel Smelter", "Put Ore in Smelter", "Refuel Lightsources", "Refuel Charcoal Kiln", "Drop Inventory" };
		WorkerJob[] array2 = new WorkerJob[5]
		{
			WorkerJob.RefuelSmelter,
			WorkerJob.PutOreInSmelter,
			WorkerJob.RefuelLightsources,
			WorkerJob.RefuelCharcoalKiln,
			WorkerJob.DropInventory
		};
		float num = 372f;
		float num2 = num * 0.5f - 25f;
		CreateGatheringRow(num2);
		for (int i = 0; i < array.Length; i++)
		{
			CreateJobButton(array[i], array2[i], num2 - (float)(i + 1) * 62f);
		}
		GameObject val4 = GUIManager.Instance.CreateButton("Stop Working", m_jobPanel.transform, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 40f), 250f, 50f);
		((Object)val4).name = "GreydwarfStopWorkingButton";
		Button component2 = val4.GetComponent<Button>();
		if ((Object)(object)component2 != (Object)null)
		{
			((UnityEvent)component2.onClick).AddListener(new UnityAction(StopSelectedWorker));
		}
		m_jobPanel.SetActive(false);
	}

	private void UpdateGatherResourceButton()
	{
		if (!((Object)(object)m_gatherResourceText == (Object)null) && !((Object)(object)m_selectedWorker == (Object)null))
		{
			m_gatherResourceText.text = m_selectedWorker.GetCurrentResourceDefinition().DisplayName;
		}
	}

	private void PreviousSelectedWorkerResource()
	{
		if (!((Object)(object)m_selectedWorker == (Object)null))
		{
			m_selectedWorker.PreviousGatherResource();
			UpdateGatherResourceButton();
			RefreshJobStatus();
		}
	}

	private void NextSelectedWorkerResource()
	{
		if (!((Object)(object)m_selectedWorker == (Object)null))
		{
			m_selectedWorker.NextGatherResource();
			UpdateGatherResourceButton();
			RefreshJobStatus();
		}
	}

	private void StopSelectedWorker()
	{
		if (!((Object)(object)m_selectedWorker == (Object)null))
		{
			m_selectedWorker.SetState(GreydwarfWorker.WorkerState.Inactive);
			RefreshJobStatus();
		}
	}

	private string GetCurrentJobText()
	{
		if ((Object)(object)m_selectedWorker == (Object)null)
		{
			return "Current Job: Inactive";
		}
		switch (m_selectedWorker.CurrentState)
		{
		case GreydwarfWorker.WorkerState.Gathering:
		case GreydwarfWorker.WorkerState.MovingToResource:
		case GreydwarfWorker.WorkerState.SearchingForChest:
		case GreydwarfWorker.WorkerState.MovingToChest:
		case GreydwarfWorker.WorkerState.WaitingForChest:
			return "Current Job: Gathering " + m_selectedWorker.GetCurrentResourceDefinition().DisplayName;
		case GreydwarfWorker.WorkerState.SearchingForSupplyChest:
		case GreydwarfWorker.WorkerState.MovingToSupplyChest:
		case GreydwarfWorker.WorkerState.RetrievingFromChest:
		case GreydwarfWorker.WorkerState.SearchingForSmelter:
		case GreydwarfWorker.WorkerState.MovingToSmelter:
		case GreydwarfWorker.WorkerState.DepositingToSmelter:
		case GreydwarfWorker.WorkerState.WaitingForSmelter:
			return "Current Job: Refuel Smelter";
		case GreydwarfWorker.WorkerState.SearchingForOreChest:
		case GreydwarfWorker.WorkerState.MovingToOreChest:
		case GreydwarfWorker.WorkerState.RetrievingOreFromChest:
		case GreydwarfWorker.WorkerState.SearchingForOreSmelter:
		case GreydwarfWorker.WorkerState.MovingToOreSmelter:
		case GreydwarfWorker.WorkerState.DepositingOreToSmelter:
		case GreydwarfWorker.WorkerState.WaitingForOreSmelter:
			return "Current Job: Put Ore in Smelter";
		case GreydwarfWorker.WorkerState.SearchingForFireplace:
		case GreydwarfWorker.WorkerState.MovingToFireplace:
		case GreydwarfWorker.WorkerState.SearchingForFireplaceFuel:
		case GreydwarfWorker.WorkerState.MovingToFireplaceFuelChest:
		case GreydwarfWorker.WorkerState.RetrievingFireplaceFuel:
		case GreydwarfWorker.WorkerState.MovingToFireplaceWithFuel:
		case GreydwarfWorker.WorkerState.DepositingToFireplace:
		case GreydwarfWorker.WorkerState.WaitingForFireplace:
			return "Current Job: Refuel Lightsources";
		case GreydwarfWorker.WorkerState.SearchingForKiln:
		case GreydwarfWorker.WorkerState.MovingToKiln:
		case GreydwarfWorker.WorkerState.DepositingToKiln:
		case GreydwarfWorker.WorkerState.WaitingForKiln:
		case GreydwarfWorker.WorkerState.SearchingForKilnChest:
		case GreydwarfWorker.WorkerState.MovingToKilnChest:
		case GreydwarfWorker.WorkerState.RetrievingKilnMaterial:
			return "Current Job: Refuel Charcoal Kiln";
		default:
			return "Current Job: Inactive";
		}
	}

	private void RefreshJobStatus()
	{
		if (!((Object)(object)m_jobStatusText == (Object)null))
		{
			m_jobStatusText.text = GetCurrentJobText();
		}
	}

	private void CreateJobButton(string jobName, WorkerJob job, float yPosition)
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: 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_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Expected O, but got Unknown
		GameObject val = GUIManager.Instance.CreateButton(jobName, m_jobList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, yPosition), 400f, 50f);
		((Object)val).name = "GreydwarfJobOption_" + job;
		Button component = val.GetComponent<Button>();
		if ((Object)(object)component != (Object)null)
		{
			WorkerJob selectedJob = job;
			((UnityEvent)component.onClick).AddListener((UnityAction)delegate
			{
				OnJobSelected(selectedJob);
			});
		}
	}

	private void CreateGatheringRow(float yPosition)
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: 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_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Expected O, but got Unknown
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: 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_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Expected O, but got Unknown
		//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f2: 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_0245: Expected O, but got Unknown
		GameObject val = GUIManager.Instance.CreateButton("Gathering", m_jobList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(-115f, yPosition), 220f, 50f);
		((Object)val).name = "GreydwarfGatheringButton";
		Button component = val.GetComponent<Button>();
		if ((Object)(object)component != (Object)null)
		{
			((UnityEvent)component.onClick).AddListener((UnityAction)delegate
			{
				OnJobSelected(WorkerJob.Gathering);
			});
		}
		GameObject val2 = GUIManager.Instance.CreateButton("<", m_jobList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(40f, yPosition), 35f, 50f);
		((Object)val2).name = "GreydwarfGatherPreviousButton";
		Button component2 = val2.GetComponent<Button>();
		if ((Object)(object)component2 != (Object)null)
		{
			((UnityEvent)component2.onClick).AddListener(new UnityAction(PreviousSelectedWorkerResource));
		}
		GameObject val3 = GUIManager.Instance.CreateText("Wood", m_jobList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(120f, yPosition - 3f), GUIManager.Instance.AveriaSerifBold, 21, Color.yellow, true, Color.black, 125f, 50f, false);
		((Object)val3).name = "GreydwarfGatherResourceText";
		m_gatherResourceText = val3.GetComponent<Text>();
		if ((Object)(object)m_gatherResourceText != (Object)null)
		{
			m_gatherResourceText.alignment = (TextAnchor)4;
		}
		GameObject val4 = GUIManager.Instance.CreateButton(">", m_jobList.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(200f, yPosition), 35f, 50f);
		((Object)val4).name = "GreydwarfGatherNextButton";
		Button component3 = val4.GetComponent<Button>();
		if ((Object)(object)component3 != (Object)null)
		{
			((UnityEvent)component3.onClick).AddListener(new UnityAction(NextSelectedWorkerResource));
		}
		UpdateGatherResourceButton();
	}

	private string GetDisplayItemName(string itemName)
	{
		return itemName switch
		{
			"$item_wood" => "Wood", 
			"$item_stone" => "Stone", 
			"$item_coal" => "Coal", 
			"$item_iron" => "Iron", 
			"$item_copperore" => "Copper Ore", 
			"$item_tinore" => "Tin Ore", 
			"$item_ironscrap" => "Iron Scrap", 
			"$item_silverore" => "Silver Ore", 
			"$item_resin" => "Resin", 
			"$item_greydwarf_eye" => "Greydwarf Eye", 
			"$item_guck" => "Guck", 
			"$item_finewood" => "Fine Wood", 
			"$item_roundlog" => "Round Log", 
			"$item_copper" => "Copper", 
			"$item_tin" => "Tin", 
			"$item_silver" => "Silver", 
			"$item_blackmetal" => "Black Metal", 
			_ => itemName, 
		};
	}

	private void ClearWorkerList()
	{
		if (!((Object)(object)m_workerList == (Object)null))
		{
			for (int num = m_workerList.transform.childCount - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)((Component)m_workerList.transform.GetChild(num)).gameObject);
			}
		}
	}

	private void ClearInventoryList()
	{
		m_inventoryAmountTexts.Clear();
		if (!((Object)(object)m_inventoryList == (Object)null))
		{
			for (int num = m_inventoryList.transform.childCount - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)((Component)m_inventoryList.transform.GetChild(num)).gameObject);
			}
		}
	}

	private void CloseInventory()
	{
		if ((Object)(object)m_inventoryPanel != (Object)null)
		{
			m_inventoryPanel.SetActive(false);
		}
		m_selectedWorker = null;
		if ((Object)(object)m_panel != (Object)null)
		{
			m_panel.SetActive(true);
			RefreshWorkerList();
		}
	}

	private void OnDestroy()
	{
		if ((Object)(object)m_panel != (Object)null || (Object)(object)m_inventoryPanel != (Object)null)
		{
			IsOpen = false;
		}
	}

	private void UpdateInventoryAmounts()
	{
		if ((Object)(object)m_inventoryPanel == (Object)null || !m_inventoryPanel.activeSelf || (Object)(object)m_selectedWorker == (Object)null)
		{
			return;
		}
		WorkerInventory component = ((Component)m_selectedWorker).GetComponent<WorkerInventory>();
		if ((Object)(object)component == (Object)null)
		{
			return;
		}
		Dictionary<string, int> allItems = component.GetAllItems();
		foreach (KeyValuePair<string, Text> inventoryAmountText in m_inventoryAmountTexts)
		{
			string key = inventoryAmountText.Key;
			Text value = inventoryAmountText.Value;
			if (!((Object)(object)value == (Object)null))
			{
				int amount = component.GetAmount(key);
				int capacity = component.GetCapacity(key);
				value.text = amount + " / " + capacity;
			}
		}
		bool flag = allItems.Count != m_inventoryAmountTexts.Count;
		if (!flag)
		{
			foreach (string key2 in allItems.Keys)
			{
				if (!m_inventoryAmountTexts.ContainsKey(key2))
				{
					flag = true;
					break;
				}
			}
		}
		if (!flag)
		{
			foreach (string key3 in m_inventoryAmountTexts.Keys)
			{
				if (!allItems.ContainsKey(key3))
				{
					flag = true;
					break;
				}
			}
		}
		if (flag)
		{
			RefreshInventory();
		}
	}
}
[HarmonyPatch(typeof(MonsterAI), "UpdateAI")]
public static class MonsterAIWorkerPatch
{
	private static bool Prefix(MonsterAI __instance, float dt)
	{
		GreydwarfWorker component = ((Component)__instance).GetComponent<GreydwarfWorker>();
		if ((Object)(object)component == (Object)null)
		{
			return true;
		}
		if (!component.IsWorking)
		{
			return true;
		}
		return false;
	}
}
public class WorkerInventory : MonoBehaviour
{
	private ZNetView m_nview;

	private const string InventoryZdoPrefix = "GreydwarfWorkers_Inventory_";

	private static readonly Dictionary<string, int> ResourceCapacities = new Dictionary<string, int>
	{
		{ "$item_wood", 20 },
		{ "$item_stone", 20 },
		{ "$item_coal", 20 },
		{ "$item_iron", 10 }
	};

	private readonly Dictionary<string, int> m_items = new Dictionary<string, int>();

	private static readonly Dictionary<string, string> ItemPrefabNames = new Dictionary<string, string>
	{
		{ "$item_wood", "Wood" },
		{ "$item_stone", "Stone" },
		{ "$item_coal", "Coal" },
		{ "$item_iron", "Iron" },
		{ "$item_copperore", "CopperOre" },
		{ "$item_tinore", "TinOre" },
		{ "$item_ironscrap", "IronScrap" },
		{ "$item_silverore", "SilverOre" },
		{ "$item_resin", "Resin" },
		{ "$item_greydwarf_eye", "GreydwarfEye" },
		{ "$item_guck", "Guck" },
		{ "$item_finewood", "FineWood" },
		{ "$item_roundlog", "RoundLog" },
		{ "$item_copper", "Copper" },
		{ "$item_tin", "Tin" },
		{ "$item_silver", "Silver" },
		{ "$item_blackmetal", "BlackMetal" }
	};

	public int CapacityPerResource { get; set; } = 20;

	private void Start()
	{
		m_nview = ((Component)this).GetComponent<ZNetView>();
		LoadInventory();
	}

	private string GetInventoryZdoKey(string itemName)
	{
		return "GreydwarfWorkers_Inventory_" + itemName;
	}

	private void SaveInventory()
	{
		if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid() || !m_nview.IsOwner())
		{
			return;
		}
		ZDO zDO = m_nview.GetZDO();
		if (zDO == null)
		{
			return;
		}
		foreach (string key in ItemPrefabNames.Keys)
		{
			int amount = GetAmount(key);
			zDO.Set(GetInventoryZdoKey(key), amount);
		}
	}

	private void LoadInventory()
	{
		if ((Object)(object)m_nview == (Object)null || !m_nview.IsValid())
		{
			return;
		}
		ZDO zDO = m_nview.GetZDO();
		if (zDO == null)
		{
			return;
		}
		m_items.Clear();
		foreach (string key in ItemPrefabNames.Keys)
		{
			int num = zDO.GetInt(GetInventoryZdoKey(key), 0);
			if (num > 0)
			{
				m_items[key] = num;
			}
		}
	}

	public bool AddItem(string itemName, int amount = 1)
	{
		if (amount <= 0)
		{
			return false;
		}
		int amount2 = GetAmount(itemName);
		if (amount2 + amount > GetCapacity(itemName))
		{
			return false;
		}
		m_items[itemName] = amount2 + amount;
		SaveInventory();
		return true;
	}

	public int GetAmount(string itemName)
	{
		if (m_items.TryGetValue(itemName, out var value))
		{
			return value;
		}
		return 0;
	}

	public int GetCapacity(string itemName)
	{
		if (ResourceCapacities.TryGetValue(itemName, out var value))
		{
			return value;
		}
		return CapacityPerResource;
	}

	public bool RemoveItem(string itemName, int amount)
	{
		if (amount <= 0)
		{
			return false;
		}
		int amount2 = GetAmount(itemName);
		if (amount2 < amount)
		{
			return false;
		}
		amount2 -= amount;
		if (amount2 == 0)
		{
			m_items.Remove(itemName);
		}
		else
		{
			m_items[itemName] = amount2;
		}
		SaveInventory();
		return true;
	}

	public bool IsFull(string itemName)
	{
		return GetAmount(itemName) >= GetCapacity(itemName);
	}

	public bool IsEmpty()
	{
		return m_items.Count == 0;
	}

	public void Clear()
	{
		m_items.Clear();
		SaveInventory();
	}

	public int GetTotalItemCount()
	{
		int num = 0;
		foreach (int value in m_items.Values)
		{
			num += value;
		}
		return num;
	}

	public Dictionary<string, int> GetAllItems()
	{
		return new Dictionary<string, int>(m_items);
	}

	public bool TryCreateItemData(string itemName, int amount, out ItemData itemData)
	{
		itemData = null;
		if (amount <= 0 || (Object)(object)ObjectDB.instance == (Object)null)
		{
			return false;
		}
		if (!ItemPrefabNames.TryGetValue(itemName, out var value))
		{
			return false;
		}
		GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(value);
		if ((Object)(object)itemPrefab == (Object)null)
		{
			Debug.LogWarning((object)("[Greydwarf Workers] Could not find item prefab '" + value + "'."));
			return false;
		}
		ItemDrop component = itemPrefab.GetComponent<ItemDrop>();
		if ((Object)(object)component == (Object)null)
		{
			Debug.LogWarning((object)("[Greydwarf Workers] Prefab '" + value + "' has no ItemDrop."));
			return false;
		}
		itemData = component.m_itemData.Clone();
		itemData.m_dropPrefab = itemPrefab;
		itemData.m_stack = amount;
		itemData.m_worldLevel = (byte)Game.m_worldLevel;
		return true;
	}

	public int TransferResourceToChest(Container chest, string itemName)
	{
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Expected O, but got Unknown
		if ((Object)(object)chest == (Object)null)
		{
			return 0;
		}
		Inventory inventory = chest.GetInventory();
		if (inventory == null)
		{
			return 0;
		}
		int amount = GetAmount(itemName);
		if (amount <= 0)
		{
			return 0;
		}
		if (!TryCreateItemData(itemName, amount, out var itemData))
		{
			return 0;
		}
		Inventory val = new Inventory(true);
		if (!val.AddItem(itemData))
		{
			return 0;
		}
		int num = val.NrOfItemsIncludingStacks();
		List<ItemData> list = new List<ItemData>(val.GetAllItems());
		foreach (ItemData item in list)
		{
			inventory.MoveItemToThis(val, item);
		}
		int num2 = val.NrOfItemsIncludingStacks();
		int num3 = num - num2;
		if (num3 > 0)
		{
			RemoveItem(itemName, num3);
		}
		return num3;
	}

	public void DropAllItems()
	{
		//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_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: 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_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_0178: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01da: 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)
		if ((Object)(object)ObjectDB.instance == (Object)null)
		{
			Debug.LogWarning((object)"[Greydwarf Workers] ObjectDB is not available.");
			return;
		}
		Vector3 val = ((Component)this).transform.position + Vector3.up * 0.5f;
		Dictionary<string, int> dictionary = new Dictionary<string, int>(m_items);
		foreach (KeyValuePair<string, int> item in dictionary)
		{
			if (item.Value <= 0)
			{
				continue;
			}
			if (!ItemPrefabNames.TryGetValue(item.Key, out var value))
			{
				Debug.LogWarning((object)("[Greydwarf Workers] No prefab mapping found for " + item.Key + "."));
				continue;
			}
			GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(value);
			if ((Object)(object)itemPrefab == (Object)null)
			{
				Debug.LogWarning((object)("[Greydwarf Workers] Could not find item prefab '" + value + "' for " + item.Key + "."));
				continue;
			}
			ItemDrop component = itemPrefab.GetComponent<ItemDrop>();
			if ((Object)(object)component == (Object)null)
			{
				Debug.LogWarning((object)("[Greydwarf Workers] Prefab '" + value + "' has no ItemDrop component."));
				continue;
			}
			ItemData val2 = component.m_itemData.Clone();
			val2.m_dropPrefab = itemPrefab;
			val2.m_stack = item.Value;
			ItemDrop val3 = ItemDrop.DropItem(val2, item.Value, val, Quaternion.identity);
			if ((Object)(object)val3 == (Object)null)
			{
				Debug.LogWarning((object)("[Greydwarf Workers] Failed to spawn '" + value + "'."));
				continue;
			}
			Rigidbody component2 = ((Component)val3).GetComponent<Rigidbody>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.linearVelocity = (Vector3.up + Random.insideUnitSphere * 0.2f) * 2f;
			}
		}
		m_items.Clear();
		SaveInventory();
	}
}
public static class WorkerMovement
{
	private static readonly MethodInfo MoveToMethod = typeof(BaseAI).GetMethod("MoveTo", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[4]
	{
		typeof(float),
		typeof(Vector3),
		typeof(float),
		typeof(bool)
	}, null);

	public static bool MoveTo(MonsterAI monsterAI, float deltaTime, Vector3 target, float stopDistance)
	{
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)monsterAI == (Object)null || MoveToMethod == null)
		{
			return false;
		}
		object obj = MoveToMethod.Invoke(monsterAI, new object[4] { deltaTime, target, stopDistance, false });
		bool flag = default(bool);
		int num;
		if (obj is bool)
		{
			flag = (bool)obj;
			num = 1;
		}
		else
		{
			num = 0;
		}
		return (byte)((uint)num & (flag ? 1u : 0u)) != 0;
	}
}
public class GreydwarfWorker : MonoBehaviour
{
	public enum WorkerState
	{
		Inactive,
		Gathering,
		MovingToResource,
		SearchingForChest,
		MovingToChest,
		WaitingForChest,
		SearchingForSupplyChest,
		MovingToSupplyChest,
		RetrievingFromChest,
		SearchingForSmelter,
		MovingToSmelter,
		DepositingToSmelter,
		WaitingForSmelter,
		SearchingForOreChest,
		MovingToOreChest,
		RetrievingOreFromChest,
		SearchingForOreSmelter,
		MovingToOreSmelter,
		DepositingOreToSmelter,
		WaitingForOreSmelter,
		SearchingForFireplace,
		MovingToFireplace,
		SearchingForFireplaceFuel,
		MovingToFireplaceFuelChest,
		RetrievingFireplaceFuel,
		MovingToFireplaceWithFuel,
		DepositingToFireplace,
		WaitingForFireplace,
		SearchingForKiln,
		MovingToKiln,
		DepositingToKiln,
		WaitingForKiln,
		SearchingForKilnChest,
		MovingToKilnChest,
		RetrievingKilnMaterial
	}

	private Character m_character;

	private MonsterAI m_monsterAI;

	private Tameable m_tameable;

	private ItemDrop m_targetResource;

	private WorkerInventory m_inventory;

	private Container m_targetChest;

	private Container m_targetSupplyChest;

	private Container m_targetOreChest;

	private Container m_targetFireplaceFuelChest;

	private Container m_targetKilnChest;

	private string m_targetOreItemName;

	private string m_targetFireplaceFuelItemName;

	private string m_targetKilnItemName;

	private Smelter m_targetSmelter;

	private Smelter m_targetOreSmelter;

	private Smelter m_targetKiln;

	private Fireplace m_targetFireplace;

	private float m_searchTimer;

	private float m_smelterWaitTimer;

	private float m_oreSmelterWaitTimer;

	private float m_fireplaceWaitTimer;

	private float m_kilnWaitTimer;

	private const float KilnWaitInterval = 15f;

	private const float ChestSearchRange = 30f;

	private const float ChestSearchInterval = 5f;

	private const float ResourceSearchRange = 20f;

	private const float ResourceSearchInterval = 2f;

	private const float ResourceCollectRange = 2.5f;

	private const float SmelterWaitInterval = 15f;

	private const float OreSmelterWaitInterval = 30f;

	private const float FireplaceWaitInterval = 30f;

	public WorkerState CurrentState { get; private set; } = WorkerState.Inactive;

	public bool IsWorking => CurrentState != WorkerState.Inactive;

	public GatherResourceType CurrentGatherResource { get; private set; } = GatherResourceType.Wood;

	private void Awake()
	{
		m_character = ((Component)this).GetComponent<Character>();
		m_monsterAI = ((Component)this).GetComponent<MonsterAI>();
		m_tameable = ((Component)this).GetComponent<Tameable>();
		m_inventory = ((Component)this).GetComponent<WorkerInventory>();
		if ((Object)(object)m_inventory == (Object)null)
		{
			m_inventory = ((Component)this).gameObject.AddComponent<WorkerInventory>();
		}
		if ((Object)(object)m_character != (Object)null)
		{
			Character character = m_character;
			character.m_onDeath = (Action)Delegate.Combine(character.m_onDeath, new Action(OnDeath));
		}
	}

	private void Update()
	{
		if (!((Object)(object)m_tameable == (Object)null) && m_tameable.IsTamed())
		{
			switch (CurrentState)
			{
			case WorkerState.Inactive:
				UpdateIdle();
				break;
			case WorkerState.Gathering:
				UpdateGathering();
				break;
			case WorkerState.MovingToResource:
				UpdateMovingToResource();
				break;
			case WorkerState.SearchingForChest:
				UpdateSearchingForChest();
				break;
			case WorkerState.MovingToChest:
				UpdateMovingToChest();
				break;
			case WorkerState.WaitingForChest:
				UpdateWaitingForChest();
				break;
			case WorkerState.SearchingForSupplyChest:
				UpdateSearchingForSupplyChest();
				break;
			case WorkerState.MovingToSupplyChest:
				UpdateMovingToSupplyChest();
				break;
			case WorkerState.RetrievingFromChest:
				UpdateRetrievingFromChest();
				break;
			case WorkerState.SearchingForSmelter:
				UpdateSearchingForSmelter();
				break;
			case WorkerState.MovingToSmelter:
				UpdateMovingToSmelter();
				break;
			case WorkerState.DepositingToSmelter:
				UpdateDepositingToSmelter();
				break;
			case WorkerState.WaitingForSmelter:
				UpdateWaitingForSmelter();
				break;
			case WorkerState.SearchingForOreChest:
				UpdateSearchingForOreChest();
				break;
			case WorkerState.MovingToOreChest:
				UpdateMovingToOreChest();
				break;
			case WorkerState.RetrievingOreFromChest:
				UpdateRetrievingOreFromChest();
				break;
			case WorkerState.SearchingForOreSmelter:
				UpdateSearchingForOreSmelter();
				break;
			case WorkerState.MovingToOreSmelter:
				UpdateMovingToOreSmelter();
				break;
			case WorkerState.DepositingOreToSmelter:
				UpdateDepositingOreToSmelter();
				break;
			case WorkerState.WaitingForOreSmelter:
				UpdateWaitingForOreSmelter();
				break;
			case WorkerState.SearchingForFireplace:
				UpdateSearchingForFireplace();
				break;
			case WorkerState.MovingToFireplace:
				UpdateMovingToFireplace();
				break;
			case WorkerState.SearchingForFireplaceFuel:
				UpdateSearchingForFireplaceFuel();
				break;
			case WorkerState.MovingToFireplaceFuelChest:
				UpdateMovingToFireplaceFuelChest();
				break;
			case WorkerState.RetrievingFireplaceFuel:
				UpdateRetrievingFireplaceFuel();
				break;
			case WorkerState.MovingToFireplaceWithFuel:
				UpdateMovingToFireplaceWithFuel();
				break;
			case WorkerState.DepositingToFireplace:
				UpdateDepositingToFireplace();
				break;
			case WorkerState.WaitingForFireplace:
				UpdateWaitingForFireplace();
				break;
			case WorkerState.SearchingForKiln:
				UpdateSearchingForKiln();
				break;
			case WorkerState.MovingToKiln:
				UpdateMovingToKiln();
				break;
			case WorkerState.DepositingToKiln:
				UpdateDepositingToKiln();
				break;
			case WorkerState.WaitingForKiln:
				UpdateWaitingForKiln();
				break;
			case WorkerState.SearchingForKilnChest:
				UpdateSearchingForKilnChest();
				break;
			case WorkerState.MovingToKilnChest:
				UpdateMovingToKilnChest();
				break;
			case WorkerState.RetrievingKilnMaterial:
				UpdateRetrievingKilnMaterial();
				break;
			}
			if (CurrentState != WorkerState.Inactive && (Object)(object)m_monsterAI.GetFollowTarget() != (Object)null)
			{
				CurrentState = WorkerState.Inactive;
				m_targetResource = null;
			}
		}
	}

	private void UpdateIdle()
	{
	}

	private void OnDeath()
	{
		if (!((Object)(object)m_inventory == (Object)null) && !m_inventory.IsEmpty())
		{
			m_inventory.DropAllItems();
		}
	}

	private void UpdateGathering()
	{
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		if ((Object)(object)m_inventory != (Object)null && m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			m_targetChest = null;
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if ((Object)(object)m_targetResource == (Object)null && m_searchTimer >= 2f)
		{
			m_searchTimer = 0f;
			FindNearestResource();
		}
		if ((Object)(object)m_targetResource != (Object)null)
		{
			CurrentState = WorkerState.MovingToResource;
		}
	}

	private void UpdateSearchingForChest()
	{
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		if ((Object)(object)m_inventory == (Object)null || !m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			m_targetChest = null;
			CurrentState = WorkerState.Gathering;
			m_searchTimer = 2f;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestChest();
			if ((Object)(object)m_targetChest != (Object)null)
			{
				CurrentState = WorkerState.MovingToChest;
				return;
			}
			CurrentState = WorkerState.WaitingForChest;
			m_searchTimer = 0f;
		}
	}

	private void FindNearestChest()
	{
		//IL_00e6: 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)
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		if ((Object)(object)m_inventory == (Object)null || !m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			m_targetChest = null;
			return;
		}
		if (!m_inventory.TryCreateItemData(currentResourceDefinition.ItemName, 1, out var itemData))
		{
			m_targetChest = null;
			return;
		}
		Container targetChest = null;
		float num = float.MaxValue;
		Container[] array = Object.FindObjectsByType<Container>((FindObjectsSortMode)0);
		Container[] array2 = array;
		foreach (Container val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || !val.IsOwner() || val.IsInUse())
			{
				continue;
			}
			float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
			if (!(num2 > 30f))
			{
				Inventory inventory = val.GetInventory();
				if (inventory != null && inventory.ContainsItemByName(currentResourceDefinition.ItemName) && inventory.CanAddItem(itemData, 1) && num2 < num)
				{
					num = num2;
					targetChest = val;
				}
			}
		}
		m_targetChest = targetChest;
	}

	private void UpdateMovingToChest()
	{
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetChest == (Object)null)
		{
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
			return;
		}
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		if ((Object)(object)m_inventory == (Object)null || !m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			m_targetChest = null;
			CurrentState = WorkerState.Gathering;
			m_searchTimer = 2f;
		}
		else if (!((Component)m_targetChest).gameObject.activeInHierarchy)
		{
			m_targetChest = null;
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
		}
		else if (m_targetChest.IsInUse())
		{
			m_targetChest = null;
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetChest).transform.position, 2.5f))
		{
			DepositCurrentResource();
		}
	}

	private void DepositCurrentResource()
	{
		if ((Object)(object)m_targetChest == (Object)null || (Object)(object)m_inventory == (Object)null)
		{
			CurrentState = WorkerState.Gathering;
			m_targetChest = null;
			return;
		}
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		Inventory inventory = m_targetChest.GetInventory();
		if (inventory == null)
		{
			m_targetChest = null;
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
			return;
		}
		if (!inventory.ContainsItemByName(currentResourceDefinition.ItemName))
		{
			m_targetChest = null;
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
			return;
		}
		if (!m_inventory.TryCreateItemData(currentResourceDefinition.ItemName, 1, out var itemData))
		{
			CurrentState = WorkerState.Gathering;
			m_targetChest = null;
			return;
		}
		if (!inventory.CanAddItem(itemData, 1))
		{
			m_targetChest = null;
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
			return;
		}
		int num = m_inventory.TransferResourceToChest(m_targetChest, currentResourceDefinition.ItemName);
		m_targetChest = null;
		if (m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			CurrentState = WorkerState.SearchingForChest;
			m_searchTimer = 5f;
		}
		else
		{
			CurrentState = WorkerState.Gathering;
			m_searchTimer = 2f;
		}
	}

	private void UpdateWaitingForChest()
	{
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		if ((Object)(object)m_inventory == (Object)null || !m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			CurrentState = WorkerState.Gathering;
			m_searchTimer = 2f;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (m_searchTimer >= 5f)
		{
			m_searchTimer = 0f;
			FindNearestChest();
			if ((Object)(object)m_targetChest != (Object)null)
			{
				CurrentState = WorkerState.MovingToChest;
			}
		}
	}

	private void UpdateSearchingForSupplyChest()
	{
		if ((Object)(object)m_inventory == (Object)null || m_inventory.IsFull("$item_coal"))
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestSupplyChest("$item_coal");
			if ((Object)(object)m_targetSupplyChest != (Object)null)
			{
				CurrentState = WorkerState.MovingToSupplyChest;
			}
		}
	}

	private void UpdateMovingToSupplyChest()
	{
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetSupplyChest == (Object)null)
		{
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
		}
		else if ((Object)(object)m_inventory == (Object)null || m_inventory.IsFull("$item_coal"))
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.Inactive;
		}
		else if (!((Component)m_targetSupplyChest).gameObject.activeInHierarchy)
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
		}
		else if (m_targetSupplyChest.IsInUse())
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetSupplyChest).transform.position, 2.5f))
		{
			CurrentState = WorkerState.RetrievingFromChest;
		}
	}

	private void UpdateRetrievingFromChest()
	{
		if ((Object)(object)m_targetSupplyChest == (Object)null || (Object)(object)m_inventory == (Object)null)
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		if (!((Component)m_targetSupplyChest).gameObject.activeInHierarchy || m_targetSupplyChest.IsInUse())
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
			return;
		}
		Inventory inventory = m_targetSupplyChest.GetInventory();
		if (inventory == null)
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
			return;
		}
		ItemData item = inventory.GetItem("$item_coal", -1, false);
		if (item == null || item.m_stack <= 0)
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
			return;
		}
		int amount = m_inventory.GetAmount("$item_coal");
		int num = m_inventory.GetCapacity("$item_coal") - amount;
		if (num <= 0)
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		int num2 = Mathf.Min(num, item.m_stack);
		if (!m_inventory.AddItem("$item_coal", num2))
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
		}
		else if (!inventory.RemoveItem(item, num2))
		{
			m_inventory.RemoveItem("$item_coal", num2);
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
		}
		else
		{
			m_targetSupplyChest = null;
			CurrentState = WorkerState.SearchingForSmelter;
			m_searchTimer = 5f;
		}
	}

	private void FindNearestSupplyChest(string itemName)
	{
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		m_targetSupplyChest = null;
		Container targetSupplyChest = null;
		float num = float.MaxValue;
		Container[] array = Object.FindObjectsByType<Container>((FindObjectsSortMode)0);
		Container[] array2 = array;
		foreach (Container val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || !val.IsOwner() || val.IsInUse())
			{
				continue;
			}
			float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
			if (!(num2 > 30f))
			{
				Inventory inventory = val.GetInventory();
				if (inventory != null && inventory.ContainsItemByName(itemName) && num2 < num)
				{
					num = num2;
					targetSupplyChest = val;
				}
			}
		}
		m_targetSupplyChest = targetSupplyChest;
	}

	private List<string> GetSmelterOreItemNames()
	{
		HashSet<string> hashSet = new HashSet<string>();
		Smelter[] array = Object.FindObjectsByType<Smelter>((FindObjectsSortMode)0);
		Smelter[] array2 = array;
		foreach (Smelter val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || val.m_conversion == null)
			{
				continue;
			}
			foreach (ItemConversion item in val.m_conversion)
			{
				if (!((Object)(object)item.m_from == (Object)null) && item.m_from.m_itemData != null && item.m_from.m_itemData.m_shared != null)
				{
					string name = item.m_from.m_itemData.m_shared.m_name;
					if (!string.IsNullOrEmpty(name))
					{
						hashSet.Add(name);
					}
				}
			}
		}
		return new List<string>(hashSet);
	}

	private bool TryGetAnyOreInInventory(out string oreItemName)
	{
		oreItemName = null;
		if ((Object)(object)m_inventory == (Object)null)
		{
			return false;
		}
		List<string> smelterOreItemNames = GetSmelterOreItemNames();
		Dictionary<string, int> allItems = m_inventory.GetAllItems();
		foreach (string item in smelterOreItemNames)
		{
			if (allItems.TryGetValue(item, out var value) && value > 0)
			{
				oreItemName = item;
				return true;
			}
		}
		return false;
	}

	private void UpdateSearchingForSmelter()
	{
		if ((Object)(object)m_inventory == (Object)null || m_inventory.GetAmount("$item_coal") <= 0)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestSmelter();
			if ((Object)(object)m_targetSmelter != (Object)null)
			{
				CurrentState = WorkerState.MovingToSmelter;
			}
		}
	}

	private void FindNearestSmelter()
	{
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		m_targetSmelter = null;
		Smelter targetSmelter = null;
		float num = float.MaxValue;
		Smelter[] array = Object.FindObjectsByType<Smelter>((FindObjectsSortMode)0);
		Smelter[] array2 = array;
		foreach (Smelter val in array2)
		{
			if (!((Object)(object)val == (Object)null) && ((Component)val).gameObject.activeInHierarchy)
			{
				float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
				if (!(num2 > 30f) && !((Object)(object)val.m_addWoodSwitch == (Object)null) && num2 < num)
				{
					num = num2;
					targetSmelter = val;
				}
			}
		}
		m_targetSmelter = targetSmelter;
	}

	private void UpdateMovingToSmelter()
	{
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetSmelter == (Object)null)
		{
			CurrentState = WorkerState.SearchingForSmelter;
			m_searchTimer = 5f;
		}
		else if ((Object)(object)m_inventory == (Object)null || m_inventory.GetAmount("$item_coal") <= 0)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.Inactive;
		}
		else if (!((Component)m_targetSmelter).gameObject.activeInHierarchy)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.SearchingForSmelter;
			m_searchTimer = 5f;
		}
		else if ((Object)(object)m_targetSmelter.m_addWoodSwitch == (Object)null)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.SearchingForSmelter;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetSmelter).transform.position, 2.5f))
		{
			CurrentState = WorkerState.DepositingToSmelter;
		}
	}

	private void UpdateDepositingToSmelter()
	{
		if ((Object)(object)m_targetSmelter == (Object)null || (Object)(object)m_inventory == (Object)null)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		if (!((Component)m_targetSmelter).gameObject.activeInHierarchy || (Object)(object)m_targetSmelter.m_addWoodSwitch == (Object)null)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.SearchingForSmelter;
			m_searchTimer = 5f;
			return;
		}
		if (m_inventory.GetAmount("$item_coal") <= 0)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
			return;
		}
		Humanoid component = ((Component)this).GetComponent<Humanoid>();
		if ((Object)(object)component == (Object)null)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		Inventory inventory = component.GetInventory();
		if (inventory == null)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		while (m_inventory.GetAmount("$item_coal") > 0)
		{
			float smelterFuel = GetSmelterFuel(m_targetSmelter);
			if (smelterFuel > (float)m_targetSmelter.m_maxFuel - 1f)
			{
				m_smelterWaitTimer = 0f;
				CurrentState = WorkerState.WaitingForSmelter;
				return;
			}
			if (!m_inventory.TryCreateItemData("$item_coal", 1, out var itemData))
			{
				m_targetSmelter = null;
				CurrentState = WorkerState.Inactive;
				return;
			}
			if (!inventory.AddItem(itemData))
			{
				m_targetSmelter = null;
				CurrentState = WorkerState.Inactive;
				return;
			}
			ItemData item = inventory.GetItem("$item_coal", -1, false);
			if (item == null)
			{
				m_targetSmelter = null;
				CurrentState = WorkerState.Inactive;
				return;
			}
			if (!m_targetSmelter.m_addWoodSwitch.UseItem(component, item))
			{
				inventory.RemoveItem(item, 1);
				m_smelterWaitTimer = 0f;
				CurrentState = WorkerState.WaitingForSmelter;
				return;
			}
			m_inventory.RemoveItem("$item_coal", 1);
		}
		m_targetSmelter = null;
		CurrentState = WorkerState.SearchingForSupplyChest;
		m_searchTimer = 5f;
	}

	private void UpdateWaitingForSmelter()
	{
		if ((Object)(object)m_inventory == (Object)null)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		if (m_inventory.GetAmount("$item_coal") <= 0)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.SearchingForSupplyChest;
			m_searchTimer = 5f;
			return;
		}
		if ((Object)(object)m_targetSmelter == (Object)null || !((Component)m_targetSmelter).gameObject.activeInHierarchy)
		{
			m_targetSmelter = null;
			CurrentState = WorkerState.SearchingForSmelter;
			m_searchTimer = 5f;
			return;
		}
		m_smelterWaitTimer += Time.deltaTime;
		if (!(m_smelterWaitTimer < 15f))
		{
			m_smelterWaitTimer = 0f;
			CurrentState = WorkerState.DepositingToSmelter;
		}
	}

	private void UpdateWaitingForOreSmelter()
	{
		if ((Object)(object)m_targetOreSmelter == (Object)null)
		{
			SetState(WorkerState.SearchingForOreSmelter);
			return;
		}
		m_oreSmelterWaitTimer += Time.deltaTime;
		if (!(m_oreSmelterWaitTimer < 30f))
		{
			m_oreSmelterWaitTimer = 0f;
			CurrentState = WorkerState.DepositingOreToSmelter;
		}
	}

	private float GetSmelterFuel(Smelter smelter)
	{
		if ((Object)(object)smelter == (Object)null)
		{
			return 0f;
		}
		ZNetView val = ((Component)smelter).GetComponent<ZNetView>();
		if ((Object)(object)val == (Object)null)
		{
			val = ((Component)smelter).GetComponentInParent<ZNetView>();
		}
		if ((Object)(object)val == (Object)null || !val.IsValid())
		{
			return 0f;
		}
		return val.GetZDO().GetFloat(ZDOVars.s_fuel, 0f);
	}

	private int GetKilnQueueSize(Smelter kiln)
	{
		if ((Object)(object)kiln == (Object)null)
		{
			return 0;
		}
		ZNetView val = ((Component)kiln).GetComponent<ZNetView>();
		if ((Object)(object)val == (Object)null)
		{
			val = ((Component)kiln).GetComponentInParent<ZNetView>();
		}
		if ((Object)(object)val == (Object)null || !val.IsValid())
		{
			return 0;
		}
		return val.GetZDO().GetInt(ZDOVars.s_queued, 0);
	}

	private void UpdateSearchingForOreChest()
	{
		if ((Object)(object)m_inventory == (Object)null)
		{
			CurrentState = WorkerState.Inactive;
			return;
		}
		if (TryGetAnyOreInInventory(out var oreItemName))
		{
			m_targetOreItemName = oreItemName;
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestOreChest();
			if ((Object)(object)m_targetOreChest != (Object)null)
			{
				CurrentState = WorkerState.MovingToOreChest;
			}
		}
	}

	private void FindNearestOreChest()
	{
		//IL_00a9: 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)
		m_targetOreChest = null;
		m_targetOreItemName = null;
		List<string> smelterOreItemNames = GetSmelterOreItemNames();
		if (smelterOreItemNames.Count == 0)
		{
			return;
		}
		Container targetOreChest = null;
		string targetOreItemName = null;
		float num = float.MaxValue;
		Container[] array = Object.FindObjectsByType<Container>((FindObjectsSortMode)0);
		Container[] array2 = array;
		foreach (Container val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || !val.IsOwner() || val.IsInUse())
			{
				continue;
			}
			float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
			if (num2 > 30f)
			{
				continue;
			}
			Inventory inventory = val.GetInventory();
			if (inventory == null)
			{
				continue;
			}
			foreach (string item2 in smelterOreItemNames)
			{
				ItemData item = inventory.GetItem(item2, -1, false);
				if (item == null || item.m_stack <= 0)
				{
					continue;
				}
				if (num2 < num)
				{
					num = num2;
					targetOreChest = val;
					targetOreItemName = item2;
				}
				break;
			}
		}
		m_targetOreChest = targetOreChest;
		m_targetOreItemName = targetOreItemName;
	}

	private void UpdateMovingToOreChest()
	{
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetOreChest == (Object)null || string.IsNullOrEmpty(m_targetOreItemName))
		{
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
		}
		else if ((Object)(object)m_inventory == (Object)null)
		{
			CurrentState = WorkerState.Inactive;
		}
		else if (m_inventory.IsFull(m_targetOreItemName))
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
		}
		else if (!((Component)m_targetOreChest).gameObject.activeInHierarchy || m_targetOreChest.IsInUse())
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetOreChest).transform.position, 2.5f))
		{
			CurrentState = WorkerState.RetrievingOreFromChest;
		}
	}

	private void UpdateRetrievingOreFromChest()
	{
		if ((Object)(object)m_targetOreChest == (Object)null || (Object)(object)m_inventory == (Object)null || string.IsNullOrEmpty(m_targetOreItemName))
		{
			m_targetOreChest = null;
			m_targetOreItemName = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
			return;
		}
		if (!((Component)m_targetOreChest).gameObject.activeInHierarchy || m_targetOreChest.IsInUse())
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
			return;
		}
		Inventory inventory = m_targetOreChest.GetInventory();
		if (inventory == null)
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
			return;
		}
		ItemData item = inventory.GetItem(m_targetOreItemName, -1, false);
		if (item == null || item.m_stack <= 0)
		{
			m_targetOreChest = null;
			m_targetOreItemName = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
			return;
		}
		int amount = m_inventory.GetAmount(m_targetOreItemName);
		int num = m_inventory.GetCapacity(m_targetOreItemName) - amount;
		if (num <= 0)
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
			return;
		}
		int num2 = Mathf.Min(num, item.m_stack);
		if (!m_inventory.AddItem(m_targetOreItemName, num2))
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
		}
		else if (!inventory.RemoveItem(item, num2))
		{
			m_inventory.RemoveItem(m_targetOreItemName, num2);
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
		}
		else
		{
			m_targetOreChest = null;
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
		}
	}

	private void UpdateSearchingForOreSmelter()
	{
		if ((Object)(object)m_inventory == (Object)null)
		{
			CurrentState = WorkerState.Inactive;
			return;
		}
		if (!TryGetAnyOreInInventory(out var oreItemName))
		{
			m_targetOreSmelter = null;
			m_targetOreItemName = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
			return;
		}
		m_targetOreItemName = oreItemName;
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestOreSmelter(m_targetOreItemName);
			if ((Object)(object)m_targetOreSmelter != (Object)null)
			{
				CurrentState = WorkerState.MovingToOreSmelter;
			}
		}
	}

	private void FindNearestOreSmelter(string oreItemName)
	{
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_014f: Unknown result type (might be due to invalid IL or missing references)
		m_targetOreSmelter = null;
		if (string.IsNullOrEmpty(oreItemName))
		{
			return;
		}
		Smelter targetOreSmelter = null;
		float num = float.MaxValue;
		Smelter[] array = Object.FindObjectsByType<Smelter>((FindObjectsSortMode)0);
		Smelter[] array2 = array;
		foreach (Smelter val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || (Object)(object)val.m_addOreSwitch == (Object)null)
			{
				continue;
			}
			bool flag = false;
			if (val.m_conversion != null)
			{
				foreach (ItemConversion item in val.m_conversion)
				{
					if ((Object)(object)item.m_from == (Object)null || item.m_from.m_itemData == null || item.m_from.m_itemData.m_shared == null || !(item.m_from.m_itemData.m_shared.m_name == oreItemName))
					{
						continue;
					}
					flag = true;
					break;
				}
			}
			if (flag)
			{
				float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
				if (!(num2 > 30f) && num2 < num)
				{
					num = num2;
					targetOreSmelter = val;
				}
			}
		}
		m_targetOreSmelter = targetOreSmelter;
	}

	private void UpdateMovingToOreSmelter()
	{
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetOreSmelter == (Object)null)
		{
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
			return;
		}
		if ((Object)(object)m_inventory == (Object)null || !TryGetAnyOreInInventory(out var oreItemName))
		{
			m_targetOreSmelter = null;
			CurrentState = WorkerState.SearchingForOreChest;
			m_searchTimer = 5f;
			return;
		}
		m_targetOreItemName = oreItemName;
		if (!((Component)m_targetOreSmelter).gameObject.activeInHierarchy || (Object)(object)m_targetOreSmelter.m_addOreSwitch == (Object)null)
		{
			m_targetOreSmelter = null;
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetOreSmelter).transform.position, 2.5f))
		{
			CurrentState = WorkerState.DepositingOreToSmelter;
		}
	}

	private void UpdateDepositingOreToSmelter()
	{
		if ((Object)(object)m_targetOreSmelter == (Object)null || (Object)(object)m_inventory == (Object)null)
		{
			m_targetOreSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		if (!((Component)m_targetOreSmelter).gameObject.activeInHierarchy || (Object)(object)m_targetOreSmelter.m_addOreSwitch == (Object)null)
		{
			m_targetOreSmelter = null;
			CurrentState = WorkerState.SearchingForOreSmelter;
			m_searchTimer = 5f;
			return;
		}
		Humanoid component = ((Component)this).GetComponent<Humanoid>();
		if ((Object)(object)component == (Object)null)
		{
			m_targetOreSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		Inventory inventory = component.GetInventory();
		if (inventory == null)
		{
			m_targetOreSmelter = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		string oreItemName;
		while (TryGetAnyOreInInventory(out oreItemName))
		{
			m_targetOreItemName = oreItemName;
			if (!m_inventory.TryCreateItemData(oreItemName, 1, out var itemData))
			{
				m_targetOreItemName = null;
				CurrentState = WorkerState.SearchingForOreChest;
				m_searchTimer = 5f;
				return;
			}
			if (!inventory.AddItem(itemData))
			{
				CurrentState = WorkerState.Inactive;
				return;
			}
			ItemData item = inventory.GetItem(oreItemName, -1, false);
			if (item == null)
			{
				CurrentState = WorkerState.Inactive;
				return;
			}
			if (!m_targetOreSmelter.m_addOreSwitch.UseItem(component, item))
			{
				inventory.RemoveItem(item, 1);
				m_oreSmelterWaitTimer = 0f;
				CurrentState = WorkerState.WaitingForOreSmelter;
				return;
			}
			m_inventory.RemoveItem(oreItemName, 1);
		}
		m_targetOreSmelter = null;
		m_targetOreItemName = null;
		CurrentState = WorkerState.SearchingForOreChest;
		m_searchTimer = 5f;
	}

	private void UpdateMovingToResource()
	{
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetResource == (Object)null)
		{
			CurrentState = WorkerState.Gathering;
			return;
		}
		ZNetView component = ((Component)m_targetResource).GetComponent<ZNetView>();
		if ((Object)(object)component == (Object)null || !component.IsValid())
		{
			m_targetResource = null;
			CurrentState = WorkerState.Gathering;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetResource).transform.position, 2.5f))
		{
			CollectResource();
		}
	}

	private void FindNearestResource()
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		string itemName = GetCurrentResourceDefinition().ItemName;
		Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, 20f, LayerMask.GetMask(new string[1] { "item" }));
		ItemDrop targetResource = null;
		float num = float.MaxValue;
		Collider[] array2 = array;
		foreach (Collider val in array2)
		{
			if ((Object)(object)val.attachedRigidbody == (Object)null)
			{
				continue;
			}
			ItemDrop component = ((Component)val.attachedRigidbody).GetComponent<ItemDrop>();
			if ((Object)(object)component == (Object)null)
			{
				continue;
			}
			ZNetView component2 = ((Component)component).GetComponent<ZNetView>();
			if (!((Object)(object)component2 == (Object)null) && component2.IsValid() && !(component.m_itemData.m_shared.m_name != itemName))
			{
				float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)component).transform.position);
				if (num2 < num)
				{
					num = num2;
					targetResource = component;
				}
			}
		}
		m_targetResource = targetResource;
	}

	private void CollectResource()
	{
		if ((Object)(object)m_targetResource == (Object)null)
		{
			CurrentState = WorkerState.Gathering;
			return;
		}
		if ((Object)(object)m_inventory == (Object)null)
		{
			CurrentState = WorkerState.Gathering;
			return;
		}
		GatherResourceDefinition currentResourceDefinition = GetCurrentResourceDefinition();
		if (m_inventory.IsFull(currentResourceDefinition.ItemName))
		{
			m_targetResource = null;
			CurrentState = WorkerState.Gathering;
			return;
		}
		if (m_inventory.AddItem(currentResourceDefinition.ItemName))
		{
			m_targetResource.RemoveOne();
		}
		m_targetResource = null;
		CurrentState = WorkerState.Gathering;
	}

	public bool SetState(WorkerState newState)
	{
		if ((Object)(object)m_tameable == (Object)null || !m_tameable.IsTamed())
		{
			return false;
		}
		if (newState != WorkerState.Inactive && (Object)(object)m_monsterAI.GetFollowTarget() != (Object)null)
		{
			return false;
		}
		CurrentState = newState;
		if (newState == WorkerState.Gathering)
		{
			m_searchTimer = 2f;
		}
		if (newState == WorkerState.Inactive)
		{
			if ((Object)(object)m_monsterAI != (Object)null)
			{
				((BaseAI)m_monsterAI).StopMoving();
			}
			m_targetResource = null;
			m_targetChest = null;
			m_targetSupplyChest = null;
			m_targetSmelter = null;
			m_targetOreChest = null;
			m_targetOreSmelter = null;
			m_targetOreItemName = null;
			m_targetFireplace = null;
			m_targetFireplaceFuelChest = null;
			m_targetFireplaceFuelItemName = null;
			m_oreSmelterWaitTimer = 0f;
			m_smelterWaitTimer = 0f;
			m_fireplaceWaitTimer = 0f;
			m_kilnWaitTimer = 0f;
			m_targetKiln = null;
			m_targetKilnChest = null;
			m_targetKilnItemName = null;
		}
		return true;
	}

	public void PreviousGatherResource()
	{
		ChangeGatherResource(-1);
	}

	public void NextGatherResource()
	{
		ChangeGatherResource(1);
	}

	public void CycleGatherResource()
	{
		NextGatherResource();
	}

	private void ChangeGatherResource(int direction)
	{
		int currentGatherResource = (int)(CurrentGatherResource + direction + 10) % 10;
		CurrentGatherResource = (GatherResourceType)currentGatherResource;
		bool flag = CurrentState != WorkerState.Inactive;
		m_targetResource = null;
		m_targetChest = null;
		m_targetSupplyChest = null;
		m_targetSmelter = null;
		m_targetKiln = null;
		m_targetKilnChest = null;
		m_targetKilnItemName = null;
		m_targetFireplace = null;
		m_targetFireplaceFuelChest = null;
		m_targetFireplaceFuelItemName = null;
		m_smelterWaitTimer = 0f;
		m_fireplaceWaitTimer = 0f;
		m_kilnWaitTimer = 0f;
		if (flag)
		{
			CurrentState = WorkerState.Gathering;
			m_searchTimer = 2f;
		}
		else
		{
			CurrentState = WorkerState.Inactive;
		}
	}

	private void UpdateSearchingForFireplace()
	{
		if ((Object)(object)m_inventory == (Object)null)
		{
			CurrentState = WorkerState.Inactive;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestFireplace();
			if ((Object)(object)m_targetFireplace != (Object)null)
			{
				CurrentState = WorkerState.MovingToFireplace;
				return;
			}
			m_fireplaceWaitTimer = 0f;
			CurrentState = WorkerState.WaitingForFireplace;
		}
	}

	private void FindNearestFireplace()
	{
		//IL_014c: 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)
		m_targetFireplace = null;
		m_targetFireplaceFuelItemName = null;
		Fireplace targetFireplace = null;
		float num = float.MaxValue;
		Fireplace[] array = Object.FindObjectsByType<Fireplace>((FindObjectsSortMode)0);
		Fireplace[] array2 = array;
		foreach (Fireplace val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || !val.m_canRefill || val.m_infiniteFuel || (Object)(object)val.m_fuelItem == (Object)null || val.m_fuelItem.m_itemData == null || val.m_fuelItem.m_itemData.m_shared == null)
			{
				continue;
			}
			string name = val.m_fuelItem.m_itemData.m_shared.m_name;
			if (string.IsNullOrEmpty(name))
			{
				continue;
			}
			ZNetView component = ((Component)val).GetComponent<ZNetView>();
			if ((Object)(object)component == (Object)null || !component.IsValid())
			{
				continue;
			}
			float num2 = component.GetZDO().GetFloat(ZDOVars.s_fuel, 0f);
			if ((float)Mathf.CeilToInt(num2) >= val.m_maxFuel)
			{
				continue;
			}
			float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
			if (num3 > 30f)
			{
				continue;
			}
			if ((Object)(object)m_inventory != (Object)null && m_inventory.GetAmount(name) > 0)
			{
				if (num3 < num)
				{
					num = num3;
					targetFireplace = val;
					m_targetFireplaceFuelItemName = name;
				}
			}
			else if (num3 < num)
			{
				num = num3;
				targetFireplace = val;
				m_targetFireplaceFuelItemName = name;
			}
		}
		m_targetFireplace = targetFireplace;
	}

	private void UpdateMovingToFireplace()
	{
		//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetFireplace == (Object)null)
		{
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		if (!((Component)m_targetFireplace).gameObject.activeInHierarchy)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		if ((Object)(object)m_targetFireplace.m_fuelItem == (Object)null || m_targetFireplace.m_fuelItem.m_itemData == null || m_targetFireplace.m_fuelItem.m_itemData.m_shared == null)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		m_targetFireplaceFuelItemName = m_targetFireplace.m_fuelItem.m_itemData.m_shared.m_name;
		ZNetView component = ((Component)m_targetFireplace).GetComponent<ZNetView>();
		if ((Object)(object)component == (Object)null || !component.IsValid())
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		float num = component.GetZDO().GetFloat(ZDOVars.s_fuel, 0f);
		if ((float)Mathf.CeilToInt(num) >= m_targetFireplace.m_maxFuel)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
		}
		else if ((Object)(object)m_inventory != (Object)null && m_inventory.GetAmount(m_targetFireplaceFuelItemName) > 0)
		{
			if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetFireplace).transform.position, 2.5f))
			{
				CurrentState = WorkerState.DepositingToFireplace;
			}
		}
		else
		{
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
		}
	}

	private void UpdateSearchingForFireplaceFuel()
	{
		if ((Object)(object)m_inventory == (Object)null || string.IsNullOrEmpty(m_targetFireplaceFuelItemName))
		{
			CurrentState = WorkerState.SearchingForFireplace;
			return;
		}
		if (m_inventory.GetAmount(m_targetFireplaceFuelItemName) > 0)
		{
			CurrentState = WorkerState.MovingToFireplaceWithFuel;
			return;
		}
		m_searchTimer += Time.deltaTime;
		if (!(m_searchTimer < 5f))
		{
			m_searchTimer = 0f;
			FindNearestFireplaceFuelChest(m_targetFireplaceFuelItemName);
			if ((Object)(object)m_targetFireplaceFuelChest != (Object)null)
			{
				CurrentState = WorkerState.MovingToFireplaceFuelChest;
			}
		}
	}

	private void FindNearestFireplaceFuelChest(string itemName)
	{
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		m_targetFireplaceFuelChest = null;
		if (string.IsNullOrEmpty(itemName))
		{
			return;
		}
		Container targetFireplaceFuelChest = null;
		float num = float.MaxValue;
		Container[] array = Object.FindObjectsByType<Container>((FindObjectsSortMode)0);
		Container[] array2 = array;
		foreach (Container val in array2)
		{
			if ((Object)(object)val == (Object)null || !((Component)val).gameObject.activeInHierarchy || !val.IsOwner() || val.IsInUse())
			{
				continue;
			}
			float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
			if (!(num2 > 30f))
			{
				Inventory inventory = val.GetInventory();
				if (inventory != null && inventory.ContainsItemByName(itemName) && num2 < num)
				{
					num = num2;
					targetFireplaceFuelChest = val;
				}
			}
		}
		m_targetFireplaceFuelChest = targetFireplaceFuelChest;
	}

	private void UpdateMovingToFireplaceFuelChest()
	{
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetFireplaceFuelChest == (Object)null)
		{
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
		}
		else if ((Object)(object)m_inventory == (Object)null || string.IsNullOrEmpty(m_targetFireplaceFuelItemName))
		{
			CurrentState = WorkerState.Inactive;
		}
		else if (m_inventory.GetAmount(m_targetFireplaceFuelItemName) > 0)
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.MovingToFireplaceWithFuel;
		}
		else if (!((Component)m_targetFireplaceFuelChest).gameObject.activeInHierarchy || m_targetFireplaceFuelChest.IsInUse())
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetFireplaceFuelChest).transform.position, 2.5f))
		{
			CurrentState = WorkerState.RetrievingFireplaceFuel;
		}
	}

	private void UpdateRetrievingFireplaceFuel()
	{
		if ((Object)(object)m_targetFireplaceFuelChest == (Object)null || (Object)(object)m_inventory == (Object)null || string.IsNullOrEmpty(m_targetFireplaceFuelItemName))
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.SearchingForFireplace;
			return;
		}
		Inventory inventory = m_targetFireplaceFuelChest.GetInventory();
		if (inventory == null)
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
			return;
		}
		ItemData item = inventory.GetItem(m_targetFireplaceFuelItemName, -1, false);
		if (item == null || item.m_stack <= 0)
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
			return;
		}
		int amount = m_inventory.GetAmount(m_targetFireplaceFuelItemName);
		int num = m_inventory.GetCapacity(m_targetFireplaceFuelItemName) - amount;
		if (num <= 0)
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.MovingToFireplaceWithFuel;
			return;
		}
		int num2 = Mathf.Min(num, item.m_stack);
		if (!m_inventory.AddItem(m_targetFireplaceFuelItemName, num2))
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
		}
		else if (!inventory.RemoveItem(item, num2))
		{
			m_inventory.RemoveItem(m_targetFireplaceFuelItemName, num2);
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
		}
		else
		{
			m_targetFireplaceFuelChest = null;
			CurrentState = WorkerState.MovingToFireplaceWithFuel;
		}
	}

	private void UpdateMovingToFireplaceWithFuel()
	{
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_targetFireplace == (Object)null || (Object)(object)m_inventory == (Object)null || string.IsNullOrEmpty(m_targetFireplaceFuelItemName))
		{
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
		}
		else if (m_inventory.GetAmount(m_targetFireplaceFuelItemName) <= 0)
		{
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
		}
		else if (!((Component)m_targetFireplace).gameObject.activeInHierarchy)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
		}
		else if (WorkerMovement.MoveTo(m_monsterAI, Time.deltaTime, ((Component)m_targetFireplace).transform.position, 2.5f))
		{
			CurrentState = WorkerState.DepositingToFireplace;
		}
	}

	private void UpdateDepositingToFireplace()
	{
		if ((Object)(object)m_targetFireplace == (Object)null || (Object)(object)m_inventory == (Object)null || string.IsNullOrEmpty(m_targetFireplaceFuelItemName))
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			return;
		}
		if (!((Component)m_targetFireplace).gameObject.activeInHierarchy)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		ZNetView component = ((Component)m_targetFireplace).GetComponent<ZNetView>();
		if ((Object)(object)component == (Object)null || !component.IsValid())
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		float num = component.GetZDO().GetFloat(ZDOVars.s_fuel, 0f);
		if ((float)Mathf.CeilToInt(num) >= m_targetFireplace.m_maxFuel)
		{
			m_targetFireplace = null;
			m_targetFireplaceFuelItemName = null;
			CurrentState = WorkerState.SearchingForFireplace;
			m_searchTimer = 5f;
			return;
		}
		if (m_inventory.GetAmount(m_targetFireplaceFuelItemName) <= 0)
		{
			CurrentState = WorkerState.SearchingForFireplaceFuel;
			m_searchTimer = 5f;
			return;
		}
		Humanoid component2 = ((Component)this).GetComponent<Humanoid>();
		if ((Object)(object)component2 == (Object)null)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		Inventory inventory = component2.GetInventory();
		if (inventory == null)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		if ((Object)(object)m_targetFireplace.m_fuelItem == (Object)null || m_targetFireplace.m_fuelItem.m_itemData == null)
		{
			m_targetFireplace = null;
			CurrentState = WorkerState.Inactive;
			return;
		}
		I