Decompiled source of balrond shipyard v1.3.7

plugins/BalrondShipyard.dll

Decompiled 2 weeks 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 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 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.3.7")]
public class Launch : BaseUnityPlugin
{
	[HarmonyPriority(700)]
	[HarmonyPatch(typeof(FejdStartup), "Awake")]
	private static class Replace_ShaderPatch
	{
		public static void Postfix()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (new ZNet().IsDedicated())
			{
				return;
			}
			ShaderReplacment.findShadersByName();
			foreach (GameObject item in ShaderReplacment.GOToSwap)
			{
				if (!((Object)(object)item == (Object)null))
				{
					Renderer[] componentsInChildren = item.GetComponentsInChildren<Renderer>();
					if (componentsInChildren == null || componentsInChildren.Length == 0)
					{
						break;
					}
					ShaderReplacment.ReplaceShadersInObject(componentsInChildren);
				}
			}
		}
	}

	[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);
			}
		}
	}

	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	public static class ZNetScene_Awake_Path
	{
		public static void Prefix(ZNetScene __instance)
		{
			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);
			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));
				}
				else
				{
					__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));
				}
				else
				{
					__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;
				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");
				objectRecipes.createKarveRecipe(val4);
				objectRecipes.createDrakkarRecipe(val6);
				GameObject val7 = buildPieces.m_pieces.Find((GameObject x) => ((Object)x).name == ((Object)dvergercarve).name);
				if ((Object)(object)val7 == (Object)null)
				{
					buildPieces.m_pieces.Add(dvergercarve);
				}
				GameObject val8 = buildPieces.m_pieces.Find((GameObject x) => ((Object)x).name == ((Object)karr).name);
				if ((Object)(object)val8 == (Object)null)
				{
					buildPieces.m_pieces.Add(karr);
				}
				objectRecipes.editBuildPieceRecipes(pieces);
				foreach (GameObject piece2 in pieces)
				{
					GameObject val9 = buildPieces.m_pieces.Find((GameObject x) => ((Object)x).name == ((Object)piece2).name);
					if ((Object)(object)val9 != (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 = 4;
					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)val6 != (Object)null)
				{
					val6.GetComponent<Piece>().m_name = "Drakkar";
					GameObject gameObject2 = ((Component)val6.transform.Find("piece_chest")).gameObject;
					gameObject2.GetComponent<Container>().m_width = 8;
					gameObject2.GetComponent<Container>().m_height = 3;
					shipProcessor.addDrakkarExtensions(drakkarExtensions, val6, __instance);
				}
				else
				{
					Debug.Log((object)"[SHIP] NO DRAKKAR TO EDIT");
				}
				wasLoaded = true;
			}
			foreach (GameObject piece in pieces)
			{
				GameObject val10 = __instance.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)piece).name);
				if ((Object)(object)val10 != (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);
		}
	}

	[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
	public static class Object_CopyOtherDB_Path
	{
		public static void Postfix()
		{
			if (!IsObjectDBValid())
			{
				return;
			}
			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;
			}
			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.3.7";

	private static AssetBundle assetBundle;

	public static GameObject karveExtension;

	public static GameObject knarrExtension;

	public static GameObject raftExtension;

	public static GameObject drakkarExtensions;

	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> 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 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[73]
	{
		"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"
	};

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

	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;
		}
		ItemDrop component = newPrefab.GetComponent<ItemDrop>();
		if ((Object)(object)component != (Object)null)
		{
			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));
				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 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", 140, 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 == "forge").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 == "forge").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 == "SailInk") && !(((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);
			}
		}
		createSailInkRecipes();
		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 "ShieldSteering":
			newRecipe.m_craftingStation = workbench;
			newRecipe.m_repairStation = workbench;
			newRecipe.m_minStationLevel = 3;
			list.Add(createReq("FineWood", 6, 3));
			list.Add(createReq("Iron", 12, 6));
			list.Add(createReq("LeatherScraps", 12, 6));
			list.Add(createReq("CoalPaste", 4, 2));
			break;
		case "SwordSaber":
			newRecipe.m_craftingStation = workbench;
			newRecipe.m_repairStation = workbench;
			newRecipe.m_minStationLevel = 3;
			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", 6, 3));
			list.Add(createReq("LeatherScraps", 12, 6));
			list.Add(createReq("CoalPaste", 4, 2));
			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", 9, 3));
			list.Add(createReq("LeatherScraps", 10, 5));
			list.Add(createReq("WolfPelt", 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", 5, 2));
			list.Add(createReq("Feathers", 10, 5));
			break;
		case "SledgeAnchor":
			newRecipe.m_craftingStation = forge;
			newRecipe.m_repairStation = forge;
			list.Add(createReq("Iron", 40, 15));
			list.Add(createReq("LeatherScraps", 20, 10));
			list.Add(createReq("Chain", 2));
			list.Add(createReq("TrophySerpent", 1));
			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("Wood", 8));
			list.Add(createReq("SailInk", 4));
			list.Add(createReq("LeatherScraps", 8));
			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("Wood", 10));
			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> GOToSwap = new List<GameObject>();

	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>();

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

	public static void findShadersByName()
	{
		Shader[] collection = Resources.FindObjectsOfTypeAll<Shader>();
		shaders.AddRange(collection);
	}

	public static void ReplaceShadersInObject(Renderer[] renderers)
	{
		foreach (Renderer val in renderers)
		{
			Material[] sharedMaterials = val.sharedMaterials;
			if (sharedMaterials != null && sharedMaterials.Length != 0)
			{
				fixMaterial(sharedMaterials);
			}
		}
	}

	private static void fixMaterial(Material[] shared)
	{
		foreach (Material val in shared)
		{
			if ((Object)(object)val == (Object)null)
			{
				continue;
			}
			Shader shader = val.shader;
			if (!((Object)(object)shader == (Object)null))
			{
				string name = ((Object)shader).name;
				if (!(name == "Standard") && name.Contains("Balrond"))
				{
					setProperValue(val, name);
				}
			}
		}
	}

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

	private static string checkNaming(string name)
	{
		string result = name;
		if (name.Contains("Bumped"))
		{
			result = name.Replace("Custom", "Lux Lit Particles");
		}
		if (name.Contains("Tess Bumped"))
		{
			result = name.Replace("Custom", "Lux Lit Particles");
		}
		if (name.Contains("Standard Surface"))
		{
			result = name.Replace("Custom", "Particles");
			result = result.Replace("Standard Surface2", "Standard Surface");
		}
		if (name.Contains("Standard Unlit"))
		{
			result = name.Replace("Custom", "Particles");
			result = result.Replace("Standard Unlit", "Standard Unlit2");
			result = result.Replace("Standard Unlit22", "Standard Unlit2");
		}
		return result;
	}
}
[Serializable]
public class ShipExtension
{
	[Serializable]
	public class Requirement
	{
		public ItemDrop m_resItem;

