Decompiled source of TowableBoats v0.1.7

TowableBoats.dll

Decompiled 7 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using SailwindModdingHelper;
using UnityEngine;
using cakeslice;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
internal sealed class ConfigurationManagerAttributes
{
	public delegate void CustomHotkeyDrawerFunc(ConfigEntryBase setting, ref bool isCurrentlyAcceptingInput);

	public bool? ShowRangeAsPercent;

	public Action<ConfigEntryBase> CustomDrawer;

	public CustomHotkeyDrawerFunc CustomHotkeyDrawer;

	public bool? Browsable;

	public string Category;

	public object DefaultValue;

	public bool? HideDefaultButton;

	public bool? HideSettingName;

	public string Description;

	public string DispName;

	public int? Order;

	public bool? ReadOnly;

	public bool? IsAdvanced;

	public Func<object, string> ObjToStr;

	public Func<string, object> StrToObj;
}
namespace TowableBoats;

internal class BoatPerformancePatches
{
	[HarmonyPatch(typeof(BoatHorizon))]
	private static class BoatHorizonPatch
	{
		[HarmonyPatch("UpdateKinematic")]
		[HarmonyPostfix]
		public static void BoatKinematicPatch(BoatHorizon __instance, ref Rigidbody ___rigidbody)
		{
			if (!Object.op_Implicit((Object)(object)((Component)__instance).GetComponentInParent<TowingSet>()) || !___rigidbody.isKinematic || !GameState.sleeping)
			{
				return;
			}
			if (((Component)__instance).GetComponentInParent<TowingSet>().towed)
			{
				Rigidbody towedBy = ((Component)__instance).GetComponentInParent<TowingSet>().GetTowedBy();
				for (int i = 0; i < 5; i++)
				{
					if ((Object)(object)((Component)towedBy).transform == (Object)(object)GameState.currentBoat || (Object)(object)((Component)towedBy).transform == (Object)(object)GameState.lastBoat)
					{
						___rigidbody.isKinematic = false;
						break;
					}
					if (!((Component)towedBy).gameObject.GetComponent<TowingSet>().towed)
					{
						break;
					}
					towedBy = ((Component)towedBy).gameObject.GetComponent<TowingSet>().GetTowedBy();
				}
			}
			if (!((Component)__instance).GetComponentInParent<TowingSet>().towing)
			{
				return;
			}
			List<Rigidbody> towedBoats = ((Component)__instance).GetComponentInParent<TowingSet>().GetTowedBoats();
			for (int j = 0; j < 5; j++)
			{
				foreach (Rigidbody item in towedBoats)
				{
					if ((Object)(object)((Component)item).transform == (Object)(object)GameState.currentBoat || (Object)(object)((Component)item).transform == (Object)(object)GameState.lastBoat)
					{
						___rigidbody.isKinematic = false;
						return;
					}
					if (((Component)item).gameObject.GetComponent<TowingSet>().towing)
					{
						towedBoats = ((Component)item).gameObject.GetComponent<TowingSet>().GetTowedBoats();
					}
				}
			}
		}
	}

