Decompiled source of balrond shipyard v1.4.9

plugins/BalrondShipyard.dll

Decompiled 3 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BalrondBiomes;
using BepInEx;
using HarmonyLib;
using UnityEngine;
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("SailorBag")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SailorBag")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d18d2a38-6578-40b5-a296-30f8a379d6ab")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace BalrondBiomes
{
	public class SE_WetImmunity : StatusEffect
	{
		public void Awake()
		{
			base.m_name = "Waterproof";
			((Object)this).name = "Waterproof";
			base.m_tooltip = "Immune to wet effect";
		}

		public override void UpdateStatusEffect(float dt)
		{
			((StatusEffect)this).UpdateStatusEffect(dt);
			if (base.m_character.GetSEMan().HaveStatusEffect("Wet".GetHashCode()))
			{
				base.m_character.GetSEMan().RemoveStatusEffect("Wet".GetHashCode(), false);
			}
		}
	}
}
namespace BalrondShipyard
{
	internal class AnchorSwitch : MonoBehaviour, Hoverable, Interactable
	{
		public string m_name = "";

		public EffectList m_activateEffect = new EffectList();

		public string turnOffMessage = "";

		public string turnOnMessage = "";

		public EffectList m_deactivateEffect = new EffectList();

		public ZNetView m_nview;

		public Ship m_ship;

		public GameObject m_disabled;

		public GameObject m_enabled;

		public GameObject m_resetPoint;

		public GameObject m_anchor;

		public Rigidbody rigidbody;

		public bool m_currrentStatus;

		private void Awake()
		{
			if (m_nview.IsValid())
			{
				if (m_name == "")
				{
					m_name = " Active Me";
				}
				m_nview.Register("RPC_ToggleAnchor", (Action<long>)RPC_ToggleAnchor);
				rigidbody = ((Component)m_ship).GetComponent<Rigidbody>();
				m_currrentStatus = IsEnabled();
				SetEnabled(m_currrentStatus);
			}
		}

		private void UpdateStatus()
		{
			if (m_currrentStatus != IsEnabled())
			{
				ToggleAnchor(0L);
				m_currrentStatus = IsEnabled();
			}
		}

		public string GetHoverText()
		{
			if (IsEnabled())
			{
				return Localization.instance.Localize("\n[<color=yellow><b>$KEY_Use</b></color>] Pull Anchor");
			}
			return Localization.instance.Localize("\n[<color=yellow><b>$KEY_Use</b></color>] Drop Anchor");
		}

		public string GetHoverName()
		{
			return m_name;
		}

		public void ToggleAnchor(long uid)
		{
			m_nview.InvokeRPC(ZNetView.Everybody, "RPC_ToggleAnchor", new object[1] { uid });
		}

		private void RPC_ToggleAnchor(long uid)
		{
			if (m_nview.IsOwner())
			{
				SetEnabled(!IsEnabled());
			}
		}

		public bool IsEnabled()
		{
			return m_nview.IsValid() && m_nview.GetZDO().GetBool("enabledAnchor", false);
		}