		public int m_amount = 1;
	}

	[Serializable]
	public enum ExtensionDecorType
	{
		Default,
		One,
		Two,
		Three,
		Four,
		Five,
		Six,
		Seven,
		Eight,
		Nine
	}

	[Serializable]
	public enum ShipExtensionType
	{
		Inventory,
		Inventory2,
		Shelter,
		Health,
		Light,
		Anchor,
		PaintOne,
		Head,
		Oars,
		Ram,
		Ramp,
		ResistBlunt,
		ResistSlash,
		ResistPierce,
		Fishnet,
		Ropes,
		Armor,
		Other
	}

	[Serializable]
	public enum ShipType
	{
		Raft,
		Karve,
		Drakkar,
		Knarr,
		Holk
	}

	public List<Requirement> m_requirements;

	[Tooltip("Ship ex Raft/Karve/VikingShip")]
	public ShipType shipType;

	[Tooltip("Type of ship upgrade will be matched with proper game object")]
	public ShipExtensionType type = ShipExtensionType.Other;

	[Tooltip("A sub type for decor purpose aka Sail/ ShipHead")]
	public ExtensionDecorType decorType = ExtensionDecorType.Default;

	public string descriptionBase = "";

	public string descriptionGenerated = "";

	public bool CanCraft(Inventory inv)
	{
		bool result = false;
		int num = 0;
		foreach (ItemData item in inv.m_inventory)
		{
			foreach (Requirement requirement in m_requirements)
			{
				if (item.m_shared.m_name == requirement.m_resItem.m_itemData.m_shared.m_name && item.m_stack == requirement.m_amount)
				{
					num++;
				}
			}
		}
		if (num == m_requirements.Count)
		{
			result = true;
		}
		return result;
	}
}
public class ShipExtensionFactory
{
	public ZNetScene zNetScene;

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

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

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

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

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

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