	[HarmonyPatch(typeof(BoatPerformanceSwitcher))]
	private static class BoatPerformanceSwitcherPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		public static bool BoatPerformaceSwitcherPatch(BoatPerformanceSwitcher __instance, ref Rigidbody ___body, BoatDamage ___damage)
		{
			bool flag = true;
			if ((Object)(object)GameState.lastBoat == (Object)(object)((Component)__instance).transform || ___damage.sunk)
			{
				return true;
			}
			if ((Object)(object)((Component)__instance).GetComponentInParent<TowingSet>() == (Object)null)
			{
				return true;
			}
			if (((Component)__instance).GetComponentInParent<TowingSet>().towed && Plugin.performanceMode.Value > 0)
			{
				Rigidbody towedBy = ((Component)__instance).GetComponentInParent<TowingSet>().GetTowedBy();
				for (int i = 0; i < Plugin.performanceMode.Value; i++)
				{
					if ((Object)(object)((Component)towedBy).transform == (Object)(object)GameState.currentBoat || (Object)(object)((Component)towedBy).transform == (Object)(object)GameState.lastBoat)
					{
						flag = false;
						break;
					}
					if (!((Component)towedBy).gameObject.GetComponent<TowingSet>().towed)
					{
						break;
					}
					towedBy = ((Component)towedBy).gameObject.GetComponent<TowingSet>().GetTowedBy();
				}
			}
			if (((Component)__instance).GetComponentInParent<TowingSet>().towing)
			{
				List<Rigidbody> towedBoats = ((Component)___body).gameObject.GetComponent<TowingSet>().GetTowedBoats();
				for (int j = 0; j < 5; j++)
				{
					foreach (Rigidbody item in towedBoats)
					{
						if ((Object)(object)((Component)item).transform == (Object)(object)GameState.currentBoat || (Object)(object)((Component)item).transform == (Object)(object)GameState.lastBoat)
						{
							flag = false;
							j = 6;
							break;
						}
						if (((Component)item).gameObject.GetComponent<TowingSet>().towing)
						{
							towedBoats = ((Component)item).gameObject.GetComponent<TowingSet>().GetTowedBoats();
						}
					}
				}
			}
			if (__instance.performanceModeIsOn() != flag)
			{
				Extensions.InvokePrivateMethod((object)__instance, "SetPerformanceMode", new object[1] { flag });
			}
			return false;
		}
	}
}
[StructLayout(LayoutKind.Sequential, Size = 1)]
public readonly struct CleatDefs
{
	public static readonly Array[] brig = new Array[6]
	{
		new object[4]
		{
			"cleat_stern_left",
			(object)new Vector3(-14.9f, 4.36f, 2.23f),
			(object)new Quaternion(0.7071068f, 0f, 0f, 0.7071068f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_stern_right",
			(object)new Vector3(-14.9f, 4.36f, -2.23f),
			(object)new Quaternion(0.7071068f, 0f, 0f, 0.7071068f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_aft_left",
			(object)new Vector3(-2.3f, 3.53f, 3.27f),
			(object)new Quaternion(-0.7058f, 0.0252f, -0.0246f, 0.7075f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_aft_right",
			(object)new Vector3(-2.3f, 3.53f, -3.27f),
			(object)new Quaternion(-0.7058f, 0.0252f, -0.0246f, 0.7075f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_fore_left",
			(object)new Vector3(4.85f, 3.57f, 3.02f),
			(object)new Quaternion(-0.7041f, 0.0292f, 0.0692f, 0.7061f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_fore_right",
			(object)new Vector3(4.85f, 3.57f, -3.02f),
			(object)new Quaternion(-0.7036f, -0.0384f, 0.0012f, 0.7095f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		}
	};

	public static readonly Array[] sanbuq = new Array[6]
	{
		new object[4]
		{
			"cleat_stern_left",
			(object)new Vector3(-12.08f, 2.12f, 1.48f),
			(object)new Quaternion(0.4912f, -0.5087f, -0.5087f, -0.4912f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_stern_right",
			(object)new Vector3(-12.08f, 2.12f, -1.48f),
			(object)new Quaternion(0.5087f, -0.4912f, -0.4912f, -0.5087f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_aft_left",
			(object)new Vector3(-1.4f, 2.12f, 2.46f),
			(object)new Quaternion(0.7071068f, 0f, 0f, -0.7071068f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_aft_right",
			(object)new Vector3(-1.4f, 2.12f, -2.46f),
			(object)new Quaternion(0.7071068f, 0f, 0f, -0.7071068f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_fore_left",
			(object)new Vector3(4.2f, 2.32f, 2.25f),
			(object)new Quaternion(-0.7071f, 0f, 0.0371f, 0.7061f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_fore_right",
			(object)new Vector3(4.2f, 2.32f, -2.25f),
			(object)new Quaternion(-0.7058f, -0.0432f, 0.0062f, 0.7071f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		}
	};

	public static readonly Array[] junk = new Array[6]
	{
		new object[4]
		{
			"cleat_stern_left",
			(object)new Vector3(-9.7f, 2.27f, 0.8f),
			(object)new Quaternion(0.4731f, -0.5255f, -0.5255f, -0.4731f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_stern_right",
			(object)new Vector3(-9.7f, 2.27f, -0.8f),
			(object)new Quaternion(0.5255f, -0.4731f, -0.4731f, -0.5255f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_aft_left",
			(object)new Vector3(1.24f, 1.01f, 2.52f),
			(object)new Quaternion(0.7071068f, 0f, 0f, -0.7071068f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_aft_right",
			(object)new Vector3(1.24f, 1.01f, -2.52f),
			(object)new Quaternion(0.7071068f, 0f, 0f, -0.7071068f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_fore_left",
			(object)new Vector3(7.68f, 1.1f, 2.02f),
			(object)new Quaternion(-0.7071f, 0.0062f, 0.0309f, 0.7064f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		},
		new object[4]
		{
			"cleat_mid_fore_right",
			(object)new Vector3(7.68f, 1.1f, -2.02f),
			(object)new Quaternion(-0.7064f, -0.0309f, -0.0061f, 0.7071f),
			(object)new Vector3(0.6f, 0.6f, 0.6f)
		}
	};

	public static readonly Array[] cog = new Array[2]
	{
		new object[4]
		{
			"cleat_stern_left",
			(object)new Vector3(6.66f, 2.41f, 1.25f),
			(object)new Quaternion(0.5f, -0.5f, -0.5f, -0.5f),
			(object)new Vector3(0.5f, 0.5f, 0.5f)
		},
		new object[4]
		{
			"cleat_stern_right",
			(object)new Vector3(6.66f, 2.41f, -1.25f),
			(object)new Quaternion(0.5f, -0.5f, -0.5f, -0.5f),
			(object)new Vector3(0.5f, 0.5f, 0.5f)
		}
	};

	public static readonly Array[] dhow = new Array[2]
	{
		new object[4]
		{
			"cleat_stern_left",
			(object)new Vector3(-6.4f, 1.815f, 1.53f),
			(object)new Quaternion(-0.0616f, -0.7044f, -0.7044f, -0.0616f),
			(object)new Vector3(0.5f, 0.5f, 0.5f)
		},
		new object[4]
		{
			"cleat_stern_right",
			(object)new Vector3(-6.4f, 1.815f, -1.53f),
			(object)new Quaternion(-0.0616f, -0.7044f, -0.7044f, -0.0616f),
			(object)new Vector3(0.5f, 0.5f, 0.5f)
		}
	};

	public static readonly Array[] kakam = new Array[2]
	{
		new object[4]
		{
			"cleat_stern_left",
			(object)new Vector3(-6.3f, 2.86f, 0.64f),
			(object)new Quaternion(0.6744f, 0.2126f, 0.2126f, -0.6744f),
			(object)new Vector3(0.5f, 0.5f, 0.5f)
		},
		new object[4]
		{
			"cleat_stern_right",
			(object)new Vector3(-6.3f, 2.86f, -0.64f),
			(object)new Quaternion(0.6744f, -0.2126f, -0.2126f, -0.6744f),
			(object)new Vector3(0.5f, 0.5f, 0.5f)
		}
	};
}
internal class MooringPatches
{
	[HarmonyPatch(typeof(GPButtonDockMooring))]
	private static class GPButtonDockMooringPatches
	{
		[HarmonyPatch("Awake")]
		[HarmonyPrefix]
		public static void MooringComponentPatch(GPButtonDockMooring __instance)
		{
			if (!Object.op_Implicit((Object)(object)cleat))
			{
				cleat = ((Component)__instance).gameObject;
			}
		}
	}

	[HarmonyPatch(typeof(MooringSet))]
	private static class MooringSetPatches
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		public static void MooringComponentPatch(MooringSet __instance)
		{
			TowingSet towingManager = ((Component)((Component)__instance).transform.parent).gameObject.AddComponent<TowingSet>();
			((MonoBehaviour)__instance).StartCoroutine(AddCleats(towingManager));
		}

		private static IEnumerator AddCleats(TowingSet towingManager)
		{
			Debug.Log((object)"waiting for cleat");
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)cleat != (Object)null));
			towingManager.AddCleats(cleat);
			Debug.Log((object)"got cleat");
		}
	}

	[HarmonyPatch(typeof(PickupableBoatMooringRope))]
	private static class BoatMooringRopePatches
	{
		[HarmonyPatch("ThrowRopeTo")]
		[HarmonyPrefix]
		public static bool ThrowRopeToPatch(PickupableBoatMooringRope __instance, GPButtonDockMooring mooring, Rigidbody ___boatRigidbody)
		{
			if (((Component)mooring).gameObject.CompareTag("Boat"))
			{
				if ((Object)(object)((Component)___boatRigidbody).transform != (Object)(object)((Component)mooring).GetComponentInParent<TowingSet>().GetBoatTransform() && (!((Component)__instance).GetComponentInParent<TowingSet>().towed || (Object)(object)((Component)mooring).gameObject.GetComponentInParent<TowingSet>().GetBoatTransform() == (Object)(object)((Component)((Component)___boatRigidbody).gameObject.GetComponentInParent<TowingSet>().GetTowedBy()).transform))
				{
					__instance.MoorTo(mooring);
					((Component)___boatRigidbody).GetComponentInParent<TowingSet>().UpdateTowedBy();
					((Component)mooring).GetComponentInParent<TowingSet>().UpdateTowedBoats();
				}
				return false;
			}
			return true;
		}

		[HarmonyPatch("Unmoor")]
		[HarmonyPrefix]
		public static void UnmoorPatch(SpringJoint ___mooredToSpring, ref TowingSet __state)
		{
			if ((Object)(object)___mooredToSpring != (Object)null && Object.op_Implicit((Object)(object)((Component)___mooredToSpring).GetComponentInParent<TowingSet>()))
			{
				__state = ((Component)___mooredToSpring).GetComponentInParent<TowingSet>();
			}
		}

		[HarmonyPatch("Unmoor")]
		[HarmonyPostfix]
		public static void UnmoorPostPatch(TowingSet __state, Rigidbody ___boatRigidbody)
		{
			if (Object.op_Implicit((Object)(object)__state))
			{
				__state.UpdateTowedBoats();
			}
			((Component)___boatRigidbody).GetComponent<TowingSet>().UpdateTowedBy();
		}
	}

	[HarmonyPatch(typeof(BoatMooringRopes))]
	private static class BoatMooringRopesPatches
	{
		[HarmonyPatch("UnmoorAllRopes")]
		[HarmonyPostfix]
		public static void UnmoorAllRopesPatch(BoatMooringRopes __instance)
		{
			if (!Object.op_Implicit((Object)(object)((Component)__instance).GetComponentInParent<TowingSet>()) || ((Component)__instance).GetComponentInParent<TowingSet>().GetCleats() == null)
			{
				return;
			}
			GPButtonDockMooring[] cleats = ((Component)__instance).GetComponentInParent<TowingSet>().GetCleats();
			foreach (GPButtonDockMooring val in cleats)
			{
				if (Object.op_Implicit((Object)(object)((Component)val).GetComponentInChildren<PickupableBoatMooringRope>()))
				{
					PickupableBoatMooringRope componentInChildren = ((Component)val).GetComponentInChildren<PickupableBoatMooringRope>();
					Debug.Log((object)"found a thing");
					componentInChildren.Unmoor();
					componentInChildren.ResetRopePos();
				}
			}
		}
	}

	private static GameObject cleat;
}
[BepInPlugin("com.nandbrew.towableboats", "Towable Boats", "0.1.7")]
[BepInDependency("com.app24.sailwindmoddinghelper", "2.0.3")]
public class Plugin : BaseUnityPlugin
{
	public const string PLUGIN_ID = "com.nandbrew.towableboats";

	public const string PLUGIN_NAME = "Towable Boats";

	public const string PLUGIN_VERSION = "0.1.7";

	internal static ConfigEntry<int> performanceMode;

	internal static ConfigEntry<bool> drag;

	internal static ConfigEntry<bool> smallBoats;

	internal static Plugin instance;

	private void Awake()
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Expected O, but got Unknown
		//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Expected O, but got Unknown
		instance = this;
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.nandbrew.towableboats");
		performanceMode = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Performance mode", 1, new ConfigDescription("How many boats in the chain behind the current boat get full physics", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 5), new object[1]
		{
			new ConfigurationManagerAttributes
			{
				Order = 2
			}
		}));
		drag = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Drag", false, new ConfigDescription("Allow boats to pull on the boat towing them (buggy)", (AcceptableValueBase)null, new object[1]
		{
			new ConfigurationManagerAttributes
			{
				IsAdvanced = true
			}
		}));
		smallBoats = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Small boats can tow", true, new ConfigDescription("Add anchor points to small boats", (AcceptableValueBase)null, new object[1]
		{
			new ConfigurationManagerAttributes
			{
				IsAdvanced = false,
				Order = 1
			}
		}));
	}
}
internal class SleepPatches
{
	[HarmonyPatch(typeof(Sleep), "CurrentBoatIsMoored")]
	private static class IsMooredPatch
	{
		[HarmonyPostfix]
		public static void Postfix(ref bool __result)
		{
			if (Object.op_Implicit((Object)(object)GameState.currentBoat) && __result && ((Component)GameState.currentBoat).GetComponentInParent<TowingSet>().towed)
			{
				__result = false;
			}
		}
	}
}
internal class TowingSet : MonoBehaviour
{
	private Transform mooringSetTransform;

	private Transform boatTransform;

	private Rigidbody towedBy;

	private List<Rigidbody> towedBoats;

	public bool towing;

	public bool towed;

	private GPButtonDockMooring[] cleats;

	public bool smallBoat;

	public Transform GetBoatTransform()
	{
		return boatTransform;
	}

	public List<Rigidbody> GetTowedBoats()
	{
		return towedBoats;
	}

	public Rigidbody GetTowedBy()
	{
		return towedBy;
	}

	public GPButtonDockMooring[] GetCleats()
	{
		return cleats;
	}

	private void Awake()
	{
		mooringSetTransform = ((Component)((Component)this).gameObject.GetComponentInChildren<MooringSet>()).transform.GetChild(0);
		boatTransform = ((Component)this).transform;
	}

	private void FixedUpdate()
	{
		//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)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		if (cleats != null && Plugin.drag.Value)
		{
			for (int i = 0; i < cleats.Length; i++)
			{
				if (Object.op_Implicit((Object)(object)((Component)((Component)cleats[i]).transform).GetComponentInChildren<PickupableBoatMooringRope>()))
				{
					Vector3 val = ((Joint)((Component)((Component)cleats[i]).transform).GetComponentInChildren<SpringJoint>()).currentForce;
					if (((Component)((Joint)((Component)((Component)cleats[i]).transform).GetComponentInChildren<SpringJoint>()).connectedBody).gameObject.GetComponent<BoatPerformanceSwitcher>().performanceModeIsOn())
					{
						val /= 10f;
					}
					((Component)this).gameObject.GetComponent<Rigidbody>().AddForceAtPosition(val / 3f, ((Component)cleats[i]).transform.position, (ForceMode)0);
				}
			}
		}
		if (GameState.justStarted)
		{
			UpdateTowedBoats();
			UpdateTowedBy();
		}
		if (!smallBoat)
		{
			return;
		}
		GPButtonDockMooring[] array = cleats;
		foreach (GPButtonDockMooring val2 in array)
		{
			if (!Plugin.smallBoats.Value)
			{
				PickupableBoatMooringRope componentInChildren = ((Component)val2).GetComponentInChildren<PickupableBoatMooringRope>();
				if (componentInChildren != null)
				{
					componentInChildren.Unmoor();
					componentInChildren.ResetRopePos();
				}
			}
			((Component)val2).gameObject.SetActive(Plugin.smallBoats.Value);
		}
	}

	public void UpdateTowedBoats()
	{
		towedBoats = new List<Rigidbody>();
		bool flag = false;
		if (cleats != null)
		{
			for (int i = 0; i < cleats.Length; i++)
			{
				if ((Object)(object)((Component)((Component)cleats[i]).transform).GetComponentInChildren<PickupableBoatMooringRope>() != (Object)null)
				{
					towedBoats.Add(((Component)((Component)cleats[i]).transform).GetComponentInChildren<PickupableBoatMooringRope>().GetBoatRigidbody());
					flag = true;
				}
			}
		}
		towing = flag;
	}

	public void UpdateTowedBy()
	{
		bool flag = false;
		towedBy = null;
		PickupableBoatMooringRope[] ropes = ((Component)this).gameObject.GetComponent<BoatMooringRopes>().ropes;
		for (int i = 0; i < ropes.Length; i++)
		{
			if (ropes[i].IsMoored() && ((Component)Extensions.GetPrivateField<SpringJoint>((object)ropes[i], "mooredToSpring")).gameObject.CompareTag("Boat"))
			{
				towedBy = ((Component)((Component)((Component)Extensions.GetPrivateField<SpringJoint>((object)ropes[i], "mooredToSpring")).transform).GetComponentInParent<TowingSet>().GetBoatTransform()).GetComponent<Rigidbody>();
				flag = true;
			}
		}
		towed = flag;
	}

	public void AddCleats(GameObject refCleat)
	{
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_0101: Expected O, but got Unknown
		//IL_0121: Unknown result type (might be due to invalid IL or missing references)
		//IL_0129: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		Array[] array;
		if (((Object)boatTransform).name.Contains("medi medium"))
		{
			array = CleatDefs.brig;
		}
		else if (((Object)boatTransform).name.Contains("dhow medium"))
		{
			array = CleatDefs.sanbuq;
		}
		else if (((Object)boatTransform).name.Contains("junk medium"))
		{
			array = CleatDefs.junk;
		}
		else if (((Object)boatTransform).name.Contains("medi small"))
		{
			array = CleatDefs.cog;
			smallBoat = true;
		}
		else if (((Object)boatTransform).name.Contains("dhow small"))
		{
			array = CleatDefs.dhow;
			smallBoat = true;
		}
		else
		{
			if (!((Object)boatTransform).name.Contains("junk small"))
			{
				return;
			}
			array = CleatDefs.kakam;
			smallBoat = true;
		}
		GameObject val = Object.Instantiate<GameObject>(new GameObject(), mooringSetTransform.position, mooringSetTransform.rotation, mooringSetTransform.parent);
		((Object)val).name = "towing set";
		for (int i = 0; i < array.Length; i++)
		{
			object[] array2 = array[i] as object[];
			GameObject val2 = Object.Instantiate<GameObject>(refCleat, (Vector3)array2[1], (Quaternion)array2[2]);
			val2.transform.SetParent(val.transform, false);
			((Object)val2).name = (string)array2[0];
			val2.transform.localScale = (Vector3)array2[3];
			val2.tag = "Boat";
			Outline[] components = val2.GetComponents<Outline>();
			foreach (Outline val3 in components)
			{
				if (val3 != Extensions.GetPrivateField((object)val2, "outline"))
				{
					Object.Destroy((Object)(object)val3);
				}
			}
		}
		cleats = val.GetComponentsInChildren<GPButtonDockMooring>();
	}
}