		private void SetEnabled(bool enabled)
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			m_nview.GetZDO().Set("enabledAnchor", enabled);
			if (enabled)
			{
				m_activateEffect.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1);
			}
			else
			{
				m_deactivateEffect.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1);
			}
			if ((Object)(object)m_disabled != (Object)null && (Object)(object)m_enabled != (Object)null)
			{
				m_disabled.SetActive(!enabled);
				m_enabled.SetActive(enabled);
				if (enabled)
				{
					m_nview.InvokeRPC("Stop", Array.Empty<object>());
					rigidbody.constraints = (RigidbodyConstraints)122;
				}
				else
				{
					rigidbody.constraints = (RigidbodyConstraints)0;
				}
			}
			else
			{
				Debug.LogWarning((object)"[SHIPYARD] No object to Toggle");
			}
		}

		public bool Interact(Humanoid character, bool repeat, bool alt)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (repeat)
			{
				return false;
			}
			if (!PrivateArea.CheckAccess(((Component)this).transform.position, 0f, true, false))
			{
				return true;
			}
			ToggleAnchor(((Component)character).GetComponent<Player>().GetPlayerID());
			if (turnOffMessage != "" && turnOnMessage != "")
			{
				((Character)character).Message((MessageType)2, IsEnabled() ? turnOnMessage : turnOffMessage, 0, (Sprite)null);
			}
			else
			{
				((Character)character).Message((MessageType)2, m_name + " was " + (IsEnabled() ? "dropped" : "picked up"), 0, (Sprite)null);
			}
			return true;
		}

		public bool UseItem(Humanoid user, ItemData item)
		{
			return false;
		}
	}
	[Serializable]
	public class FishnetTrap : MonoBehaviour
	{
		[Serializable]
		public class ItemConversion
		{
			public Biome m_biome;

			public ItemDrop m_from;

			public ItemDrop m_to;

			public int m_seconds;

			public List<ItemDrop> m_options;
		}

		public string m_name = "FishnetTrap";

		public string m_addOreTooltip = "Add Fishbait";

		public string m_emptyOreTooltip = "Empty the basket";

		public Switch m_addOreSwitch;

		public Switch m_emptyOreSwitch;

		public Transform m_outputPoint;

		public GameObject m_enabledObject;

		public GameObject m_disabledObject;

		public GameObject m_haveFuelObject;

		public GameObject m_haveOreObject;

		public GameObject m_noOreObject;

		public Animator[] m_animators;

		public int m_maxOre = 20;

		public float m_secPerProduct = 120f;

		public float m_addOreAnimationDuration;

		public List<ItemConversion> m_conversion;

		public EffectList m_oreAddedEffects = new EffectList();

		public EffectList m_fuelAddedEffects = new EffectList();

		public EffectList m_produceEffects = new EffectList();

		private ZNetView m_nview;

		private float m_addedOreTime = -1000f;

		private StringBuilder m_sb = new StringBuilder();

		public Container m_container;

		public GameObject m_full;

		public int m_maxFish = 50;

		private void Awake()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Expected O, but got Unknown
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Expected O, but got Unknown
			m_nview = ((Component)this).GetComponent<ZNetView>();
			if ((Object)(object)m_nview == (Object)null || m_nview.GetZDO() == null)
			{
				return;
			}
			if (Object.op_Implicit((Object)(object)m_addOreSwitch))
			{
				Switch addOreSwitch = m_addOreSwitch;
				addOreSwitch.m_onUse = (Callback)Delegate.Combine((Delegate?)(object)addOreSwitch.m_onUse, (Delegate?)new Callback(OnAddOre));
				m_addOreSwitch.m_onHover = new TooltipCallback(OnHoverAddOre);
			}
			if (Object.op_Implicit((Object)(object)m_emptyOreSwitch))
			{
				Switch emptyOreSwitch = m_emptyOreSwitch;
				emptyOreSwitch.m_onUse = (Callback)Delegate.Combine((Delegate?)(object)emptyOreSwitch.m_onUse, (Delegate?)new Callback(OnEmpty));
				Switch emptyOreSwitch2 = m_emptyOreSwitch;
				emptyOreSwitch2.m_onHover = (TooltipCallback)Delegate.Combine((Delegate?)(object)emptyOreSwitch2.m_onHover, (Delegate?)new TooltipCallback(OnHoverEmptyOre));
			}
			m_nview.Register<string>("AddOre", (Action<long, string>)RPC_AddOre);
			m_nview.Register("EmptyProcessed", (Action<long>)RPC_EmptyProcessed);
			if ((Object)(object)m_container == (Object)null)
			{
				Debug.LogWarning((object)"There is no container");
				return;
			}
			WearNTear component = ((Component)this).GetComponent<WearNTear>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.m_onDestroyed = (Action)Delegate.Combine(component.m_onDestroyed, new Action(OnDestroyed));
			}
			((MonoBehaviour)this).InvokeRepeating("UpdateFishnetTrap", 1f, 1f);
		}

		private void DropAllItems()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			while (GetQueueSize() > 0)
			{
				string queuedOre = GetQueuedOre();
				RemoveOneOre();
				ItemConversion itemConversion = GetItemConversion(queuedOre);
				if (itemConversion != null)
				{
					Vector3 val = ((Component)this).transform.position + Vector3.up + Random.insideUnitSphere * 0.3f;
					Quaternion val2 = Quaternion.Euler(0f, (float)Random.Range(0, 360), 0f);
					ItemDrop.OnCreateNew(Object.Instantiate<GameObject>(((Component)itemConversion.m_from).gameObject, val, val2));
				}
			}
		}

		private void OnDestroyed()
		{
			if (m_nview.IsOwner())
			{
				DropAllItems();
			}
		}

		private bool IsItemAllowed(ItemData item)
		{
			return IsItemAllowed(((Object)item.m_dropPrefab).name);
		}

		private bool IsItemAllowed(string itemName)
		{
			foreach (ItemConversion item in m_conversion)
			{
				if (((Object)((Component)item.m_from).gameObject).name == itemName)
				{
					return true;
				}
			}
			return false;
		}

		private ItemData FindCookableItem(Inventory inventory)
		{
			foreach (ItemConversion item2 in m_conversion)
			{
				ItemData item = inventory.GetItem(item2.m_from.m_itemData.m_shared.m_name, -1, false);
				if (item != null)
				{
					return item;
				}
			}
			return null;
		}

		private bool OnAddOre(Switch sw, Humanoid user, ItemData item)
		{
			if (item == null)
			{
				item = FindCookableItem(user.GetInventory());
				if (item == null)
				{
					((Character)user).Message((MessageType)2, "$msg_noprocessableitems", 0, (Sprite)null);
					return false;
				}
			}
			if (!IsItemAllowed(((Object)item.m_dropPrefab).name))
			{
				((Character)user).Message((MessageType)2, "$msg_wontwork", 0, (Sprite)null);
				return false;
			}
			ZLog.Log((object)("trying to add " + item.m_shared.m_name));
			if (GetQueueSize() >= m_maxOre)
			{
				((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null);
				return false;
			}
			((Character)user).Message((MessageType)2, "$msg_added " + item.m_shared.m_name, 0, (Sprite)null);
			user.GetInventory().RemoveItem(item, 1);
			m_nview.InvokeRPC("AddOre", new object[1] { ((Object)item.m_dropPrefab).name });
			m_addedOreTime = Time.time;
			if ((double)m_addOreAnimationDuration > 0.0)
			{
				SetAnimation(active: true);
			}
			return true;
		}

		private float GetBakeTimer()
		{
			return (!m_nview.IsValid()) ? 0f : m_nview.GetZDO().GetFloat(ZDOVars.s_bakeTimer, 0f);
		}

		private void SetBakeTimer(float t)
		{
			if (m_nview.IsValid())
			{
				m_nview.GetZDO().Set(ZDOVars.s_bakeTimer, t);
			}
		}

		private float GetFuel()
		{
			return (!m_nview.IsValid()) ? 0f : m_nview.GetZDO().GetFloat(ZDOVars.s_fuel, 0f);
		}

		private void SetFuel(float fuel)
		{
			if (m_nview.IsValid())
			{
				m_nview.GetZDO().Set(ZDOVars.s_fuel, fuel);
			}
		}

		private int GetQueueSize()
		{
			return m_nview.IsValid() ? m_nview.GetZDO().GetInt(ZDOVars.s_queued, 0) : 0;
		}

		private void RPC_AddOre(long sender, string name)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			if (m_nview.IsOwner())
			{
				if (!IsItemAllowed(name))
				{
					ZLog.Log((object)("Item not allowed " + name));
					return;
				}
				QueueOre(name);
				m_oreAddedEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1);
				ZLog.Log((object)("Added ore " + name));
			}
		}

		private void QueueOre(string name)
		{
			int queueSize = GetQueueSize();
			m_nview.GetZDO().Set("item" + queueSize, name);
			m_nview.GetZDO().Set(ZDOVars.s_queued, queueSize + 1, false);
		}

		private string GetQueuedOre()
		{
			return (GetQueueSize() == 0) ? "" : m_nview.GetZDO().GetString(ZDOVars.s_item0, "");
		}

		private void RemoveOneOre()
		{
			int queueSize = GetQueueSize();
			if (queueSize != 0)
			{
				for (int i = 0; i < queueSize; i++)
				{
					string @string = m_nview.GetZDO().GetString("item" + (i + 1), "");
					m_nview.GetZDO().Set("item" + i, @string);
				}
				m_nview.GetZDO().Set(ZDOVars.s_queued, queueSize - 1, false);
			}
		}

		private bool OnEmpty(Switch sw, Humanoid user, ItemData item)
		{
			if (GetProcessedQueueSize() <= 0)
			{
				return false;
			}
			m_nview.InvokeRPC("EmptyProcessed", Array.Empty<object>());
			return true;
		}

		private void RPC_EmptyProcessed(long sender)
		{
			if (m_nview.IsOwner())
			{
			}
		}

		private double GetDeltaTime()
		{
			DateTime time = ZNet.instance.GetTime();
			DateTime dateTime = new DateTime(m_nview.GetZDO().GetLong("StartTime", time.Ticks));
			double totalSeconds = (time - dateTime).TotalSeconds;
			m_nview.GetZDO().Set(ZDOVars.s_startTime, time.Ticks);
			return totalSeconds;
		}

		private float GetAccumulator()
		{
			return (!m_nview.IsValid()) ? 0f : m_nview.GetZDO().GetFloat(ZDOVars.s_accTime, 0f);
		}

		private void SetAccumulator(float t)
		{
			if (m_nview.IsValid())
			{
				m_nview.GetZDO().Set(ZDOVars.s_accTime, t);
			}
		}

		private void UpdateFishnetTrap()
		{
			if (!m_nview.IsValid())
			{
				return;
			}
			UpdateState();
			if (!m_nview.IsOwner() || !m_container.m_inventory.HaveEmptySlot())
			{
				return;
			}
			double deltaTime = GetDeltaTime();
			float num = GetAccumulator() + (float)deltaTime;
			if ((double)num > 3600.0)
			{
				num = 3600f;
			}
			float num2 = 1f;
			while ((double)num >= 1.0)
			{
				num -= 1f;
				string queuedOre = GetQueuedOre();
				if ((m_maxOre != 0 && !(queuedOre != "")) || !((double)m_secPerProduct > 0.0))
				{
					continue;
				}
				float num3 = 1f * num2;
				if (queuedOre != "")
				{
					float num4 = GetBakeTimer() + num3;
					SetBakeTimer(num4);
					if ((double)num4 >= (double)m_secPerProduct)
					{
						SetBakeTimer(0f);
						RemoveOneOre();
						QueueProcessed(queuedOre);
					}
				}
			}
			SetAccumulator(num);
		}

		private void QueueProcessed(string ore)
		{
			AddToContainer(ore, 1);
		}

		private void SpawnProcessed()
		{
			if (m_nview.IsValid())
			{
				int @int = m_nview.GetZDO().GetInt(ZDOVars.s_spawnAmount, 0);
				if (@int > 0)
				{
					Spawn(m_nview.GetZDO().GetString(ZDOVars.s_spawnOre, ""), @int);
					m_nview.GetZDO().Set(ZDOVars.s_spawnOre, "");
					m_nview.GetZDO().Set(ZDOVars.s_spawnAmount, 0, false);
				}
			}
		}

		private int GetProcessedQueueSize()
		{
			return m_nview.IsValid() ? m_nview.GetZDO().GetInt(ZDOVars.s_spawnAmount, 0) : 0;
		}

		private void Spawn(string ore, int stack)
		{
			//IL_001f: 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_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			ItemConversion itemConversion = GetItemConversion(ore);
			if (itemConversion != null)
			{
				m_produceEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1);
				ItemDrop component = Object.Instantiate<GameObject>(((Component)itemConversion.m_to).gameObject, m_outputPoint.position, m_outputPoint.rotation).GetComponent<ItemDrop>();
				component.m_itemData.m_stack = stack;
				ItemDrop.OnCreateNew(component);
			}
		}

		private void AddToContainer(string ore, int stack)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			ItemConversion itemConversion = GetItemConversion(ore);
			if (itemConversion != null)
			{
				m_produceEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1);
				ItemDrop fish = getFish(itemConversion);
				if ((Object)(object)fish == (Object)null)
				{
					Debug.LogWarning((object)"Something went wrong no fish found!");
				}
				ItemData val = fish.m_itemData.Clone();
				val.m_stack = stack;
				if (m_container.GetInventory().CanAddItem(val, 1))
				{
					m_container.GetInventory().AddItem(val);
				}
			}
		}

		private ItemDrop getFish(ItemConversion itemConversion)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if (!CheckBiome(itemConversion.m_biome))
			{
				int num = Random.Range(0, 100);
				if (num <= 10)
				{
					ItemConversion itemConversionByBiomes = GetItemConversionByBiomes(GetBiome());
					if (itemConversionByBiomes != null)
					{
						return itemConversionByBiomes.m_to;
					}
				}
				return itemConversion.m_options[Random.Range(0, itemConversion.m_options.Count)];
			}
			int num2 = Random.Range(0, 100);
			if (num2 >= 75)
			{
				return itemConversion.m_to;
			}
			return itemConversion.m_options[Random.Range(0, itemConversion.m_options.Count)];
		}

		private bool CheckBiome(Biome m_biome)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Invalid comparison between Unknown and I4
			return (Heightmap.FindBiome(((Component)this).transform.position) & m_biome) > 0;
		}

		private Biome GetBiome()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			return Heightmap.FindBiome(((Component)this).transform.position);
		}

		private ItemConversion GetItemConversion(string itemName)
		{
			foreach (ItemConversion item in m_conversion)
			{
				if (((Object)((Component)item.m_from).gameObject).name == itemName)
				{
					return item;
				}
			}
			return null;
		}

		private ItemConversion GetItemConversionByBiomes(Biome m_biome)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			foreach (ItemConversion item in m_conversion)
			{
				if (item.m_biome == m_biome)
				{
					return item;
				}
			}
			return null;
		}

		private void SetNetState()
		{
			if (!IsActive())
			{
				m_full.SetActive(false);
				return;
			}
			m_full.SetActive(true);
			int num = m_container.m_inventory.NrOfItemsIncludingStacks();
			if (num > 1)
			{
				((Component)m_full.transform.Find("low")).gameObject.SetActive(true);
			}
			else
			{
				((Component)m_full.transform.Find("low")).gameObject.SetActive(false);
			}
			if ((double)num >= (double)m_maxFish * 0.5)
			{
				((Component)m_full.transform.Find("mid")).gameObject.SetActive(true);
			}
			else
			{
				((Component)m_full.transform.Find("mid")).gameObject.SetActive(false);
			}
			if ((double)num >= (double)m_maxFish * 0.75)
			{
				((Component)m_full.transform.Find("max")).gameObject.SetActive(true);
			}
			else
			{
				((Component)m_full.transform.Find("max")).gameObject.SetActive(false);
			}
			if (num >= m_maxFish)
			{
				m_full.SetActive(false);
			}
		}

		private void UpdateState()
		{
			bool flag = IsActive();
			m_enabledObject.SetActive(flag);
			if (Object.op_Implicit((Object)(object)m_disabledObject))
			{
				m_disabledObject.SetActive(!flag);
			}
			if (Object.op_Implicit((Object)(object)m_haveFuelObject))
			{
				m_haveFuelObject.SetActive((double)GetFuel() > 0.0);
			}
			if (Object.op_Implicit((Object)(object)m_haveOreObject))
			{
				m_haveOreObject.SetActive(GetQueueSize() > 0);
			}
			if (Object.op_Implicit((Object)(object)m_noOreObject))
			{
				m_noOreObject.SetActive(GetQueueSize() == 0);
			}
			if ((double)m_addOreAnimationDuration > 0.0 && (double)Time.time - (double)m_addedOreTime < (double)m_addOreAnimationDuration)
			{
				flag = true;
			}
			SetAnimation(flag);
			SetNetState();
		}

		private void SetAnimation(bool active)
		{
			Animator[] animators = m_animators;
			foreach (Animator val in animators)
			{
				if (((Component)val).gameObject.activeInHierarchy)
				{
					val.SetBool("active", active);
					val.SetFloat("activef", active ? 1f : 0f);
				}
			}
		}

		public bool IsActive()
		{
			return m_maxOre == 0 || GetQueueSize() > 0;
		}

		private string OnHoverEmptyOre()
		{
			return Localization.instance.Localize($"{m_name} ({GetProcessedQueueSize()} $piece_FishnetTrap_ready) \n[<color=yellow><b>$KEY_Use</b></color>] {m_emptyOreTooltip}");
		}

		private string OnHoverAddOre()
		{
			m_sb.Clear();
			m_sb.Append($"{m_name} ({GetQueueSize()}/{m_maxOre}) ");
			m_sb.Append("\n[<color=yellow><b>$KEY_Use</b></color>] " + m_addOreTooltip);
			return Localization.instance.Localize(m_sb.ToString());
		}
	}
	[BepInPlugin("balrond.astafaraios.BalrondShipyard", "BalrondShipyard", "1.4.9")]
	public class Launch : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(ShipyardStation), "Awake")]
		public static class ShipyardStation_Awake_Path
		{
			public static void Prefix(ShipyardStation __instance)
			{
				__instance.m_conversions = list;
			}
		}

		[HarmonyPatch(typeof(FishnetTrap), "Awake")]
		public static class FishnetTrap_Awake_Path
		{
			public static void Prefix(FishnetTrap __instance)
			{
				__instance.m_conversion = fishConversions;
			}
		}

		[HarmonyPatch(typeof(ShipExtensionManager), "Awake")]
		public static class ShipExtensionManager_Awake_Path
		{
			public static void Prefix(ShipExtensionManager __instance)
			{
				if (((Object)((Component)__instance).gameObject).name == "Karve(Clone)")
				{
					setupKarvePath(__instance);
				}
				if (((Object)((Component)__instance).gameObject).name == "VikingShip(Clone)")
				{
					setupDrakkarPath(__instance);
				}
				if (((Object)((Component)__instance).gameObject).name == "Knarr(Clone)")
				{
					setupKnarrPath(__instance);
				}
				if (((Object)((Component)__instance).gameObject).name == "Holk(Clone)")
				{
					setupHolkPath(__instance);
				}
				if (((Object)((Component)__instance).gameObject).name == "VikingShip_Ashlands(Clone)")
				{
					setupAshlandsDrakkarPath(__instance);
				}
			}
		}

		[HarmonyPatch(typeof(SEMan), "AddStatusEffect", new Type[]
		{
			typeof(int),
			typeof(bool),
			typeof(int),
			typeof(float)
		})]
		public class AddStatusEffectPatch
		{
			public static bool Prefix(SEMan __instance, ref int nameHash)
			{
				return !__instance.HaveStatusEffect("Waterproof".GetHashCode()) || nameHash != "Wet".GetHashCode();
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		public static class ZNetScene_Awake_Path
		{
			public static void Prefix(ZNetScene __instance)
			{
				//IL_0902: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)__instance == (Object)null)
				{
					return;
				}
				if ((Object)(object)shipyard == (Object)null)
				{
					Debug.Log((object)"THERE IS NO SHIPYARD");
					return;
				}
				objectRecipes.initPieces(__instance.m_prefabs);
				GameObject val = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "Hammer");
				PieceTable buildPieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces;
				setupRavenGuide(shipyard, __instance.m_prefabs);
				setupRavenGuide(scribeTable, __instance.m_prefabs);
				ashlandsUpdateFix();
				foreach (GameObject scroll in scrolls)
				{
					GameObject val2 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)scroll).name);
					if ((Object)(object)val2 != (Object)null)
					{
						Debug.Log((object)("[SHIP] Scroll already exists in Znet skipping: " + ((Object)scroll).name));
						continue;
					}
					if (((Object)scroll).name.Contains("Drakkar"))
					{
						scroll.GetComponent<ItemDrop>().m_itemData.m_shared.m_name.Replace("Drakkar", "Longship");
					}
					__instance.m_prefabs.Add(scroll);
				}
				foreach (GameObject item in items)
				{
					GameObject val3 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)item).name);
					if ((Object)(object)val3 != (Object)null)
					{
						Debug.Log((object)("[SHIP] Item already exists in Znet skipping: " + ((Object)item).name));
						continue;
					}
					if (((Object)item).name == "CapeSailor")
					{
						item.GetComponent<ItemDrop>().m_itemData.m_shared.m_equipStatusEffect = ObjectDB.instance.GetStatusEffect("Waterproof".GetHashCode());
					}
					__instance.m_prefabs.Add(item);
				}
				if (!wasLoaded)
				{
					shipExtensionFactory.init(__instance, scrolls);
					list = shipExtensionFactory.list;
					shipProcessor.list = shipExtensionFactory.list;
					listKarve = shipExtensionFactory.listKarve;
					listKnarr = shipExtensionFactory.listKnarr;
					listDrakkar = shipExtensionFactory.listDrakkar;
					listHolk = shipExtensionFactory.listHolk;
					listAshlandsDrakkar = shipExtensionFactory.listAshlandsDrakkar;
					objectRecipes.createHolkRecipe(dvergercarve);
					objectRecipes.createKnarrRecipe(karr);
					objectRecipes.createShipyardRecipe(shipyard);
					objectRecipes.createScribeTableRecipe(scribeTable);
					shipProcessor.setupShipyard(__instance, shipyard);
					buildPieces.m_pieces.Add(shipyard);
					buildPieces.m_pieces.Add(scribeTable);
					GameObject val4 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "Karve");
					GameObject val5 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "Raft");
					GameObject val6 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "VikingShip");
					GameObject val7 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "VikingShip_Ashlands");
					objectRecipes.createKarveRecipe(val4);
					objectRecipes.createDrakkarRecipe(val6);
					objectRecipes.createAshlandsDrakkarRecipe(val7);
					GameObject val8 = buildPieces.m_pieces.Find((GameObject x) => ((Object)x).name == ((Object)dvergercarve).name);
					if ((Object)(object)val8 == (Object)null)
					{
						buildPieces.m_pieces.Add(dvergercarve);
					}
					GameObject val9 = buildPieces.m_pieces.Find((GameObject x) => ((Object)x).name == ((Object)karr).name);
					if ((Object)(object)val9 == (Object)null)
					{
						buildPieces.m_pieces.Add(karr);
					}
					objectRecipes.editBuildPieceRecipes(pieces);
					foreach (GameObject piece2 in pieces)
					{
						GameObject val10 = buildPieces.m_pieces.Find((GameObject x) => ((Object)x).name == ((Object)piece2).name);
						if ((Object)(object)val10 != (Object)null)
						{
							Debug.Log((object)("[SHIP] Piece already exists in Hammer: " + ((Object)piece2).name));
						}
						else
						{
							buildPieces.m_pieces.Add(piece2);
						}
					}
					if ((Object)(object)val5 != (Object)null)
					{
						val5.GetComponent<Piece>().m_canBeRemoved = true;
						shipProcessor.addRaftExtensions(raftExtension, val5, __instance);
					}
					else
					{
						Debug.LogWarning((object)"[SHIP] NO KARVE TO EDIT");
					}
					if ((Object)(object)val4 != (Object)null)
					{
						GameObject gameObject = ((Component)val4.transform.Find("piece_chest")).gameObject;
						gameObject.GetComponent<Container>().m_width = 3;
						gameObject.GetComponent<Container>().m_height = 2;
						shipProcessor.addKarveExtensions(karveExtension, val4, __instance);
					}
					else
					{
						Debug.Log((object)"[SHIP] NO KARVE TO EDIT");
					}
					if ((Object)(object)karr != (Object)null)
					{
						shipProcessor.addKnarrExtensions(knarrExtension, karr, __instance);
					}
					else
					{
						Debug.Log((object)"[SHIP] NO KNARR TO EDIT");
					}
					if ((Object)(object)dvergercarve != (Object)null)
					{
						shipProcessor.addHolkExtensions(holkExtensions, dvergercarve, __instance);
					}
					else
					{
						Debug.Log((object)"[SHIP] NO HOLK TO EDIT");
					}
					if ((Object)(object)val7 != (Object)null)
					{
						GameObject gameObject2 = ((Component)val7.transform.Find("piece_chest")).gameObject;
						gameObject2.GetComponent<Container>().m_width = 8;
						gameObject2.GetComponent<Container>().m_height = 5;
						shipProcessor.addAshlandsDrakkarExtensions(ashlandsDrakkarExtensions, val7, __instance);
					}
					else
					{
						Debug.Log((object)"[SHIP] NO DRAKKAR TO EDIT");
					}
					if ((Object)(object)val6 != (Object)null)
					{
						GameObject gameObject3 = ((Component)val6.transform.Find("piece_chest")).gameObject;
						gameObject3.GetComponent<Container>().m_width = 6;
						gameObject3.GetComponent<Container>().m_height = 4;
						shipProcessor.addDrakkarExtensions(drakkarExtensions, val6, __instance);
					}
					else
					{
						Debug.Log((object)"[SHIP] NO LONGSHIP TO EDIT");
					}
					wasLoaded = true;
				}
				foreach (GameObject piece in pieces)
				{
					GameObject val11 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)piece).name);
					if ((Object)(object)val11 != (Object)null)
					{
						Debug.Log((object)("[SHIP] Piece already exists in Znet: " + ((Object)piece).name));
					}
					else
					{
						__instance.m_prefabs.Add(piece);
					}
				}
				__instance.m_prefabs.Add(projectileAnchor);
				__instance.m_prefabs.Add(shipyard);
				__instance.m_prefabs.Add(scribeTable);
				((Component)dvergercarve.transform.Find("piece_chest")).GetComponent<Container>().m_destroyedLootPrefab = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "CargoCrate");
				__instance.m_prefabs.Add(dvergercarve);
				((Component)karr.transform.Find("piece_chest")).GetComponent<Container>().m_destroyedLootPrefab = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == "CargoCrate");
				__instance.m_prefabs.Add(karr);
				if (!new ZNet().IsDedicated())
				{
					ShaderReplacment.runMaterialFix();
				}
			}
		}

		[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
		public static class Object_CopyOtherDB_Path
		{
			public static void Postfix()
			{
				if (!IsObjectDBValid())
				{
					return;
				}
				StatusEffect stat = (StatusEffect)(object)createWateproofStatusEffect();
				if ((Object)(object)ObjectDB.instance.m_StatusEffects.Find((StatusEffect x) => ((Object)x).name == ((Object)stat).name) == (Object)null)
				{
					ObjectDB.instance.m_StatusEffects.Add(stat);
				}
				objectRecipes.recipes = recipes;
				objectRecipes.initItems(ObjectDB.instance.m_items);
				foreach (GameObject scroll in scrolls)
				{
					AddNewPrefab(scroll);
				}
				foreach (GameObject item in items)
				{
					AddNewPrefab(item);
				}
				List<Recipe> collection = recipeBuilder.createRecipes(ObjectDB.instance.m_items, scrolls, scribeTable, items);
				recipes.AddRange(collection);
				foreach (Recipe recipe in recipes)
				{
					AddRecipeToObjectDB(recipe);
				}
			}
		}

		[HarmonyPatch(typeof(ObjectDB), "Awake")]
		public static class Object_Awake_Path
		{
			public static void Postfix()
			{
				if (!IsObjectDBValid())
				{
					return;
				}
				StatusEffect stat = (StatusEffect)(object)createWateproofStatusEffect();
				if ((Object)(object)ObjectDB.instance.m_StatusEffects.Find((StatusEffect x) => ((Object)x).name == ((Object)stat).name) == (Object)null)
				{
					ObjectDB.instance.m_StatusEffects.Add(stat);
				}
				objectRecipes.initItems(ObjectDB.instance.m_items);
				objectRecipes.recipes = recipes;
				foreach (GameObject scroll in scrolls)
				{
					AddNewPrefab(scroll);
				}
				foreach (GameObject item in items)
				{
					AddNewPrefab(item);
				}
				foreach (Recipe recipe in recipes)
				{
					AddRecipeToObjectDB(recipe);
				}
			}
		}

		private readonly Harmony harmony = new Harmony("balrond.astafaraios.BalrondShipyard");

		public const string PluginGUID = "balrond.astafaraios.BalrondShipyard";

		public const string PluginName = "BalrondShipyard";

		public const string PluginVersion = "1.4.9";

		private static AssetBundle assetBundle;

		public static GameObject karveExtension;

		public static GameObject knarrExtension;

		public static GameObject raftExtension;

		public static GameObject drakkarExtensions;

		public static GameObject ashlandsDrakkarExtensions;

		public static GameObject holkExtensions;

		public static GameObject shipyard;

		public static bool wasLoaded = false;

		public static ShipExtensionFactory shipExtensionFactory = new ShipExtensionFactory();

		public static List<ShipExtension> list = new List<ShipExtension>();

		public static List<ShipExtension> listKarve = new List<ShipExtension>();

		public static List<ShipExtension> listKnarr = new List<ShipExtension>();

		public static List<ShipExtension> listDrakkar = new List<ShipExtension>();

		public static List<ShipExtension> listAshlandsDrakkar = new List<ShipExtension>();

		public static List<ShipExtension> listHolk = new List<ShipExtension>();

		public static List<Texture> texturesKarve = new List<Texture>();

		public static List<Texture> texturesDrakkar = new List<Texture>();

		public static List<Texture> texturesRaft = new List<Texture>();

		public static List<GameObject> scrolls = new List<GameObject>();

		public static GameObject scribeTable;

		public static List<Recipe> recipes = new List<Recipe>();

		public static ShipProcessor shipProcessor = new ShipProcessor();

		public static ObjectRecipes objectRecipes = new ObjectRecipes();

		public static List<FishnetTrap.ItemConversion> fishConversions = new List<FishnetTrap.ItemConversion>();

		public static RecipeBuilder recipeBuilder = new RecipeBuilder();

		public static Sprite waterProofIco;

		public static List<GameObject> items = new List<GameObject>();

		public static string[] itemNames = new string[8] { "SailInk", "CoalPaste", "HelmetPirateBandana", "HelmetPirateHat", "SledgeAnchor", "CapeSailor", "ShieldSteering", "SwordSaber" };

		public static string[] scrollNames = new string[95]
		{
			"SchematicDrakkarAnchor", "SchematicDrakkarArmor", "SchematicDrakkarBarrels", "SchematicDrakkarCrates", "SchematicDrakkarLights", "SchematicDrakkarOar", "SchematicDrakkarShields", "SchematicDrakkarTent", "SchematicDrakkarHeadCernyx", "SchematicDrakkarHeadDragon",
			"SchematicDrakkarHeadOsberg", "SchematicDrakkarHeadSkull", "SchematicDrakkarSailBlack", "SchematicDrakkarSailBlue", "SchematicDrakkarSailGreen", "SchematicDrakkarSailDefault", "SchematicDrakkarSailTransparent", "SchematicDrakkarSailWhite", "SchematicDrakkarSailHound", "SchematicDrakkarSailDruid",
			"SchematicDrakkarSailWolf", "SchematicDrakkarSailRaven", "SchematicKarveAnchor", "SchematicKarveArmor", "SchematicKarveBag", "SchematicKarveLights", "SchematicKarveOars", "SchematicKarveShields", "SchematicKarveSailBlack", "SchematicKarveSailBlue",
			"SchematicKarveSailDefault", "SchematicKarveSailGreen", "SchematicKarveSailTransparent", "SchematicKarveSailWhite", "SchematicKarveSailHound", "SchematicKarveSailDruid", "SchematicKarveSailWolf", "SchematicKarveSailRaven", "SchematicKnarrAnchor", "SchematicKnarrArmor",
			"SchematicKnarrBag", "SchematicKnarrLights", "SchematicKnarrOars", "SchematicKnarrShields", "SchematicKnarrTent", "SchematicKnarrSailBlack", "SchematicKnarrSailBlue", "SchematicKnarrSailDefault", "SchematicKnarrSailDruid", "SchematicKnarrSailGreen",
			"SchematicKnarrSailHound", "SchematicKnarrSailRaven", "SchematicKnarrSailTransparent", "SchematicKnarrSailWhite", "SchematicKnarrSailWolf", "SchematicHolkAnchor", "SchematicHolkArmor", "SchematicHolkLights", "SchematicHolkOars", "SchematicHolkShields",
			"SchematicHolkTent", "SchematicHolkBag", "SchematicHolkRopes", "SchematicHolkSailBlack", "SchematicHolkSailBlue", "SchematicHolkSailGreen", "SchematicHolkSailDefault", "SchematicHolkSailTransparent", "SchematicHolkSailWhite", "SchematicHolkSailHound",
			"SchematicHolkSailDruid", "SchematicHolkSailWolf", "SchematicHolkSailRaven", "SchematicAshlandsDrakkarAnchor", "SchematicAshlandsDrakkarCrates", "SchematicAshlandsDrakkarLights", "SchematicAshlandsDrakkarOar", "SchematicAshlandsDrakkarShields", "SchematicAshlandsDrakkarTent", "SchematicAshlandsDrakkarRopes",
			"SchematicAshlandsDrakkarSailBlack", "SchematicAshlandsDrakkarSailBlue", "SchematicAshlandsDrakkarSailGreen", "SchematicAshlandsDrakkarSailDefault", "SchematicAshlandsDrakkarSailTransparent", "SchematicAshlandsDrakkarSailWhite", "SchematicAshlandsDrakkarSailHound", "SchematicAshlandsDrakkarSailDruid", "SchematicAshlandsDrakkarSailWolf", "SchematicAshlandsDrakkarSailRaven",
			"SchematicKnarrNamePlate", "SchematicKarveNamePlate", "SchematicHolkNamePlate", "SchematicAshlandsDrakkarNamePlate", "SchematicDrakkarNamePlate"
		};

		public static List<GameObject> pieces = new List<GameObject>();

		public static string[] piecesNames = new string[28]
		{
			"tar_wood_wall_log4", "tar_wood_wall_log2", "tar_wood_pole_log4", "tar_wood_pole_log2", "tar_wood_floor", "tar_ladder", "tar_wood_log_26", "tar_wood_log_45", "tar_wood_pole_log1", "tar_wood_ramp",
			"piece_chest_tarred", "piece_chest_cargo", "piece_iron_wall_torch", "decor_dragon", "bridge_rope", "bridge_rope_support", "bridge_rope_support_side", "cloth_roof", "cloth_roof_corner", "cloth_roof_corner2",
			"cloth_roof_triangle_sloope", "fishnet_wall", "piece_banner_sail1", "piece_banner_sail2", "piece_ropewall", "piece_ropewall_big", "piece_wisplampceiling", "FishnetTrap"
		};

		public static string[] sailNames = new string[10] { "default_drakkar", "blue_drakkar", "torn_drakkar", "green_drakkar", "transparent_drakkar", "white_drakkar", "sailCross", "yellow_drakkar", "sailDark", "sailVegvisir" };

		public static GameObject dvergercarve;

		public static GameObject karr;

		public static GameObject projectileAnchor;

		private static FieldInfo AttachAnimField = AccessTools.Field(typeof(Player), "m_attachAnimation");

		private void Awake()
		{
			init();
		}

		private void init()
		{
			LoadAllAssetBundles();
			shipProcessor.shipyard = shipyard;
			shipProcessor.texturesDrakkar = texturesDrakkar;
			shipProcessor.list = shipExtensionFactory.list;
			harmony.PatchAll();
		}

		private void OnDestroy()
		{
			harmony.UnpatchSelf();
		}

		private static bool IsObjectDBValid()
		{
			return (Object)(object)ObjectDB.instance != (Object)null && ObjectDB.instance.m_items.Count != 0 && ObjectDB.instance.m_recipes.Count != 0 && (Object)(object)ObjectDB.instance.GetItemPrefab("Amber") != (Object)null;
		}

		public static void LoadAllAssetBundles()
		{
			assetBundle = GetAssetBundleFromResources("shipyardnew");
			LoadPrefabs();
		}

		public static AssetBundle GetAssetBundleFromResources(string filename)
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(filename));
			using Stream stream = executingAssembly.GetManifestResourceStream(name);
			return AssetBundle.LoadFromStream(stream);
		}

		private static void LoadPrefabs()
		{
			string text = "Assets/Custom/BalrondShipyard/";
			waterProofIco = assetBundle.LoadAsset<Sprite>(text + "wateproof_ico.png");
			dvergercarve = assetBundle.LoadAsset<GameObject>(text + "prefabs/Holk.prefab");
			karr = assetBundle.LoadAsset<GameObject>(text + "prefabs/KnarrBal.prefab");
			((Object)karr).name = "Knarr";
			setupGateDoor(dvergercarve);
			ShaderReplacment.Replace(karr);
			ShaderReplacment.Replace(dvergercarve);
			raftExtension = assetBundle.LoadAsset<GameObject>(text + "prefabs/RaftExtension/RaftExtension.prefab");
			projectileAnchor = assetBundle.LoadAsset<GameObject>(text + "prefabs/projectile_anchor.prefab");
			karveExtension = assetBundle.LoadAsset<GameObject>(text + "prefabs/KarveExtensions/karveExtension.prefab");
			knarrExtension = ((Component)karr.transform.Find("knarrExtension")).gameObject;
			holkExtensions = ((Component)dvergercarve.transform.Find("DvergerExtension")).gameObject;
			ShaderReplacment.Replace(knarrExtension);
			ShaderReplacment.Replace(holkExtensions);
			shipyard = assetBundle.LoadAsset<GameObject>(text + "prefabs/pieces/ShipyardStation.prefab");
			drakkarExtensions = assetBundle.LoadAsset<GameObject>(text + "prefabs/DrakkarExtensions/DrakkarExtensions.prefab");
			ashlandsDrakkarExtensions = assetBundle.LoadAsset<GameObject>(text + "prefabs/AshlandsDrakkarExtensions.prefab");
			scribeTable = assetBundle.LoadAsset<GameObject>(text + "prefabs/pieces/piece_scribetable.prefab");
			ShaderReplacment.Replace(scribeTable);
			ShaderReplacment.Replace(karveExtension);
			ShaderReplacment.Replace(shipyard);
			ShaderReplacment.Replace(drakkarExtensions);
			ShaderReplacment.Replace(ashlandsDrakkarExtensions);
			string[] array = sailNames;
			foreach (string text2 in array)
			{
				Texture val = assetBundle.LoadAsset<Texture>(text + "sails/" + text2 + ".png");
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)("Sail not found: " + text2));
				}
				else
				{
					texturesDrakkar.Add(val);
				}
			}
			string[] array2 = piecesNames;
			foreach (string text3 in array2)
			{
				GameObject val2 = assetBundle.LoadAsset<GameObject>(text + "prefabs/pieces/" + text3 + ".prefab");
				if ((Object)(object)val2 == (Object)null)
				{
					Debug.LogWarning((object)("Not found: " + text3));
				}
				if (text3 == "FishnetTrap")
				{
					Object.DestroyImmediate((Object)(object)val2.GetComponent<Smelter>());
				}
				ShaderReplacment.Replace(val2);
				pieces.Add(val2);
			}
			string[] array3 = scrollNames;
			foreach (string text4 in array3)
			{
				GameObject val3 = assetBundle.LoadAsset<GameObject>(text + "prefabs/schematics/" + text4 + ".prefab");
				if ((Object)(object)val3 == (Object)null)
				{
					Debug.LogWarning((object)("Not found: " + text4));
				}
				ShaderReplacment.Replace(val3);
				scrolls.Add(val3);
			}
			string[] array4 = itemNames;
			foreach (string text5 in array4)
			{
				GameObject val4 = assetBundle.LoadAsset<GameObject>(text + "prefabs/items/" + text5 + ".prefab");
				if ((Object)(object)val4 == (Object)null)
				{
					Debug.LogWarning((object)("Not found: " + text5));
				}
				ShaderReplacment.Replace(val4);
				items.Add(val4);
			}
		}

		public static void setupGateDoor(GameObject gameObject)
		{
			GameObject gameObject2 = ((Component)gameObject.transform.Find("DvergerExtension/ramp_door")).gameObject;
			if ((Object)(object)gameObject2 == (Object)null)
			{
				Debug.LogWarning((object)"Cant find ramp !");
				return;
			}
			Door component = gameObject2.GetComponent<Door>();
			ShipRamp shipRamp = gameObject2.AddComponent<ShipRamp>();
			shipRamp.m_nview = gameObject.GetComponent<ZNetView>();
			shipRamp.m_name = component.m_name;
			shipRamp.m_openEffects = component.m_openEffects;
			shipRamp.m_openEnable = component.m_openEnable;
			shipRamp.m_closeEffects = component.m_closeEffects;
		}

		public static void setupRavenGuide(GameObject gameObject, List<GameObject> gameObjects)
		{
			GameObject gameObject2 = ((Component)gameObject.transform.Find("GuidePoint")).gameObject;
			GameObject val = gameObjects.Find((GameObject x) => ((Object)x).name == "piece_workbench");
			GameObject gameObject3 = ((Component)val.transform.Find("GuidePoint")).gameObject;
			GameObject ravenPrefab = gameObject3.GetComponent<GuidePoint>().m_ravenPrefab;
			if ((Object)(object)ravenPrefab == (Object)null)
			{
				Debug.LogWarning((object)"Ravens not found");
			}
			else
			{
				gameObject2.GetComponent<GuidePoint>().m_ravenPrefab = ravenPrefab;
			}
		}

		public static void setupDrakkarPath(ShipExtensionManager __instance)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = ((Component)((Component)__instance).transform.Find("DrakkarExtensions")).gameObject;
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)((Component)__instance).transform.Find("DrakkarExtensions(Clone)")).gameObject;
				if ((Object)(object)val == (Object)null)
				{
					val = Object.Instantiate<GameObject>(drakkarExtensions, Vector3.zero, Quaternion.identity);
					shipProcessor.setPosition(val, ((Component)__instance).gameObject);
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)"I PATCHED AND NOT FOUND EXTENSIONS FOR DRAKKAR");
			}
			if ((Object)(object)val != (Object)null)
			{
				__instance.lights = ((Component)val.transform.Find("Lamps")).gameObject;
				__instance.anchor = ((Component)val.transform.Find("Anchor")).gameObject;
				__instance.oars = ((Component)val.transform.Find("Oars")).gameObject;
				__instance.shields = ((Component)val.transform.Find("shieldset")).gameObject;
				__instance.roof = ((Component)val.transform.Find("Roof")).gameObject;
				__instance.lampheat = ((Component)val.transform.Find("LampWarm")).gameObject;
				__instance.fishnet = ((Component)val.transform.Find("fishnet")).gameObject;
				__instance.armor = ((Component)val.transform.Find("carapacehull")).gameObject;
				__instance.ram = ((Component)val.transform.Find("BatteringRam")).gameObject;
				__instance.nameplate = ((Component)val.transform.Find("shipplate")).gameObject;
				__instance.nameplate.SetActive(false);
			}
			__instance.shipExtensions = listDrakkar;
			Transform val2 = ((Component)__instance).gameObject.transform.Find("ship").Find("visual");
			GameObject gameObject = ((Component)val2.Find("Customize")).gameObject;
			gameObject.SetActive(true);
			__instance.customize = gameObject;
			__instance.sail = ((Component)val2.Find("Mast").Find("Sail").Find("sail_full")).gameObject;
			__instance.textures = texturesDrakkar;
			shipProcessor.setupNamePlate(__instance.nameplate, ((Component)__instance).GetComponent<Ship>());
			shipProcessor.setupFishnet(__instance.fishnet, ((Component)__instance).GetComponent<Ship>());
			shipProcessor.setupShipHeads(((Component)__instance).gameObject);
			shipProcessor.setupShipLamps(__instance.customize);
			shipProcessor.setupShipShieldsAndCrates(__instance.customize);
			shipProcessor.setupShipTent(__instance.customize);
		}

		public static void setupAshlandsDrakkarPath(ShipExtensionManager __instance)
		{
			//IL_0055: 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)
			GameObject val = ((Component)((Component)__instance).transform.Find("AshlandsDrakkarExtensions")).gameObject;
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)((Component)__instance).transform.Find("AshlandsDrakkarExtensions(Clone)")).gameObject;
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)"Extension not found on clone");
					val = Object.Instantiate<GameObject>(ashlandsDrakkarExtensions, Vector3.zero, Quaternion.identity);
					shipProcessor.setPosition(val, ((Component)__instance).gameObject);
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)"I PATCHED AND NOT FOUND EXTENSIONS FOR HOLK");
			}
			Ship component = ((Component)__instance).GetComponent<Ship>();
			shipProcessor.addAshlandsDrakkarExtensions(val, ((Component)component).gameObject, ZNetScene.instance);
			__instance.textures = texturesDrakkar;
		}

		public static void setupHolkPath(ShipExtensionManager __instance)
		{
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = ((Component)((Component)__instance).transform.Find("DvergerExtension")).gameObject;
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)"Extension not found on ship");
				val = ((Component)((Component)__instance).transform.Find("DvergerExtension(Clone)")).gameObject;
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)"Extension not found on clone");
					val = Object.Instantiate<GameObject>(holkExtensions, Vector3.zero, Quaternion.identity);
					shipProcessor.setPosition(val, ((Component)__instance).gameObject);
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)"I PATCHED AND NOT FOUND EXTENSIONS FOR HOLK");
			}
			Ship component = ((Component)__instance).GetComponent<Ship>();
			shipProcessor.addHolkExtensions(val, ((Component)component).gameObject, ZNetScene.instance);
			__instance.textures = texturesDrakkar;
		}

		public static void setupKarvePath(ShipExtensionManager __instance)
		{
			GameObject val = ((Component)((Component)__instance).transform.Find("karveExtension")).gameObject;
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)((Component)__instance).transform.Find("karveExtension(Clone)")).gameObject;
				if ((Object)(object)val == (Object)null)
				{
					val = Object.Instantiate<GameObject>(karveExtension);
					shipProcessor.setPosition(val, ((Component)__instance).gameObject);
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)"I PATCHED AND NOT FOUND EXTENSIONS FOR KARVE");
				return;
			}
			shipProcessor.addKarveExtensions(val, ((Component)__instance).gameObject, ZNetScene.instance);
			__instance.textures = texturesDrakkar;
		}

		public static void setupKnarrPath(ShipExtensionManager __instance)
		{
			GameObject val = ((Component)((Component)__instance).transform.Find("knarrExtension")).gameObject;
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)((Component)__instance).transform.Find("knarrExtension(Clone)")).gameObject;
				if ((Object)(object)val == (Object)null)
				{
					val = Object.Instantiate<GameObject>(knarrExtension);
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogWarning((object)"I PATCHED AND NOT FOUND EXTENSIONS FOR KNARR");
				return;
			}
			shipProcessor.addKnarrExtensions(val, ((Component)__instance).gameObject, ZNetScene.instance);
			__instance.textures = texturesDrakkar;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Ship), "OnTriggerEnter")]
		[HarmonyPatch(typeof(Ship), "OnTriggerExit")]
		public static void Ship_EnterExit(Collider collider, Ship __instance, List<Player> ___m_players)
		{
			if (Object.op_Implicit((Object)(object)((Component)collider).GetComponent<Player>()))
			{
				__instance.m_backwardForce = CalculateForce(___m_players.Count);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Ship), "UpdateOwner")]
		public static void Ship_UpdateOwner(Ship __instance, List<Player> ___m_players)
		{
			ShipExtensionManager component = ((Component)__instance).GetComponent<ShipExtensionManager>();
			if ((Object)(object)component != (Object)null && component.isOarActive())
			{
				int count = ___m_players.FindAll((Player p) => ((Character)p).IsAttached() && (string)AttachAnimField.GetValue(p) == "attach_chair").Count;
				__instance.m_backwardForce = CalculateForce(count);
				Debug.Log((object)("Ship ID:" + ((Object)__instance).GetInstanceID() + " sitting player count:" + count + " paddle force:" + __instance.m_backwardForce));
			}
		}

		public static bool isPaddleForceActive()
		{
			return true;
		}

		public static bool isLinear()
		{
			return true;
		}

		public static float CalculateForce(int playerCount)
		{
			if (playerCount <= 0 || !isPaddleForceActive())
			{
				return 0.5f;
			}
			if (isLinear())
			{
				return Mathf.Min(0.5f + 0.25f * (float)(playerCount - 1), 3f);
			}
			float num = 0.55f;
			float num2 = Mathf.Clamp(0.875f, 1E-05f, 0.99999f);
			return num * (float)((1.0 - (double)Mathf.Pow(num2, (float)playerCount)) / (1.0 - (double)num2));
		}

		public static void ashlandsUpdateFix()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			ImpactEffect component = dvergercarve.GetComponent<ImpactEffect>();
			ImpactEffect component2 = karr.GetComponent<ImpactEffect>();
			component.m_hitType = (HitType)17;
			component2.m_hitType = (HitType)17;
			WearNTear component3 = dvergercarve.GetComponent<WearNTear>();
			WearNTear component4 = karr.GetComponent<WearNTear>();
			component3.m_burnable = true;
			component4.m_burnable = true;
			Rigidbody component5 = dvergercarve.GetComponent<Rigidbody>();
			Rigidbody component6 = karr.GetComponent<Rigidbody>();
			component5.automaticCenterOfMass = true;
			component5.automaticInertiaTensor = true;
			component5.useGravity = true;
			component6.automaticCenterOfMass = true;
			component6.automaticInertiaTensor = true;
			component6.useGravity = true;
			Ship component7 = dvergercarve.GetComponent<Ship>();
			Ship component8 = karr.GetComponent<Ship>();
			component7.m_ashDamageMsgTime = 10f;
			component8.m_ashDamageMsgTime = 10f;
			component7.m_ashdamageEffects = ((Component)((Component)component7).transform.Find("ashlandeffects")).gameObject;
			component8.m_ashdamageEffects = ((Component)((Component)component8).transform.Find("ashlandeffects")).gameObject;
		}

		public static SE_WetImmunity createWateproofStatusEffect()
		{
			SE_WetImmunity sE_WetImmunity = ScriptableObject.CreateInstance<SE_WetImmunity>();
			((Object)sE_WetImmunity).name = "Waterproof";
			((StatusEffect)sE_WetImmunity).m_icon = waterProofIco;
			return sE_WetImmunity;
		}

		private static void AddRecipeToObjectDB(Recipe recipe)
		{
			int num = ObjectDB.instance.m_recipes.RemoveAll((Recipe x) => ((Object)x).name == ((Object)recipe).name);
			if (num > 0)
			{
			}
			ObjectDB.instance.m_recipes.Add(recipe);
		}

		private static void AddNewPrefab(GameObject newPrefab)
		{
			if ((Object)(object)newPrefab == (Object)null)
			{
				return;
			}
			if (((Object)newPrefab).name == "CapeSailor")
			{
				newPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_equipStatusEffect = ObjectDB.instance.GetStatusEffect("Waterproof".GetHashCode());
			}
			ItemDrop component = newPrefab.GetComponent<ItemDrop>();
			if ((Object)(object)component != (Object)null)
			{
				if (((Object)newPrefab).name.Contains("Drakkar"))
				{
					component.m_itemData.m_shared.m_name.Replace("Drakkar", "Longship");
				}
				if ((Object)(object)ObjectDB.instance.GetItemPrefab(((Object)newPrefab).name) == (Object)null)
				{
					ObjectDB.instance.m_items.Add(newPrefab);
					Dictionary<int, GameObject> dictionary = (Dictionary<int, GameObject>)typeof(ObjectDB).GetField("m_itemByHash", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(ObjectDB.instance);
					dictionary[StringExtensionMethods.GetStableHashCode(((Object)newPrefab).name)] = newPrefab;
				}
			}
			else
			{
				Debug.LogError((object)(((Object)newPrefab).name + " - ItemDrop not found on prefab"));
			}
		}
	}
	public class ObjectRecipes
	{
		public List<GameObject> zNetItems;

		public List<GameObject> ObjectDbItems;

		public List<Recipe> recipes;

		public List<GameObject> hammerTables;

		private string[] fishBaitNames = new string[9] { "FishingBait", "FishingBaitSwamp", "FishingBaitPlains", "FishingBaitOcean", "FishingBaitMistlands", "FishingBaitForest", "FishingBaitDeepNorth", "FishingBaitCave", "FishingBaitAshlands" };

		public void initPieces(List<GameObject> items)
		{
			zNetItems = items;
		}

		public void initItems(List<GameObject> items)
		{
			ObjectDbItems = items;
			GameObject val = ObjectDbItems.Find((GameObject x) => ((Object)x).name == "Hammer");
			hammerTables = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces.FindAll((GameObject x) => (Object)(object)x.GetComponent<CraftingStation>() != (Object)null);
		}

		public void editBuildPieceRecipes(List<GameObject> buildables)
		{
			foreach (GameObject buildable in buildables)
			{
				if ((Object)(object)buildable == (Object)null)
				{
					Debug.LogWarning((object)"BUILD PIECE IS NULL SOMETHING DID NOT LOAD");
					continue;
				}
				List<Requirement> list = new List<Requirement>();
				Piece component = buildable.GetComponent<Piece>();
				if (((Object)buildable).name.Contains("tar_"))
				{
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					switch (((Object)buildable).name)
					{
					case "tar_wood_wall_log4":
						list.Add(GetRequirement("CoalPaste", 2, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 4, 0, zNetItems));
						break;
					case "tar_wood_wall_log2":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
						break;
					case "tar_wood_pole_log4":
						list.Add(GetRequirement("CoalPaste", 2, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 4, 0, zNetItems));
						break;
					case "tar_wood_pole_log2":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
						break;
					case "tar_wood_floor":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
						break;
					case "tar_ladder":
						list.Add(GetRequirement("CoalPaste", 2, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 3, 0, zNetItems));
						break;
					case "tar_wood_log_26":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
						break;
					case "tar_wood_log_45":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
						break;
					case "tar_wood_pole_log1":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 1, 0, zNetItems));
						break;
					case "tar_wood_ramp":
						list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
						list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
						break;
					}
					component.m_resources = list.ToArray();
					continue;
				}
				component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "forge").GetComponent<CraftingStation>();
				switch (((Object)buildable).name)
				{
				case "decor_dragon":
					list.Add(GetRequirement("Coal", 1, 0, zNetItems));
					list.Add(GetRequirement("Iron", 1, 0, zNetItems));
					list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_chest_cargo":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("CoalPaste", 2, 0, zNetItems));
					list.Add(GetRequirement("IronNails", 24, 0, zNetItems));
					list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_chest_tarred":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("Tar", 5, 0, zNetItems));
					list.Add(GetRequirement("IronNails", 64, 0, zNetItems));
					list.Add(GetRequirement("FineWood", 20, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 10, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_iron_wall_torch":
					list.Add(GetRequirement("CoalPaste", 1, 0, zNetItems));
					list.Add(GetRequirement("Iron", 1, 0, zNetItems));
					list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
					list.Add(GetRequirement("Tar", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					((Component)component).gameObject.GetComponent<Fireplace>().m_fuelItem = zNetItems.Find((GameObject x) => ((Object)x).name == "Tar").GetComponent<ItemDrop>();
					break;
				case "bridge_rope":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 3, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "bridge_rope_support":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 6, 0, zNetItems));
					list.Add(GetRequirement("RoundLog", 2, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "bridge_rope_support_side":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 3, 0, zNetItems));
					list.Add(GetRequirement("RoundLog", 1, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "cloth_roof":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 1, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 6, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "cloth_roof_corner":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 1, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 6, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "cloth_roof_corner2":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 1, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 6, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "cloth_roof_triangle_sloope":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 1, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 6, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "fishnet_wall":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 1, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 6, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_banner_sail1":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 2, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_banner_sail2":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 2, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_ropewall":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 2, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_ropewall_big":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 2, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 2, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "piece_wisplampceiling":
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("Wisp", 3, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 3, 0, zNetItems));
					list.Add(GetRequirement("BronzeNails", 8, 0, zNetItems));
					list.Add(GetRequirement("Iron", 1, 0, zNetItems));
					component.m_resources = list.ToArray();
					break;
				case "FishnetTrap":
					((Behaviour)component).enabled = false;
					component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
					list.Add(GetRequirement("FineWood", 4, 0, zNetItems));
					list.Add(GetRequirement("LeatherScraps", 8, 0, zNetItems));
					list.Add(GetRequirement("IronNails", 14, 0, zNetItems));
					list.Add(GetRequirement("CoalPaste", 4, 0, zNetItems));
					list.Add(GetRequirement("FishingBait", 10, 0, zNetItems));
					component.m_resources = list.ToArray();
					setupFishtrap(component);
					break;
				default:
					Debug.LogWarning((object)("Unknown piece: " + ((Object)buildable).name));
					break;
				}
			}
		}

		private void setupFishtrap(Piece piece)
		{
			FishnetTrap fishnetTrap = ((Component)piece).gameObject.GetComponent<FishnetTrap>();
			if ((Object)(object)fishnetTrap == (Object)null)
			{
				fishnetTrap = ((Component)piece).gameObject.AddComponent<FishnetTrap>();
				fishnetTrap.m_container = ((Component)((Component)piece).transform.Find("piece_chest")).GetComponent<Container>();
				fishnetTrap.m_addOreSwitch = ((Component)((Component)piece).transform.Find("add_ore")).GetComponent<Switch>();
				fishnetTrap.m_haveOreObject = ((Component)((Component)piece).transform.Find("have_ore")).gameObject;
				fishnetTrap.m_enabledObject = ((Component)((Component)piece).transform.Find("_enabled")).gameObject;
				fishnetTrap.m_full = ((Component)((Component)piece).transform.Find("full")).gameObject;
			}
			Launch.setupRavenGuide(((Component)fishnetTrap).gameObject, zNetItems);
			setupFishtrapConversions(fishnetTrap);
			fishnetTrap.m_container.m_destroyedLootPrefab = zNetItems.Find((GameObject x) => ((Object)x).name == "CargoCrate");
		}

		private void setupFishtrapConversions(FishnetTrap FishnetTrap)
		{
			List<FishnetTrap.ItemConversion> list = new List<FishnetTrap.ItemConversion>();
			string[] array = fishBaitNames;
			foreach (string name in array)
			{
				FishnetTrap.ItemConversion itemConversion = singleConversion(name);
				if (itemConversion != null)
				{
					list.Add(itemConversion);
				}
			}
			Launch.fishConversions = list;
			FishnetTrap.m_conversion = list;
		}

		private FishnetTrap.ItemConversion singleConversion(string name)
		{
			string[] othernames = new string[3] { "Fish1", "Fish2", "Fish3" };
			return name switch
			{
				"FishingBait" => setupFishConversion(name, "Fish2", othernames, (Biome)1), 
				"FishingBaitSwamp" => setupFishConversion(name, "Fish6", othernames, (Biome)2), 
				"FishingBaitPlains" => setupFishConversion(name, "Fish7", othernames, (Biome)16), 
				"FishingBaitOcean" => setupFishConversion(name, "Fish8", othernames, (Biome)256), 
				"FishingBaitMistlands" => setupFishConversion(name, "Fish12", othernames, (Biome)512), 
				"FishingBaitForest" => setupFishConversion(name, "Fish5", othernames, (Biome)8), 
				"FishingBaitDeepNorth" => setupFishConversion(name, "Fish10", othernames, (Biome)64), 
				"FishingBaitCave" => setupFishConversion(name, "Fish4_cave", othernames, (Biome)4), 
				"FishingBaitAshlands" => setupFishConversion(name, "Fish11", othernames, (Biome)32), 
				_ => null, 
			};
		}

		private FishnetTrap.ItemConversion setupFishConversion(string from, string to, string[] othernames, Biome biome)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			FishnetTrap.ItemConversion itemConversion = new FishnetTrap.ItemConversion();
			itemConversion.m_seconds = 0;
			itemConversion.m_biome = biome;
			itemConversion.m_from = zNetItems.Find((GameObject x) => ((Object)x).name == from).GetComponent<ItemDrop>();
			itemConversion.m_to = zNetItems.Find((GameObject x) => ((Object)x).name == to).GetComponent<ItemDrop>();
			itemConversion.m_options = new List<ItemDrop>();
			foreach (string name in othernames)
			{
				itemConversion.m_options.Add(zNetItems.Find((GameObject x) => ((Object)x).name == name).GetComponent<ItemDrop>());
			}
			return itemConversion;
		}

		public void createAshlandsDrakkarRecipe(GameObject shipyard)
		{
			Piece component = shipyard.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("FineWood", 50, 0, zNetItems));
			list.Add(GetRequirement("IronNails", 160, 0, zNetItems));
			list.Add(GetRequirement("Tar", 30, 0, zNetItems));
			list.Add(GetRequirement("YggdrasilWood", 30, 0, zNetItems));
			list.Add(GetRequirement("CeramicPlate", 40, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
		}

		public void createDrakkarRecipe(GameObject shipyard)
		{
			Piece component = shipyard.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("FineWood", 35, 0, zNetItems));
			list.Add(GetRequirement("IronNails", 120, 0, zNetItems));
			list.Add(GetRequirement("CoalPaste", 35, 0, zNetItems));
			list.Add(GetRequirement("TrollHide", 20, 0, zNetItems));
			list.Add(GetRequirement("ElderBark", 40, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
		}

		public void createKarveRecipe(GameObject shipyard)
		{
			Piece component = shipyard.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("FineWood", 40, 0, zNetItems));
			list.Add(GetRequirement("BronzeNails", 100, 0, zNetItems));
			list.Add(GetRequirement("LeatherScraps", 16, 0, zNetItems));
			list.Add(GetRequirement("DeerHide", 10, 0, zNetItems));
			list.Add(GetRequirement("CoalPaste", 15, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
		}

		public void createKnarrRecipe(GameObject shipyard)
		{
			Piece component = shipyard.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("FineWood", 40, 0, zNetItems));
			list.Add(GetRequirement("BronzeNails", 140, 0, zNetItems));
			list.Add(GetRequirement("LeatherScraps", 14, 0, zNetItems));
			list.Add(GetRequirement("TrollHide", 14, 0, zNetItems));
			list.Add(GetRequirement("CoalPaste", 25, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
		}

		public void createHolkRecipe(GameObject shipyard)
		{
			Piece component = shipyard.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("YggdrasilWood", 40, 0, zNetItems));
			list.Add(GetRequirement("BlackMetal", 20, 0, zNetItems));
			list.Add(GetRequirement("ElderBark", 50, 0, zNetItems));
			list.Add(GetRequirement("LoxPelt", 12, 0, zNetItems));
			list.Add(GetRequirement("Tar", 20, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
		}

		public void createShipyardRecipe(GameObject shipyard)
		{
			Piece component = shipyard.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("FineWood", 30, 0, zNetItems));
			list.Add(GetRequirement("Bronze", 20, 0, zNetItems));
			list.Add(GetRequirement("Coal", 25, 0, zNetItems));
			list.Add(GetRequirement("DeerHide", 10, 0, zNetItems));
			list.Add(GetRequirement("Resin", 30, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "forge").GetComponent<CraftingStation>();
		}

		public void createScribeTableRecipe(GameObject table)
		{
			Piece component = table.GetComponent<Piece>();
			List<Requirement> list = new List<Requirement>();
			list.Add(GetRequirement("FineWood", 15, 0, zNetItems));
			list.Add(GetRequirement("Wood", 15, 0, zNetItems));
			list.Add(GetRequirement("BronzeNails", 35, 0, zNetItems));
			list.Add(GetRequirement("LeatherScraps", 15, 0, zNetItems));
			list.Add(GetRequirement("Feathers", 10, 0, zNetItems));
			component.m_resources = list.ToArray();
			component.m_craftingStation = zNetItems.Find((GameObject x) => ((Object)x).name == "piece_workbench").GetComponent<CraftingStation>();
		}

		private Requirement GetRequirement(string name, int amount, int amountPerLevel = 0, List<GameObject> itemlist = null)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			Requirement val = new Requirement();
			val.m_amount = amount;
			val.m_amountPerLevel = amountPerLevel;
			val.m_recover = true;
			val.m_resItem = itemlist.Find((GameObject x) => ((Object)x).name == name).GetComponent<ItemDrop>();
			return val;
		}
	}
	public class RecipeBuilder
	{
		private List<GameObject> pieces;

		private List<GameObject> items;

		private List<GameObject> newItems;

		public List<Recipe> recipes = new List<Recipe>();

		private CraftingStation cauldron;

		private CraftingStation workbench;

		private CraftingStation forge;

		private CraftingStation blackforge;

		private CraftingStation stoneCutter;

		private CraftingStation artisian;

		private CraftingStation runeforge;

		private CraftingStation tannery;

		private CraftingStation fletcher;

		private CraftingStation grill;

		private CraftingStation alchemylab;

		private CraftingStation scribe;

		public List<Recipe> createRecipes(List<GameObject> items, List<GameObject> newItems, GameObject scribeTable, List<GameObject> aditionals)
		{
			this.items = items;
			this.newItems = newItems;
			this.newItems.AddRange(aditionals);
			pieces = items.Find((GameObject x) => ((Object)x).name == "Hammer").GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces;
			prepareTables();
			scribe = scribeTable.GetComponent<CraftingStation>();
			CraftingStation val = scribe;
			int minStationLevel = 1;
			foreach (GameObject newItem in newItems)
			{
				if (!(((Object)newItem).name == "SchematicDrakkarFishnet") && !(((Object)newItem).name == "SchematicDrakkarRam") && !(((Object)newItem).name == "SchematicHolkCage"))
				{
					Recipe val2 = ScriptableObject.CreateInstance<Recipe>();
					val2.m_craftingStation = val;
					val2.m_repairStation = val;
					val2.m_minStationLevel = minStationLevel;
					val2 = createResources(newItem, val2);
					recipes.Add(val2);
				}
			}
			return recipes;
		}

		private void prepareTables()
		{
			cauldron = FindStation(pieces, "piece_cauldron");
			workbench = FindStation(pieces, "piece_workbench");
			forge = FindStation(pieces, "forge");
			blackforge = FindStation(pieces, "blackforge");
			stoneCutter = FindStation(pieces, "piece_stonecutter");
			artisian = FindStation(pieces, "piece_artisanstation");
			runeforge = FindStation(pieces, "piece_runeforge");
			tannery = FindStation(pieces, "piece_tannery");
			fletcher = FindStation(pieces, "piece_fletcher");
			grill = FindStation(pieces, "piece_grill");
			alchemylab = FindStation(pieces, "piece_alchemylab");
		}

		private Recipe createResources(GameObject item, Recipe newRecipe)
		{
			((Object)newRecipe).name = "Recipe_" + ((Object)item).name;
			newRecipe.m_item = item.GetComponent<ItemDrop>();
			newRecipe.m_amount = 1;
			newRecipe.m_enabled = true;
			List<Requirement> list = new List<Requirement>();
			newRecipe.m_craftingStation = scribe;
			newRecipe.m_minStationLevel = 1;
			switch (((Object)item).name)
			{
			case "SailInk":
				newRecipe.m_craftingStation = scribe;
				newRecipe.m_repairStation = scribe;
				newRecipe.m_minStationLevel = 1;
				newRecipe.m_amount = 4;
				list.Add(createReq("Blueberries", 7));
				list.Add(createReq("Cloudberry", 4));
				list.Add(createReq("Raspberry", 7));
				list.Add(createReq("Coal", 7));
				list.Add(createReq("Carrot", 6));
				list.Add(createReq("Bloodbag", 5));
				list.Add(createReq("Guck", 4));
				list.Add(createReq("GiantBloodSack", 2));
				list.Add(createReq("Charredskull", 2));
				list.Add(createReq("CharredBone", 2));
				newRecipe.m_requireOnlyOneIngredient = true;
				break;
			case "ShieldSteering":
				newRecipe.m_craftingStation = workbench;
				newRecipe.m_repairStation = workbench;
				newRecipe.m_minStationLevel = 3;
				list.Add(createReq("FineWood", 10, 5));
				list.Add(createReq("Iron", 10, 5));
				list.Add(createReq("LeatherScraps", 12, 6));
				list.Add(createReq("CoalPaste", 6, 3));
				break;
			case "SwordSaber":
				newRecipe.m_craftingStation = workbench;
				newRecipe.m_repairStation = workbench;
				newRecipe.m_minStationLevel = 3;
				list.Add(createReq("RoundLog", 4, 2));
				list.Add(createReq("Iron", 12, 6));
				list.Add(createReq("CoalPaste", 4, 2));
				list.Add(createReq("LeatherScraps", 12, 6));
				break;
			case "CapeSailor":
				newRecipe.m_craftingStation = workbench;
				newRecipe.m_repairStation = workbench;
				newRecipe.m_minStationLevel = 3;
				list.Add(createReq("SerpentScale", 9, 4));
				list.Add(createReq("LeatherScraps", 12, 6));
				list.Add(createReq("CoalPaste", 6, 3));
				list.Add(createReq("TrollHide", 6, 3));
				break;
			case "CoalPaste":
				newRecipe.m_amount = 4;
				newRecipe.m_craftingStation = workbench;
				newRecipe.m_repairStation = workbench;
				newRecipe.m_minStationLevel = 3;
				list.Add(createReq("Coal", 2));
				list.Add(createReq("Resin", 4));
				break;
			case "HelmetPirateBandana":
				newRecipe.m_craftingStation = workbench;
				newRecipe.m_repairStation = workbench;
				newRecipe.m_minStationLevel = 3;
				list.Add(createReq("JuteRed", 8, 4));
				list.Add(createReq("LeatherScraps", 10, 5));
				list.Add(createReq("CoalPaste", 6, 3));
				list.Add(createReq("TrophySerpent", 1));
				break;
			case "HelmetPirateHat":
				newRecipe.m_craftingStation = workbench;
				newRecipe.m_repairStation = workbench;
				newRecipe.m_minStationLevel = 3;
				list.Add(createReq("HelmetPirateBandana", 1));
				list.Add(createReq("SailInk", 10, 5));
				list.Add(createReq("LoxPelt", 4, 2));
				list.Add(createReq("Feathers", 14, 7));
				break;
			case "SledgeAnchor":
				newRecipe.m_craftingStation = forge;
				newRecipe.m_repairStation = forge;
				list.Add(createReq("Iron", 38, 18));
				list.Add(createReq("LeatherScraps", 20, 10));
				list.Add(createReq("Chain", 2, 1));
				list.Add(createReq("TrophySerpent", 1));
				break;
			case "SchematicKnarrNamePlate":
			case "SchematicKarveNamePlate":
			case "SchematicHolkNamePlate":
			case "SchematicAshlandsDrakkarNamePlate":
			case "SchematicDrakkarNamePlate":
				list.Add(createReq("Wood", 2));
				list.Add(createReq("Coal", 2));
				break;
			case "SchematicDrakkarArmor":
				list.Add(createReq("Carapace", 20));
				list.Add(createReq("BlackMetal", 16));
				list.Add(createReq("Guck", 20));
				list.Add(createReq("Chain", 8));
				break;
			case "SchematicDrakkarAnchor":
				list.Add(createReq("Iron", 13));
				list.Add(createReq("CoalPaste", 20));
				list.Add(createReq("FineWood", 10));
				list.Add(createReq("Chain", 3));
				break;
			case "SchematicDrakkarBarrels":
				list.Add(createReq("IronNails", 57));
				list.Add(createReq("Resin", 30));
				list.Add(createReq("FineWood", 10));
				list.Add(createReq("Wood", 20));
				break;
			case "SchematicDrakkarCrates":
				list.Add(createReq("Tar", 6));
				list.Add(createReq("BlackMetal", 8));
				list.Add(createReq("FineWood", 25));
				list.Add(createReq("IronNails", 33));
				break;
			case "SchematicDrakkarLights":
				list.Add(createReq("FineWood", 10));
				list.Add(createReq("IronNails", 37));
				list.Add(createReq("Copper", 5));
				break;
			case "SchematicDrakkarFishnet":
				newRecipe.m_enabled = false;
				list.Add(createReq("Wood", 10));
				list.Add(createReq("FineWood", 5));
				list.Add(createReq("RoundLog", 10));
				break;
			case "SchematicDrakkarOar":
				list.Add(createReq("Wood", 10));
				list.Add(createReq("FineWood", 5));
				list.Add(createReq("RoundLog", 10));
				break;
			case "SchematicDrakkarRam":
				newRecipe.m_enabled = false;
				list.Add(createReq("Iron", 33));
				list.Add(createReq("MechanicalSpring", 5));
				list.Add(createReq("Tar", 20));
				list.Add(createReq("Carapace", 33));
				break;
			case "SchematicDrakkarShields":
				list.Add(createReq("IronNails", 88));
				list.Add(createReq("RoundLog", 12));
				list.Add(createReq("Resin", 20));
				list.Add(createReq("DeerHide", 15));
				break;
			case "SchematicDrakkarTent":
				list.Add(createReq("JuteRed", 5));
				list.Add(createReq("IronNails", 23));
				list.Add(createReq("FineWood", 10));
				list.Add(createReq("WolfPelt", 3));
				break;
			case "SchematicDrakkarHeadCernyx":
			case "SchematicDrakkarHeadDragon":
			case "SchematicDrakkarHeadOsberg":
			case "SchematicDrakkarHeadSkull":
				list.Add(createReq("FineWood", 4));
				list.Add(createReq("Tin", 2));
				break;
			case "SchematicKnarrArmor":
				list.Add(createReq("Carapace", 16));
				list.Add(createReq("BlackMetal", 14));
				list.Add(createReq("Guck", 16));
				list.Add(createReq("Chain", 4));
				break;
			case "SchematicKarveArmor":
				list.Add(createReq("Carapace", 12));
				list.Add(createReq("BlackMetal", 12));
				list.Add(createReq("Guck", 12));
				list.Add(createReq("Chain", 4));
				break;
			case "SchematicKnarrAnchor":
				list.Add(createReq("Bronze", 8));
				list.Add(createReq("CoalPaste", 6));
				list.Add(createReq("LeatherScraps", 16));
				list.Add(createReq("Wood", 14));
				break;
			case "SchematicKarveAnchor":
				list.Add(createReq("Bronze", 6));
				list.Add(createReq("CoalPaste", 4));
				list.Add(createReq("LeatherScraps", 12));
				list.Add(createReq("Wood", 10));
				break;
			case "SchematicKnarrBag":
				list.Add(createReq("LeatherScraps", 12));
				list.Add(createReq("Tin", 4));
				list.Add(createReq("BronzeNails", 20));
				list.Add(createReq("FineWood", 14));
				break;
			case "SchematicKarveBag":
				list.Add(createReq("LeatherScraps", 10));
				list.Add(createReq("Tin", 3));
				list.Add(createReq("BronzeNails", 15));
				list.Add(createReq("FineWood", 10));
				break;
			case "SchematicKnarrLights":
				list.Add(createReq("CoalPaste", 12));
				list.Add(createReq("BronzeNails", 35));
				list.Add(createReq("Tin", 6));
				list.Add(createReq("FineWood", 12));
				break;
			case "SchematicKarveLights":
				list.Add(createReq("CoalPaste", 8));
				list.Add(createReq("BronzeNails", 25));
				list.Add(createReq("Tin", 4));
				list.Add(createReq("FineWood", 8));
				break;
			case "SchematicKnarrOars":
				list.Add(createReq("Wood", 7));
				list.Add(createReq("FineWood", 4));
				list.Add(createReq("RoundLog", 6));
				list.Add(createReq("CoalPaste", 6));
				break;
			case "SchematicKarveOars":
				list.Add(createReq("Wood", 5));
				list.Add(createReq("FineWood", 2));
				list.Add(createReq("RoundLog", 4));
				list.Add(createReq("CoalPaste", 4));
				break;
			case "SchematicKnarrShields":
				list.Add(createReq("LeatherScraps", 20));
				list.Add(createReq("BronzeNails", 65));
				list.Add(createReq("Copper", 12));
				list.Add(createReq("RoundLog", 24));
				break;
			case "SchematicKarveShields":
				list.Add(createReq("LeatherScraps", 14));
				list.Add(createReq("BronzeNails", 50));
				list.Add(createReq("Copper", 8));
				list.Add(createReq("RoundLog", 20));
				break;
			case "SchematicKnarrTent":
				list.Add(createReq("TrollHide", 10));
				list.Add(createReq("BronzeNails", 35));
				list.Add(createReq("FineWood", 10));
				list.Add(createReq("Wood", 6));
				break;
			case "SchematicKarveSailWhite":
			case "SchematicKarveSailTransparent":
			case "SchematicKarveSailBlack":
			case "SchematicKarveSailBlue":
			case "SchematicKarveSailDefault":
			case "SchematicKarveSailGreen":
			case "SchematicKarveSailHound":
			case "SchematicKarveSailDruid":
			case "SchematicKarveSailWolf":
			case "SchematicKarveSailRaven":
				list.Add(createReq("CoalPaste", 2));
				list.Add(createReq("Wood", 5));
				list.Add(createReq("SailInk", 3));
				list.Add(createReq("LeatherScraps", 5));
				break;
			case "SchematicDrakkarSailBlack":
			case "SchematicDrakkarSailBlue":
			case "SchematicDrakkarSailGreen":
			case "SchematicDrakkarSailDefault":
			case "SchematicDrakkarSailTransparent":
			case "SchematicDrakkarSailWhite":
			case "SchematicDrakkarSailHound":
			case "SchematicDrakkarSailDruid":
			case "SchematicDrakkarSailWolf":
			case "SchematicDrakkarSailRaven":
				list.Add(createReq("CoalPaste", 5));
				list.Add(createReq("FineWood", 5));
				list.Add(createReq("SailInk", 4));
				list.Add(createReq("LeatherScraps", 8));
				break;
			case "SchematicAshlandsDrakkarAnchor":
				list.Add(createReq("FlametalNew", 13));
				list.Add(createReq("CoalPaste", 20));
				list.Add(createReq("Blackwood", 10));
				list.Add(createReq("Chain", 4));
				break;
			case "SchematicAshlandsDrakkarCrates":
				list.Add(createReq("CharcoalResin", 6));
				list.Add(createReq("FlametalNew", 8));
				list.Add(createReq("Blackwood", 25));
				list.Add(createReq("IronNails", 33));
				break;
			case "SchematicAshlandsDrakkarLights":
				list.Add(createReq("Blackwood", 10));
				list.Add(createReq("IronNails", 37));
				list.Add(createReq("FlametalNew", 5));
				list.Add(createReq("Wisp", 4));
				break;
			case "SchematicAshlandsDrakkarOar":
				list.Add(createReq("Wood", 10));
				list.Add(createReq("Blackwood", 5));
				list.Add(createReq("RoundLog", 10));
				break;
			case "SchematicAshlandsDrakkarShields":
				list.Add(createReq("FlametalNew", 14));
				list.Add(createReq("Blackwood", 20));
				list.Add(createReq("CharcoalResin", 20));
				list.Add(createReq("AskHide", 10));
				break;
			case "SchematicAshlandsDrakkarTent":
				list.Add(createReq("LinenThread", 25));
				list.Add(createReq("FlametalNew", 10));
				list.Add(createReq("Blackwood", 20));
				list.Add(createReq("AskHide", 10));
				break;
			case "SchematicAshlandsDrakkarRopes":
				list.Add(createReq("Wood", 20));
				list.Add(createReq("Blackwood", 5));
				list.Add(createReq("LeatherScraps", 20));
				list.Add(createReq("FlametalNew", 5));
				break;
			case "SchematicAshlandsDrakkarSailBlack":
			case "SchematicAshlandsDrakkarSailBlue":
			case "SchematicAshlandsDrakkarSailGreen":
			case "SchematicAshlandsDrakkarSailDefault":
			case "SchematicAshlandsDrakkarSailTransparent":
			case "SchematicAshlandsDrakkarSailWhite":
			case "SchematicAshlandsDrakkarSailHound":
			case "SchematicAshlandsDrakkarSailDruid":
			case "SchematicAshlandsDrakkarSailWolf":
			case "SchematicAshlandsDrakkarSailRaven":
				list.Add(createReq("CoalPaste", 4));
				list.Add(createReq("Blackwood", 6));
				list.Add(createReq("SailInk", 6));
				list.Add(createReq("LeatherScraps", 14));
				break;
			case "SchematicKnarrSailBlack":
			case "SchematicKnarrSailBlue":
			case "SchematicKnarrSailDefault":
			case "SchematicKnarrSailDruid":
			case "SchematicKnarrSailGreen":
			case "SchematicKnarrSailHound":
			case "SchematicKnarrSailRaven":
			case "SchematicKnarrSailTransparent":
			case "SchematicKnarrSailWhite":
			case "SchematicKnarrSailWolf":
				list.Add(createReq("CoalPaste", 3));
				list.Add(createReq("Wood", 4));
				list.Add(createReq("SailInk", 2));
				list.Add(createReq("LeatherScraps", 4));
				break;
			case "SchematicHolkArmor":
				list.Add(createReq("Carapace", 40));
				list.Add(createReq("BlackMetal", 24));
				list.Add(createReq("Guck", 30));
				list.Add(createReq("Chain", 10));
				break;
			case "SchematicHolkBag":
				list.Add(createReq("Tar", 10));
				list.Add(createReq("BlackMetal", 12));
				list.Add(createReq("YggdrasilWood", 15));
				list.Add(createReq("IronNails", 77));
				break;
			case "SchematicHolkAnchor":
				list.Add(createReq("Iron", 20));
				list.Add(createReq("Tar", 6));
				list.Add(createReq("YggdrasilWood", 10));
				list.Add(createReq("Chain", 5));
				break;
			case "SchematicHolkCage":
				newRecipe.m_enabled = false;
				list.Add(createReq("Tar", 10));
				list.Add(createReq("BlackMetal", 8));
				list.Add(createReq("FineWood", 25));
				list.Add(createReq("IronNails", 33));
				break;
			case "SchematicHolkLights":
				list.Add(createReq("YggdrasilWood", 10));
				list.Add(createReq("IronNails", 37));
				list.Add(createReq("Wisp", 4));
				break;
			case "SchematicHolkRopes":
				list.Add(createReq("Wood", 10));
				list.Add(createReq("YggdrasilWood", 5));
				list.Add(createReq("LeatherScraps", 10));
				list.Add(createReq("IronNails", 16));
				break;
			case "SchematicHolkOars":
				list.Add(createReq("Wood", 10));
				list.Add(createReq("FineWood", 10));
				list.Add(createReq("RoundLog", 10));
				list.Add(createReq("YggdrasilWood", 10));
				break;
			case "SchematicHolkShields":
				list.Add(createReq("Chain", 10));
				list.Add(createReq("RoundLog", 40));
				list.Add(createReq("BlackMetal", 30));
				list.Add(createReq("WolfPelt", 16));
				break;
			case "SchematicHolkTent":
				list.Add(createReq("YggdrasilWood", 14));
				list.Add(createReq("IronNails", 40));
				list.Add(createReq("Tar", 10));
				list.Add(createReq("BlackMetal", 3));
				break;
			case "SchematicHolkSailBlack":
			case "SchematicHolkSailBlue":
			case "SchematicHolkSailGreen":
			case "SchematicHolkSailDefault":
			case "SchematicHolkSailTransparent":
			case "SchematicHolkSailWhite":
			case "SchematicHolkSailHound":
			case "SchematicHolkSailDruid":
			case "SchematicHolkSailWolf":
			case "SchematicHolkSailRaven":
				list.Add(createReq("CoalPaste", 7));
				list.Add(createReq("YggdrasilWood", 4));
				list.Add(createReq("SailInk", 6));
				list.Add(createReq("LeatherScraps", 10));
				break;
			}
			newRecipe.m_repairStation = newRecipe.m_craftingStation;
			if (list.Count == 0)
			{
				Debug.LogWarning((object)(((Object)newRecipe).name + " IS EMPTY"));
			}
			newRecipe.m_resources = list.ToArray();
			return newRecipe;
		}

		private void createSailInkRecipes()
		{
			string[] array = new string[7] { "Cloudberry", "Blueberries", "Raspberry", "Coal", "Carrot", "Bloodbag", "Guck" };
			ItemDrop component = ObjectDB.instance.m_items.Find((GameObject x) => ((Object)x).name == "SailInk").GetComponent<ItemDrop>();
			string[] array2 = array;
			foreach (string fruit in array2)
			{
				ItemDrop component2 = ObjectDB.instance.m_items.Find((GameObject x) => ((Object)x).name == fruit).GetComponent<ItemDrop>();
				if ((Object)(object)component2 != (Object)null)
				{
					Recipe val = ScriptableObject.CreateInstance<Recipe>();
					((Object)val).name = "Recipe_SailInk_" + fruit;
					val.m_craftingStation = scribe;
					val.m_repairStation = scribe;
					val.m_minStationLevel = 1;
					val.m_item = component;
					val.m_amount = 1;
					val = createSailInkRecipe(val, fruit);
					recipes.Add(val);
				}
			}
		}

		private Recipe createSailInkRecipe(Recipe newRecipe, string fruit)
		{
			List<Requirement> list = new List<Requirement>();
			switch (fruit)
			{
			case "Cloudberry":
				newRecipe.m_amount = 4;
				list.Add(createReq(fruit, 4));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Iceberry":
				newRecipe.m_amount = 3;
				list.Add(createReq(fruit, 3));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Blueberries":
				newRecipe.m_amount = 3;
				list.Add(createReq(fruit, 6));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Blackberries":
				newRecipe.m_amount = 3;
				list.Add(createReq(fruit, 4));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Raspberry":
				newRecipe.m_amount = 3;
				list.Add(createReq(fruit, 6));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Coal":
				newRecipe.m_amount = 4;
				list.Add(createReq(fruit, 6));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Carrot":
				newRecipe.m_amount = 3;
				list.Add(createReq(fruit, 5));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Bloodbag":
				newRecipe.m_amount = 4;
				list.Add(createReq(fruit, 3));
				newRecipe.m_resources = list.ToArray();
				break;
			case "Guck":
				newRecipe.m_amount = 4;
				list.Add(createReq(fruit, 3));
				newRecipe.m_resources = list.ToArray();
				break;
			}
			return newRecipe;
		}

		private Requirement createReq(string name, int amount, int amountPerLevel = 0)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			Requirement val = new Requirement();
			val.m_recover = true;
			ItemDrop component = FindItem(name).GetComponent<ItemDrop>();
			val.m_resItem = component;
			val.m_amount = amount;
			val.m_amountPerLevel = amountPerLevel;
			return val;
		}

		private GameObject FindItem(string name)
		{
			GameObject val = items.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)(object)val == (Object)null)
			{
				val = newItems.Find((GameObject x) => ((Object)x).name == name);
				if ((Object)(object)val != (Object)null)
				{
					return val;
				}
				Debug.LogWarning((object)("Item Not Found - " + name + ", Replaced With Wood"));
				return items.Find((GameObject x) => ((Object)x).name == "Wood");
			}
			if ((Object)(object)val != (Object)null)
			{
				return val;
			}
			Debug.LogWarning((object)("Item Not Found At All - " + name + ", Replaced With Wood"));
			return items.Find((GameObject x) => ((Object)x).name == "Wood");
		}

		private CraftingStation FindStation(List<GameObject> list, string name)
		{
			GameObject val = list.Find((GameObject x) => ((Object)x).name == name);
			if ((Object)(object)val != (Object)null)
			{
				return val.GetComponent<CraftingStation>();
			}
			return null;
		}
	}
	public class ShaderReplacment
	{
		public static List<GameObject> prefabsToReplaceShader = new List<GameObject>();

		public static List<Material> materialsInPrefabs = new List<Material>();

		public string[] shaderlist = new string[49]
		{
			"Custom/AlphaParticle", "Custom/Blob", "Custom/Bonemass", "Custom/Clouds", "Custom/Creature", "Custom/Decal", "Custom/Distortion", "Custom/Flow", "Custom/FlowOpaque", "Custom/Grass",
			"Custom/GuiScroll", "Custom/Heightmap", "Custom/icon", "Custom/InteriorSide", "Custom/LitGui", "Custom/LitParticles", "Custom/mapshader", "Custom/ParticleDecal", "Custom/Piece", "Custom/Player",
			"Custom/Rug", "Custom/ShadowBlob", "Custom/SkyboxProcedural", "Custom/SkyObject", "Custom/StaticRock", "Custom/Tar", "Custom/Trilinearmap", "Custom/UI/BGBlur", "Custom/Vegetation", "Custom/Water",
			"Custom/WaterBottom", "Custom/WaterMask", "Custom/Yggdrasil", "Custom/Yggdrasil/root", "Hidden/BlitCopyHDRTonemap", "Hidden/Dof/DepthOfFieldHdr", "Hidden/Dof/DX11Dof", "Hidden/Internal-Loading", "Hidden/Internal-UIRDefaultWorld", "Hidden/SimpleClear",
			"Hidden/SunShaftsComposite", "Lux Lit Particles/ Bumped", "Lux Lit Particles/ Tess Bumped", "Particles/Standard Surface2", "Particles/Standard Unlit2", "Standard TwoSided", "ToonDeferredShading2017", "Unlit/DepthWrite", "Unlit/Lighting"
		};

		public static List<Shader> shaders = new List<Shader>();

		private static readonly HashSet<Shader> CachedShaders = new HashSet<Shader>();

		public static bool debug = true;

		public static Shader findShader(string name)
		{
			Shader[] array = Resources.FindObjectsOfTypeAll<Shader>();
			if (array.Length == 0)
			{
				Debug.LogWarning((object)"SHADER LIST IS EMPTY!");
				return null;
			}
			if (debug)
			{
			}
			return shaders.Find((Shader x) => ((Object)x).name == name);
		}

		public static Shader GetShaderByName(string name)
		{
			return shaders.Find((Shader x) => ((Object)x).name == name.Trim());
		}

		public static void debugShaderList(List<Shader> shadersRes)
		{
			foreach (Shader shadersRe in shadersRes)
			{
				Debug.LogWarning((object)("SHADER NAME IS: " + ((Object)shadersRe).name));
			}
			debug = false;
		}

		public static void Replace(GameObject gameObject)
		{
			prefabsToReplaceShader.Add(gameObject);
			GetMaterialsInPrefab(gameObject);
		}

		public static void GetMaterialsInPrefab(GameObject gameObject)
		{
			Renderer[] componentsInChildren = gameObject.GetComponentsInChildren<Renderer>(true);
			Renderer[] array = componentsInChildren;
			foreach (Renderer val in array)
			{
				Material[] sharedMaterials = val.sharedMaterials;
				if (sharedMaterials == null || sharedMaterials.Length == 0)
				{
					continue;
				}
				Material[] array2 = sharedMaterials;
				foreach (Material val2 in array2)
				{
					if ((Object)(object)val2 != (Object)null)
					{
						materialsInPrefabs.Add(val2);
					}
				}
			}
		}

		public static void getMeShaders()
		{
			AssetBundle[] array = Resources.FindObjectsOfTypeAll<AssetBundle>();
			AssetBundle[] array2 = array;
			foreach (AssetBundle val in array2)
			{
				IEnumerable<Shader> enumerable3;
				try
				{
					IEnumerable<Shader> enumerable2;
					if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val))
					{
						IEnumerable<Shader> enumerable = val.LoadAllAssets<Shader>();
						enumerable2 = enumerable;
					}
					else
					{
						enumerable2 = from shader in ((IEnumerable<string>)val.GetAllAssetNames()).Select((Func<string, Shader>)val.LoadAsset<Shader>)
							where (Object)(object)shader != (Object)null
							select shader;
					}
					enumerable3 = enumerable2;
				}
				catch (Exception)
				{
					continue;
				}
				if (enumerable3 == null)
				{
					continue;
				}
				foreach (Shader item in enumerable3)
				{
					CachedShaders.Add(item);
				}
			}
		}

		public static void runMaterialFix()
		{
			getMeShaders();
			shaders.AddRange(CachedShaders);
			foreach (Material materialsInPrefab in materialsInPrefabs)
			{
				Shader shader = materialsInPrefab.shader;
				if (!((Object)(object)shader == (Object)null))
				{
					string name = ((Object)shader).name;
					if (!(name == "Standard") && name.Contains("Balrond"))
					{
						setProperValue(materialsInPrefab, name);
					}
				}
			}
		}

		private static void setProperValue(Material material, string shaderName)
		{
			string name = shaderName.Replace("Balrond", "Custom");
			name = checkNaming(name);
			Shader shaderByName = GetShaderByName(name);
			if ((Object)(object)shaderByName == (Object)null)
			{
				Debug.LogWarning((object)("Shader not found " + name));
			}
			else
			{
				material.shader = shaderByName;
			}
		}

		private static string checkNaming(string name)
		{
			strin