	public void init(ZNetScene zNetScene, List<GameObject> scrolls)
	{
		this.zNetScene = zNetScene;
		this.scrolls = scrolls;
		createKarveExtensions();
		createDrakkarExtensions();
		createKnarrExtensions();
		createHolkExtensions();
	}

	private void createHolkExtensions()
	{
		createLamp("Holk");
		createShield("Holk");
		createHolkSupply();
		createAnchor("Holk");
		shipSail9("Holk", 10);
		createOars("Holk");
		createHolkTent();
		createArmor("Holk");
		createHolkRopes();
	}

	private void createKarveExtensions()
	{
		createLamp("Karve");
		createShield("Karve");
		createKarveSupply();
		createAnchor("Karve");
		createArmor("Karve");
		shipSail9("Karve", 10);
		createOars("Karve");
	}

	private void createKnarrExtensions()
	{
		createLamp("Knarr");
		createShield("Knarr");
		createKnarrSupply();
		createAnchor("Knarr");
		shipSail9("Knarr", 10);
		createOars("Knarr");
		createArmor("Knarr");
		createKnarrTent();
	}

	private void createDrakkarExtensions()
	{
		createLamp("Drakkar");
		createOars("Drakkar");
		createShield("Drakkar");
		createDrakkarSupply();
		createAnchor("Drakkar");
		createDrakkarSupply2();
		createDrakkarTent();
		shipSail9("Drakkar", 10);
		createArmor("Drakkar");
		createDrakkarHeadStyle();
	}

	private void createKnarrSupply()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicKnarrBag", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.ResistBlunt, ShipExtension.ShipType.Knarr, list);
		shipExtension.descriptionBase = "Adds supplies. Increase ship blunt resistance";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listKnarr.Add(shipExtension);
	}

	private void createKnarrTent()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicKnarrTent", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.Shelter, ShipExtension.ShipType.Knarr, list);
		shipExtension.descriptionBase = "Adds Tent. Increase health by 200";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listKnarr.Add(shipExtension);
	}

	private void createHolkTent()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicHolkTent", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.Shelter, ShipExtension.ShipType.Holk, list);
		shipExtension.descriptionBase = "Adds Tent. Increase health by 200";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listHolk.Add(shipExtension);
	}

	private void createHolkRopes()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicHolkRopes", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.Ropes, ShipExtension.ShipType.Holk, list);
		shipExtension.descriptionBase = "Adds side ropes. Allows you to get to upper deck from water level";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listHolk.Add(shipExtension);
	}

	private void createKnarrPaintJob()
	{
	}

	private void createKarveSupply()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicKarveBag", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.ResistBlunt, ShipExtension.ShipType.Karve, list);
		shipExtension.descriptionBase = "Adds supplies. Increase ship blunt resistance";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listKarve.Add(shipExtension);
	}

	private void createAnchor(string shipname)
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		ShipExtension shipExtension = null;
		switch (shipname)
		{
		case "Karve":
			list.Add(CreateRequirement("SchematicKarveAnchor", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Anchor, ShipExtension.ShipType.Karve, list);
			listKarve.Add(shipExtension);
			break;
		case "Knarr":
			list.Add(CreateRequirement("SchematicKnarrAnchor", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Anchor, ShipExtension.ShipType.Knarr, list);
			listKnarr.Add(shipExtension);
			break;
		case "Drakkar":
			list.Add(CreateRequirement("SchematicDrakkarAnchor", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Anchor, ShipExtension.ShipType.Drakkar, list);
			listDrakkar.Add(shipExtension);
			break;
		case "Holk":
			list.Add(CreateRequirement("SchematicHolkAnchor", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Anchor, ShipExtension.ShipType.Holk, list);
			listHolk.Add(shipExtension);
			break;
		}
		if (shipExtension != null)
		{
			shipExtension.descriptionBase = "Adds Anchor. You gain ability to stop your ship in place";
			createItemDescription(list, shipExtension.descriptionBase);
			this.list.Add(shipExtension);
		}
	}

	private void createKarvePaintJob()
	{
	}

	private void createLamp(string shipname)
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		ShipExtension shipExtension = null;
		switch (shipname)
		{
		case "Karve":
			list.Add(CreateRequirement("SchematicKarveLights", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Light, ShipExtension.ShipType.Karve, list);
			listKarve.Add(shipExtension);
			break;
		case "Knarr":
			list.Add(CreateRequirement("SchematicKnarrLights", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Light, ShipExtension.ShipType.Knarr, list);
			listKnarr.Add(shipExtension);
			break;
		case "Drakkar":
			list.Add(CreateRequirement("SchematicDrakkarLights", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Light, ShipExtension.ShipType.Drakkar, list);
			listDrakkar.Add(shipExtension);
			break;
		case "Holk":
			list.Add(CreateRequirement("SchematicHolkLights", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Light, ShipExtension.ShipType.Holk, list);
			listHolk.Add(shipExtension);
			break;
		}
		if (shipExtension != null)
		{
			shipExtension.descriptionBase = "Adds Lights. Adds Warm effect";
			createItemDescription(list, shipExtension.descriptionBase);
			this.list.Add(shipExtension);
		}
	}

	private void createShield(string shipname)
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		ShipExtension shipExtension = null;
		switch (shipname)
		{
		case "Karve":
			list.Add(CreateRequirement("SchematicKarveShields", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Health, ShipExtension.ShipType.Karve, list);
			shipExtension.descriptionBase = "Adds Shields. Increase ships health by 200";
			listKarve.Add(shipExtension);
			break;
		case "Knarr":
			list.Add(CreateRequirement("SchematicKnarrShields", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Health, ShipExtension.ShipType.Knarr, list);
			shipExtension.descriptionBase = "Adds Shields. Increase ships health by 200";
			listKnarr.Add(shipExtension);
			break;
		case "Drakkar":
			list.Add(CreateRequirement("SchematicDrakkarShields", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Health, ShipExtension.ShipType.Drakkar, list);
			shipExtension.descriptionBase = "Adds Shields. Increase ships health by 300";
			listDrakkar.Add(shipExtension);
			break;
		case "Holk":
			list.Add(CreateRequirement("SchematicHolkShields", 1));
			shipExtension = createExtension(ShipExtension.ShipExtensionType.Health, ShipExtension.ShipType.Holk, list);
			shipExtension.descriptionBase = "Adds Shields. Increase ships health by 300";
			listHolk.Add(shipExtension);
			break;
		}
		if (shipExtension != null)
		{
			createItemDescription(list, shipExtension.descriptionBase);
			this.list.Add(shipExtension);
		}
	}

	private void createHolkRamp()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicHolkCage", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.Ramp, ShipExtension.ShipType.Holk, list);
		shipExtension.descriptionBase = "Adds cage and ramp for transporting animals";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listHolk.Add(shipExtension);
	}

	private void createHolkSupply()
	{
		List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
		list.Add(CreateRequirement("SchematicHolkBag", 1));
		ShipExtension shipExtension = createExtension(ShipExtension.ShipExtensionType.ResistBlunt, ShipExtension.ShipType.Holk, list);
		shipExtension.descriptionBase = "Adds supplies. Increase ship blunt resistance";
		createItemDescription(list, shipExtension.descriptionBase);
		this.list.Add(shipExtension);
		listHolk.Add(shipExtension);
	}

	private void createHolkPaintJob()
	{
		shipSail9("Holk", 10);
	}

	private void shipSail9(string shipname, int number)
	{
		for (int i = 0; i < number; i++)
		{
			List<ShipExtension.Requirement> list = new List<ShipExtension.Requirement>();
			ShipExtension shipExtension = null;
			switch (shipname)
			{
			case "Karve":
				list.Add(CreateRequirement(GetSailSchematicName(shipname, i), 1));
				shipExtension = createExtension(ShipExtension.ShipExtensionType.PaintOne, ShipExtension.ShipType.Karve, list, (ShipExtension.ExtensionDecorType)i);
				listKarve.Add(shipExtension);
				break;
			case "Knarr":
				list.Add(CreateRequirement(GetSailSchematicName(shipname, i), 1));
				shipExtension = createExtension(ShipExtension.ShipExtensionType.PaintOne, ShipExtension.ShipType.Knarr, list, (ShipExtension.ExtensionDecorType)i);
				listKnarr.Add(shipExtension);
				break;
			case "Drakkar":
				list.Add(CreateRequirement(GetSailSchematicName(shipname, i), 1));
				shipExtension = createExtension(ShipExtension.ShipExtensionType.PaintOne, ShipExtension.ShipType.Drakkar, list, (ShipExtension.ExtensionDecorType)i);
				listDrakkar.Add(shipExtension);
				break;
			case "Holk":
				list.Add(CreateRequirement(GetSailSchematicName(shipname, i), 1));
				shipExtension = createExtension(ShipExtension.ShipExtensionType.PaintOne, ShipExtension.ShipType.Holk, list, (ShipExtension.ExtensionDecorType)i);
				listHolk.Add(shipExtension);
				break;
			}
			if (shipExtension != null)
			{
				shipExtension.descriptionBase = getSailDescription(i);
				createItemDescription(list, shipExtension.descriptionBase);
				this.list.Add(shipExtension);
			}
		}
	}

	private string GetSailSchematicName(string shipname, int number)
	{
		string text = "";
		switch (number)
		{
		case 0:
			text = "Schematic" + shipname + "SailDefault";
			break;
		case 1:
			text = "Schematic" + shipname + "SailBlue";
			break;
		case 2:
			text = "Schematic" + shipname + "SailBlack";
			break;
		case 3:
			text = "Schematic" + shipname + "SailGreen";
			break;
		case 4:
			text = "Schematic" + shipname + "SailTransparent";
			break;
		case 5:
			text = "Schematic" + shipname + "SailWhite";
			break;
		case 6:
			text = "Schematic" + shipname + "SailWolf";
			break;
		case 7:
			text = "Schematic" + shipname + "SailRaven";
			break;
		case 8:
			text = "Schematic" + shipname + "SailHound";
			break;
		case 9:
			text = "Schematic" + shipname + "SailDruid";
			break;
		}
		if (text == "" || text == null)
		{
			Debug.LogError((object)"Something went wrong with schematic name for sail");
		}
		return text;
	}

	private string getSailDescription(int number)
	{
		string result = "";
		switch (number)
		{
		case 0:
			result = "Set default(Red) sail color";
			break;
		case 1:
			res