Decompiled source of Lethal Croc v1.0.0

LethalCroc.dll

Decompiled 10 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EZhex1991.EZSoftBone;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ModelReplacement;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("LethalCroc")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LethalCroc")]
[assembly: AssemblyTitle("LethalCroc")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace EZhex1991.EZSoftBone
{
	public class EZCurveRectAttribute : PropertyAttribute
	{
		public Rect rect;

		public Color color = Color.green;

		public EZCurveRectAttribute()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			rect = new Rect(0f, 0f, 1f, 1f);
		}

		public EZCurveRectAttribute(Rect rect)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			this.rect = rect;
		}

		public EZCurveRectAttribute(float x, float y, float width, float height)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			rect = new Rect(x, y, width, height);
		}

		public EZCurveRectAttribute(Rect rect, Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			this.rect = rect;
			this.color = color;
		}

		public EZCurveRectAttribute(float x, float y, float width, float height, Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			rect = new Rect(x, y, width, height);
			this.color = color;
		}
	}
	public class EZNestedEditorAttribute : PropertyAttribute
	{
	}
	public delegate Vector3 CustomForce(float normalizedLength);
	public class EZSoftBone : MonoBehaviour
	{
		public enum UnificationMode
		{
			None,
			Rooted,
			Unified
		}

		public enum DeltaTimeMode
		{
			DeltaTime,
			UnscaledDeltaTime,
			Constant
		}

		private class Bone
		{
			public Bone parentBone;

			public Vector3 localPosition;

			public Quaternion localRotation;

			public Bone leftBone;

			public Vector3 leftPosition;

			public Bone rightBone;

			public Vector3 rightPosition;

			public List<Bone> childBones = new List<Bone>();

			public Transform transform;

			public Vector3 worldPosition;

			public Transform systemSpace;

			public Vector3 systemPosition;

			public int depth;

			public float boneLength;

			public float treeLength;

			public float normalizedLength;

			public float radius;

			public float damping;

			public float stiffness;

			public float resistance;

			public float slackness;

			public Vector3 speed;

			public Bone(Transform systemSpace, Transform transform, IEnumerable<Transform> endBones, int startDepth, int depth, float nodeLength, float boneLength)
			{
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_0050: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
				this.transform = transform;
				this.systemSpace = systemSpace;
				worldPosition = transform.position;
				systemPosition = (((Object)(object)systemSpace == (Object)null) ? worldPosition : systemSpace.InverseTransformPoint(worldPosition));
				localPosition = transform.localPosition;
				localRotation = transform.localRotation;
				this.depth = depth;
				if (depth > startDepth)
				{
					this.boneLength = boneLength + nodeLength;
				}
				treeLength = Mathf.Max(treeLength, this.boneLength);
				if (transform.childCount > 0 && !endBones.Contains(transform))
				{
					for (int i = 0; i < transform.childCount; i++)
					{
						Transform child = transform.GetChild(i);
						if (((Component)child).gameObject.activeSelf)
						{
							Bone bone = new Bone(systemSpace, child, endBones, startDepth, depth + 1, Vector3.Distance(child.position, transform.position), this.boneLength)
							{
								parentBone = this
							};
							childBones.Add(bone);
							treeLength = Mathf.Max(treeLength, bone.treeLength);
						}
					}
				}
				normalizedLength = ((treeLength == 0f) ? 0f : (this.boneLength / treeLength));
			}

			public void SetTreeLength()
			{
				SetTreeLength(treeLength);
			}

			public void SetTreeLength(float treeLength)
			{
				this.treeLength = treeLength;
				normalizedLength = ((treeLength == 0f) ? 0f : (boneLength / treeLength));
				for (int i = 0; i < childBones.Count; i++)
				{
					childBones[i].SetTreeLength(treeLength);
				}
			}

			public void SetLeftSibling(Bone left)
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				if (left != this && left != rightBone)
				{
					leftBone = left;
					leftPosition = transform.InverseTransformPoint(left.worldPosition);
				}
			}

			public void SetRightSibling(Bone right)
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				if (right != this && right != leftBone)
				{
					rightBone = right;
					rightPosition = transform.InverseTransformPoint(right.worldPosition);
				}
			}

			public void Inflate(float baseRadius, AnimationCurve radiusCurve)
			{
				radius = radiusCurve.Evaluate(normalizedLength) * baseRadius;
				for (int i = 0; i < childBones.Count; i++)
				{
					childBones[i].Inflate(baseRadius, radiusCurve);
				}
			}

			public void Inflate(float baseRadius, AnimationCurve radiusCurve, EZSoftBoneMaterial material)
			{
				radius = radiusCurve.Evaluate(normalizedLength) * baseRadius;
				damping = material.GetDamping(normalizedLength);
				stiffness = material.GetStiffness(normalizedLength);
				resistance = material.GetResistance(normalizedLength);
				slackness = material.GetSlackness(normalizedLength);
				for (int i = 0; i < childBones.Count; i++)
				{
					childBones[i].Inflate(baseRadius, radiusCurve, material);
				}
			}

			public void RevertTransforms(int startDepth)
			{
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				if (depth > startDepth)
				{
					transform.localPosition = localPosition;
					transform.localRotation = localRotation;
				}
				for (int i = 0; i < childBones.Count; i++)
				{
					childBones[i].RevertTransforms(startDepth);
				}
			}

			public void UpdateTransform(bool siblingRotationConstraints, int startDepth)
			{
				//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_0043: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0113: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Unknown result type (might be due to invalid IL or missing references)
				//IL_012a: Unknown result type (might be due to invalid IL or missing references)
				//IL_012f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0134: Unknown result type (might be due to invalid IL or missing references)
				//IL_0139: Unknown result type (might be due to invalid IL or missing references)
				//IL_013b: Unknown result type (might be due to invalid IL or missing references)
				//IL_013d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_014b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0150: Unknown result type (might be due to invalid IL or missing references)
				//IL_0152: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				//IL_0095: Unknown result type (might be due to invalid IL or missing references)
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00da: Unknown result type (might be due to invalid IL or missing references)
				//IL_00db: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0167: Unknown result type (might be due to invalid IL or missing references)
				//IL_0178: Unknown result type (might be due to invalid IL or missing references)
				//IL_017e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0183: Unknown result type (might be due to invalid IL or missing references)
				//IL_0188: Unknown result type (might be due to invalid IL or missing references)
				//IL_018d: Unknown result type (might be due to invalid IL or missing references)
				//IL_018f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0191: Unknown result type (might be due to invalid IL or missing references)
				//IL_0196: Unknown result type (might be due to invalid IL or missing references)
				//IL_019f: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
				if (depth > startDepth)
				{
					if (childBones.Count == 1)
					{
						Bone bone = childBones[0];
						Transform obj = transform;
						obj.rotation *= Quaternion.FromToRotation(bone.localPosition, transform.InverseTransformVector(bone.worldPosition - worldPosition));
						if (siblingRotationConstraints)
						{
							if (leftBone != null && rightBone != null)
							{
								Vector3 val = leftPosition;
								Vector3 val2 = transform.InverseTransformVector(leftBone.worldPosition - worldPosition);
								Quaternion val3 = Quaternion.FromToRotation(val, val2);
								Vector3 val4 = rightPosition;
								Vector3 val5 = transform.InverseTransformVector(rightBone.worldPosition - worldPosition);
								Quaternion val6 = Quaternion.FromToRotation(val4, val5);
								Transform obj2 = transform;
								obj2.rotation *= Quaternion.Lerp(val3, val6, 0.5f);
							}
							else if (leftBone != null)
							{
								Vector3 val7 = leftPosition;
								Vector3 val8 = transform.InverseTransformVector(leftBone.worldPosition - worldPosition);
								Quaternion val9 = Quaternion.FromToRotation(val7, val8);
								Transform obj3 = transform;
								obj3.rotation *= val9;
							}
							else if (rightBone != null)
							{
								Vector3 val10 = rightPosition;
								Vector3 val11 = transform.InverseTransformVector(rightBone.worldPosition - worldPosition);
								Quaternion val12 = Quaternion.FromToRotation(val10, val11);
								Transform obj4 = transform;
								obj4.rotation *= val12;
							}
						}
					}
					transform.position = worldPosition;
				}
				if ((Object)(object)systemSpace != (Object)null)
				{
					systemPosition = systemSpace.InverseTransformPoint(worldPosition);
				}
				for (int i = 0; i < childBones.Count; i++)
				{
					childBones[i].UpdateTransform(siblingRotationConstraints, startDepth);
				}
			}

			public void SetRestState()
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: 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)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0039: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				worldPosition = transform.position;
				systemPosition = (((Object)(object)systemSpace == (Object)null) ? worldPosition : systemSpace.InverseTransformPoint(worldPosition));
				speed = Vector3.zero;
				for (int i = 0; i < childBones.Count; i++)
				{
					childBones[i].SetRestState();
				}
			}

			public void UpdateSpace()
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)systemSpace == (Object)null))
				{
					worldPosition = systemSpace.TransformPoint(systemPosition);
					for (int i = 0; i < childBones.Count; i++)
					{
						childBones[i].UpdateSpace();
					}
				}
			}
		}

		public static readonly float DeltaTime_Min = 1E-06f;

		[SerializeField]
		private List<Transform> m_RootBones;

		[SerializeField]
		private List<Transform> m_EndBones;

		[SerializeField]
		private EZSoftBoneMaterial m_Material;

		private EZSoftBoneMaterial m_InstanceMaterial;

		[SerializeField]
		private int m_StartDepth;

		[SerializeField]
		private UnificationMode m_SiblingConstraints;

		[SerializeField]
		private bool m_ClosedSiblings;

		[SerializeField]
		private bool m_SiblingRotationConstraints = true;

		[SerializeField]
		private UnificationMode m_LengthUnification;

		[SerializeField]
		private LayerMask m_CollisionLayers = LayerMask.op_Implicit(1);

		[SerializeField]
		private List<Collider> m_ExtraColliders = new List<Collider>();

		[SerializeField]
		private float m_Radius;

		[SerializeField]
		[EZCurveRect(0f, 0f, 1f, 1f)]
		private AnimationCurve m_RadiusCurve = AnimationCurve.Linear(0f, 1f, 1f, 1f);

		[SerializeField]
		private DeltaTimeMode m_DeltaTimeMode;

		[SerializeField]
		private float m_ConstantDeltaTime = 0.03f;

		[SerializeField]
		[Range(1f, 10f)]
		private int m_Iterations = 1;

		[SerializeField]
		private float m_SleepThreshold = 0.005f;

		[SerializeField]
		private Transform m_GravityAligner;

		[SerializeField]
		private Vector3 m_Gravity;

		[SerializeField]
		private EZSoftBoneForceField m_ForceModule;

		[SerializeField]
		private float m_ForceScale = 1f;

		[SerializeField]
		private Transform m_SimulateSpace;

		public CustomForce customForce;

		private List<Bone> m_Structures = new List<Bone>();

		public List<Transform> rootBones
		{
			get
			{
				return m_RootBones;
			}
			set
			{
				m_RootBones = value;
			}
		}

		public List<Transform> endBones => m_EndBones;

		public EZSoftBoneMaterial sharedMaterial
		{
			get
			{
				if ((Object)(object)m_Material == (Object)null)
				{
					m_Material = EZSoftBoneMaterial.defaultMaterial;
				}
				return m_Material;
			}
			set
			{
				m_Material = value;
			}
		}

		public EZSoftBoneMaterial material
		{
			get
			{
				if ((Object)(object)m_InstanceMaterial == (Object)null)
				{
					m_InstanceMaterial = (m_Material = Object.Instantiate<EZSoftBoneMaterial>(sharedMaterial));
				}
				return m_InstanceMaterial;
			}
			set
			{
				m_InstanceMaterial = (m_Material = value);
			}
		}

		public int startDepth
		{
			get
			{
				return m_StartDepth;
			}
			set
			{
				m_StartDepth = value;
			}
		}

		public UnificationMode siblingConstraints
		{
			get
			{
				return m_SiblingConstraints;
			}
			set
			{
				m_SiblingConstraints = value;
			}
		}

		public bool closedSiblings
		{
			get
			{
				return m_ClosedSiblings;
			}
			set
			{
				m_ClosedSiblings = value;
			}
		}

		public bool siblingRotationConstraints
		{
			get
			{
				return m_SiblingRotationConstraints;
			}
			set
			{
				m_SiblingRotationConstraints = value;
			}
		}

		public UnificationMode lengthUnification
		{
			get
			{
				return m_LengthUnification;
			}
			set
			{
				m_LengthUnification = value;
			}
		}

		public LayerMask collisionLayers
		{
			get
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return m_CollisionLayers;
			}
			set
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				m_CollisionLayers = value;
			}
		}

		public List<Collider> extraColliders => m_ExtraColliders;

		public float radius
		{
			get
			{
				return m_Radius;
			}
			set
			{
				m_Radius = value;
			}
		}

		public AnimationCurve radiusCurve => m_RadiusCurve;

		public DeltaTimeMode deltaTimeMode
		{
			get
			{
				return m_DeltaTimeMode;
			}
			set
			{
				m_DeltaTimeMode = value;
			}
		}

		public float constantDeltaTime
		{
			get
			{
				return m_ConstantDeltaTime;
			}
			set
			{
				m_ConstantDeltaTime = value;
			}
		}

		public int iterations
		{
			get
			{
				return m_Iterations;
			}
			set
			{
				m_Iterations = value;
			}
		}

		public float sleepThreshold
		{
			get
			{
				return m_SleepThreshold;
			}
			set
			{
				m_SleepThreshold = Mathf.Max(0f, value);
			}
		}

		public Transform gravityAligner
		{
			get
			{
				return m_GravityAligner;
			}
			set
			{
				m_GravityAligner = value;
			}
		}

		public Vector3 gravity
		{
			get
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return m_Gravity;
			}
			set
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				m_Gravity = value;
			}
		}

		public EZSoftBoneForceField forceModule
		{
			get
			{
				return m_ForceModule;
			}
			set
			{
				m_ForceModule = value;
			}
		}

		public float forceScale
		{
			get
			{
				return m_ForceScale;
			}
			set
			{
				m_ForceScale = value;
			}
		}

		public Transform simulateSpace
		{
			get
			{
				return m_SimulateSpace;
			}
			set
			{
				m_SimulateSpace = value;
			}
		}

		public float globalRadius { get; private set; }

		public Vector3 globalForce { get; private set; }

		private void Awake()
		{
			InitStructures();
		}

		private void OnEnable()
		{
			SetRestState();
		}

		private void Update()
		{
			RevertTransforms(startDepth);
		}

		private void LateUpdate()
		{
			switch (deltaTimeMode)
			{
			case DeltaTimeMode.DeltaTime:
				UpdateStructures(Time.deltaTime);
				break;
			case DeltaTimeMode.UnscaledDeltaTime:
				UpdateStructures(Time.unscaledDeltaTime);
				break;
			case DeltaTimeMode.Constant:
				UpdateStructures(constantDeltaTime);
				break;
			}
			UpdateTransforms();
		}

		private void OnDisable()
		{
			RevertTransforms(startDepth);
		}

		public void RevertTransforms()
		{
			RevertTransforms(startDepth);
		}

		public void RevertTransforms(int startDepth)
		{
			for (int i = 0; i < m_Structures.Count; i++)
			{
				m_Structures[i].RevertTransforms(startDepth);
			}
		}

		public void InitStructures()
		{
			CreateBones();
			SetSiblings();
			SetTreeLength();
			RefreshRadius();
		}

		public void SetRestState()
		{
			for (int i = 0; i < m_Structures.Count; i++)
			{
				m_Structures[i].SetRestState();
			}
		}

		private void CreateBones()
		{
			m_Structures.Clear();
			if (rootBones == null || rootBones.Count == 0)
			{
				return;
			}
			for (int i = 0; i < rootBones.Count; i++)
			{
				if (!((Object)(object)rootBones[i] == (Object)null))
				{
					Bone item = new Bone(simulateSpace, rootBones[i], endBones, startDepth, 0, 0f, 0f);
					m_Structures.Add(item);
				}
			}
		}

		private void SetSiblings()
		{
			if (siblingConstraints == UnificationMode.Rooted)
			{
				for (int i = 0; i < m_Structures.Count; i++)
				{
					Queue<Bone> queue = new Queue<Bone>();
					queue.Enqueue(m_Structures[i]);
					SetSiblingsByDepth(queue, closedSiblings);
				}
			}
			else if (siblingConstraints == UnificationMode.Unified)
			{
				Queue<Bone> queue2 = new Queue<Bone>();
				for (int j = 0; j < m_Structures.Count; j++)
				{
					queue2.Enqueue(m_Structures[j]);
				}
				if (queue2.Count > 0)
				{
					SetSiblingsByDepth(queue2, closedSiblings);
				}
			}
		}

		private void SetSiblingsByDepth(Queue<Bone> bones, bool closed)
		{
			Bone bone = bones.Dequeue();
			for (int i = 0; i < bone.childBones.Count; i++)
			{
				bones.Enqueue(bone.childBones[i]);
			}
			Bone bone2 = bone;
			Bone bone3 = null;
			while (bones.Count > 0)
			{
				bone3 = bones.Dequeue();
				for (int j = 0; j < bone3.childBones.Count; j++)
				{
					bones.Enqueue(bone3.childBones[j]);
				}
				if (bone2.depth == bone3.depth)
				{
					bone2.SetRightSibling(bone3);
					bone3.SetLeftSibling(bone2);
				}
				else
				{
					if (closed)
					{
						bone2.SetRightSibling(bone);
						bone.SetLeftSibling(bone2);
					}
					bone = bone3;
				}
				bone2 = bone3;
			}
			if (bone3 != null && closed)
			{
				bone.SetLeftSibling(bone3);
				bone3.SetRightSibling(bone);
			}
		}

		private void SetTreeLength()
		{
			if (lengthUnification == UnificationMode.Rooted)
			{
				for (int i = 0; i < m_Structures.Count; i++)
				{
					m_Structures[i].SetTreeLength();
				}
			}
			else if (lengthUnification == UnificationMode.Unified)
			{
				float num = 0f;
				for (int j = 0; j < m_Structures.Count; j++)
				{
					num = Mathf.Max(num, m_Structures[j].treeLength);
				}
				for (int k = 0; k < m_Structures.Count; k++)
				{
					m_Structures[k].SetTreeLength(num);
				}
			}
		}

		public void RefreshRadius()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			globalRadius = ((Component)this).transform.lossyScale.Abs().Max() * radius;
			for (int i = 0; i < m_Structures.Count; i++)
			{
				m_Structures[i].Inflate(globalRadius, radiusCurve);
			}
		}

		private void UpdateStructures(float deltaTime)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: 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)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			if (deltaTime <= DeltaTime_Min)
			{
				return;
			}
			globalRadius = ((Component)this).transform.lossyScale.Abs().Max() * radius;
			for (int i = 0; i < m_Structures.Count; i++)
			{
				m_Structures[i].Inflate(globalRadius, radiusCurve, sharedMaterial);
				if ((Object)(object)simulateSpace != (Object)null)
				{
					m_Structures[i].UpdateSpace();
				}
			}
			globalForce = gravity;
			if ((Object)(object)gravityAligner != (Object)null)
			{
				Vector3 val = gravityAligner.TransformDirection(gravity);
				Vector3 normalized = ((Vector3)(ref val)).normalized;
				val = gravity;
				Vector3 normalized2 = ((Vector3)(ref val)).normalized;
				float num = Mathf.Acos(Vector3.Dot(normalized, normalized2)) / MathF.PI;
				globalForce *= num;
			}
			deltaTime /= (float)iterations;
			for (int j = 0; j < iterations; j++)
			{
				for (int k = 0; k < m_Structures.Count; k++)
				{
					UpdateBones(m_Structures[k], deltaTime);
				}
			}
		}

		private void UpdateBones(Bone bone, float deltaTime)
		{
			//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_022d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_028e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0293: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0325: Unknown result type (might be due to invalid IL or missing references)
			if (bone.depth > startDepth)
			{
				Vector3 val;
				Vector3 val2 = (val = bone.worldPosition);
				Vector3 val3 = globalForce;
				if ((Object)(object)forceModule != (Object)null && ((Behaviour)forceModule).isActiveAndEnabled)
				{
					val3 += forceModule.GetForce(bone.normalizedLength) * forceScale;
				}
				if (customForce != null)
				{
					val3 += customForce(bone.normalizedLength);
				}
				val3.x *= ((Component)this).transform.localScale.x;
				val3.y *= ((Component)this).transform.localScale.y;
				val3.z *= ((Component)this).transform.localScale.z;
				bone.speed += val3 * (1f - bone.resistance) / (float)iterations;
				bone.speed *= 1f - bone.damping;
				if (((Vector3)(ref bone.speed)).sqrMagnitude > sleepThreshold)
				{
					val += bone.speed * deltaTime;
				}
				Vector3 val4 = bone.parentBone.worldPosition - bone.parentBone.transform.position;
				Vector3 val5 = bone.parentBone.transform.TransformPoint(bone.localPosition) + val4;
				val = Vector3.Lerp(val, val5, bone.stiffness / (float)iterations);
				Vector3 val6 = val - bone.parentBone.worldPosition;
				Vector3 normalized = ((Vector3)(ref val6)).normalized;
				val6 = bone.parentBone.transform.TransformVector(bone.localPosition);
				float magnitude = ((Vector3)(ref val6)).magnitude;
				val5 = bone.parentBone.worldPosition + normalized * magnitude;
				int num = 1;
				if (siblingConstraints != 0)
				{
					if (bone.leftBone != null)
					{
						val6 = val - bone.leftBone.worldPosition;
						Vector3 normalized2 = ((Vector3)(ref val6)).normalized;
						val6 = bone.transform.TransformVector(bone.leftPosition);
						float magnitude2 = ((Vector3)(ref val6)).magnitude;
						val5 += bone.leftBone.worldPosition + normalized2 * magnitude2;
						num++;
					}
					if (bone.rightBone != null)
					{
						val6 = val - bone.rightBone.worldPosition;
						Vector3 normalized3 = ((Vector3)(ref val6)).normalized;
						val6 = bone.transform.TransformVector(bone.rightPosition);
						float magnitude3 = ((Vector3)(ref val6)).magnitude;
						val5 += bone.rightBone.worldPosition + normalized3 * magnitude3;
						num++;
					}
				}
				val5 /= (float)num;
				val = Vector3.Lerp(val5, val, bone.slackness / (float)iterations);
				if (bone.radius > 0f)
				{
					foreach (EZSoftBoneColliderBase enabledCollider in EZSoftBoneColliderBase.EnabledColliders)
					{
						if ((Object)(object)bone.transform != (Object)(object)((Component)enabledCollider).transform && collisionLayers.Contains(((Component)enabledCollider).gameObject.layer))
						{
							enabledCollider.Collide(ref val, bone.radius);
						}
					}
					foreach (Collider extraCollider in extraColliders)
					{
						if ((Object)(object)bone.transform != (Object)(object)((Component)extraCollider).transform && extraCollider.enabled)
						{
							EZSoftBoneUtility.PointOutsideCollider(ref val, extraCollider, bone.radius);
						}
					}
				}
				bone.speed = (bone.speed + (val - val2) / deltaTime) * 0.5f;
				bone.worldPosition = val;
			}
			else
			{
				bone.worldPosition = bone.transform.position;
			}
			for (int i = 0; i < bone.childBones.Count; i++)
			{
				UpdateBones(bone.childBones[i], deltaTime);
			}
		}

		private void UpdateTransforms()
		{
			for (int i = 0; i < m_Structures.Count; i++)
			{
				m_Structures[i].UpdateTransform(siblingRotationConstraints, startDepth);
			}
		}
	}
	[RequireComponent(typeof(Collider))]
	public class EZSoftBoneCollider : EZSoftBoneColliderBase
	{
		[SerializeField]
		private Collider m_ReferenceCollider;

		[SerializeField]
		private float m_Margin;

		[SerializeField]
		private bool m_InsideMode;

		public Collider referenceCollider
		{
			get
			{
				if ((Object)(object)m_ReferenceCollider == (Object)null)
				{
					m_ReferenceCollider = ((Component)this).GetComponent<Collider>();
				}
				return m_ReferenceCollider;
			}
		}

		public float margin
		{
			get
			{
				return m_Margin;
			}
			set
			{
				m_Margin = value;
			}
		}

		public bool insideMode
		{
			get
			{
				return m_InsideMode;
			}
			set
			{
				m_InsideMode = value;
			}
		}

		public override void Collide(ref Vector3 position, float spacing)
		{
			if (referenceCollider is SphereCollider)
			{
				Collider obj = referenceCollider;
				SphereCollider collider = (SphereCollider)(object)((obj is SphereCollider) ? obj : null);
				if (insideMode)
				{
					EZSoftBoneUtility.PointInsideSphere(ref position, collider, spacing + margin);
				}
				else
				{
					EZSoftBoneUtility.PointOutsideSphere(ref position, collider, spacing + margin);
				}
			}
			else if (referenceCollider is CapsuleCollider)
			{
				Collider obj2 = referenceCollider;
				CapsuleCollider collider2 = (CapsuleCollider)(object)((obj2 is CapsuleCollider) ? obj2 : null);
				if (insideMode)
				{
					EZSoftBoneUtility.PointInsideCapsule(ref position, collider2, spacing + margin);
				}
				else
				{
					EZSoftBoneUtility.PointOutsideCapsule(ref position, collider2, spacing + margin);
				}
			}
			else if (referenceCollider is BoxCollider)
			{
				Collider obj3 = referenceCollider;
				BoxCollider collider3 = (BoxCollider)(object)((obj3 is BoxCollider) ? obj3 : null);
				if (insideMode)
				{
					EZSoftBoneUtility.PointInsideBox(ref position, collider3, spacing + margin);
				}
				else
				{
					EZSoftBoneUtility.PointOutsideBox(ref position, collider3, spacing + margin);
				}
			}
			else if (referenceCollider is MeshCollider)
			{
				Collider obj4 = referenceCollider;
				if (!CheckConvex((MeshCollider)(object)((obj4 is MeshCollider) ? obj4 : null)))
				{
					Debug.LogError((object)"Non-Convex Mesh Collider is not supported", (Object)(object)this);
					((Behaviour)this).enabled = false;
				}
				else if (insideMode)
				{
					Debug.LogError((object)"Inside Mode On Mesh Collider is not supported", (Object)(object)this);
					insideMode = false;
				}
				else
				{
					EZSoftBoneUtility.PointOutsideCollider(ref position, referenceCollider, spacing + margin);
				}
			}
		}

		private bool CheckConvex(MeshCollider meshCollider)
		{
			if ((Object)(object)meshCollider.sharedMesh != (Object)null)
			{
				return meshCollider.convex;
			}
			return false;
		}

		private void Reset()
		{
			m_ReferenceCollider = ((Component)this).GetComponent<Collider>();
		}
	}
	public abstract class EZSoftBoneColliderBase : MonoBehaviour
	{
		public static HashSet<EZSoftBoneColliderBase> EnabledColliders = new HashSet<EZSoftBoneColliderBase>();

		protected void OnEnable()
		{
			EnabledColliders.Add(this);
		}

		protected void OnDisable()
		{
			EnabledColliders.Remove(this);
		}

		public abstract void Collide(ref Vector3 position, float spacing);
	}
	public class EZSoftBoneColliderCylinder : EZSoftBoneColliderBase
	{
		[SerializeField]
		private float m_Margin;

		[SerializeField]
		private bool m_InsideMode;

		public float margin
		{
			get
			{
				return m_Margin;
			}
			set
			{
				m_Margin = value;
			}
		}

		public bool insideMode
		{
			get
			{
				return m_InsideMode;
			}
			set
			{
				m_InsideMode = value;
			}
		}

		public override void Collide(ref Vector3 position, float spacing)
		{
			if (insideMode)
			{
				EZSoftBoneUtility.PointInsideCylinder(ref position, ((Component)this).transform, spacing + margin);
			}
			else
			{
				EZSoftBoneUtility.PointOutsideCylinder(ref position, ((Component)this).transform, spacing + margin);
			}
		}
	}
	[CreateAssetMenu(fileName = "SBForce", menuName = "EZSoftBone/SBForce")]
	public class EZSoftBoneForce : ScriptableObject
	{
		public enum TurbulenceMode
		{
			Curve,
			Perlin
		}

		[SerializeField]
		private float m_Force = 1f;

		[SerializeField]
		private Vector3 m_Turbulence = new Vector3(1f, 0.5f, 2f);

		[SerializeField]
		private TurbulenceMode m_TurbulenceMode = TurbulenceMode.Perlin;

		[SerializeField]
		private Vector3 m_Frequency = new Vector3(1f, 1f, 1.5f);

		[SerializeField]
		private float m_TimeCycle = 2f;

		[SerializeField]
		[EZCurveRect(0f, -1f, 1f, 2f)]
		private AnimationCurve m_CurveX = AnimationCurve.Linear(0f, 0f, 1f, 1f);

		[SerializeField]
		[EZCurveRect(0f, -1f, 1f, 2f)]
		private AnimationCurve m_CurveY = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f);

		[SerializeField]
		[EZCurveRect(0f, -1f, 1f, 2f)]
		private AnimationCurve m_CurveZ = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);

		public float force
		{
			get
			{
				return m_Force;
			}
			set
			{
				m_Force = value;
			}
		}

		public Vector3 turbulence
		{
			get
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return m_Turbulence;
			}
			set
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				m_Turbulence = value;
			}
		}

		public TurbulenceMode turbulenceMode
		{
			get
			{
				return m_TurbulenceMode;
			}
			set
			{
				m_TurbulenceMode = value;
			}
		}

		public Vector3 frequency
		{
			get
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return m_Frequency;
			}
			set
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				m_Frequency = value;
			}
		}

		public float timeCycle
		{
			get
			{
				return m_TimeCycle;
			}
			set
			{
				m_TimeCycle = Mathf.Max(0f, value);
			}
		}

		public Vector3 GetForce(float time)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: 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)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = turbulence;
			switch (turbulenceMode)
			{
			case TurbulenceMode.Curve:
				time = Mathf.Repeat(time, m_TimeCycle) / m_TimeCycle;
				val.x *= Curve(m_CurveX, time);
				val.y *= Curve(m_CurveY, time);
				val.z *= Curve(m_CurveZ, time);
				break;
			case TurbulenceMode.Perlin:
				val.x *= Perlin(time * frequency.x, 0f);
				val.y *= Perlin(time * frequency.y, 0.5f);
				val.z *= Perlin(time * frequency.z, 1f);
				break;
			}
			return new Vector3(0f, 0f, force) + val;
		}

		private float Perlin(float x, float y)
		{
			return Mathf.PerlinNoise(x, y) * 2f - 1f;
		}

		private float Curve(AnimationCurve curve, float time)
		{
			return curve.Evaluate(time);
		}
	}
	public class EZSoftBoneForceField : MonoBehaviour
	{
		[SerializeField]
		[Range(0f, 1f)]
		private float m_Conductivity = 0.15f;

		[SerializeField]
		[EZNestedEditor]
		private EZSoftBoneForce m_Force;

		public float conductivity
		{
			get
			{
				return m_Conductivity;
			}
			set
			{
				m_Conductivity = value;
			}
		}

		public EZSoftBoneForce force
		{
			get
			{
				return m_Force;
			}
			set
			{
				m_Force = value;
			}
		}

		public float time { get; set; }

		private void OnEnable()
		{
			time = 0f;
		}

		private void Update()
		{
			time += Time.deltaTime;
		}

		public Vector3 GetForce(float normalizedLength)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			return ((Component)this).transform.TransformDirection(force.GetForce(time - conductivity * normalizedLength));
		}
	}
	[CreateAssetMenu(fileName = "SBMat", menuName = "EZSoftBone/SBMaterial")]
	public class EZSoftBoneMaterial : ScriptableObject
	{
		[SerializeField]
		[Range(0f, 1f)]
		private float m_Damping = 0.2f;

		[SerializeField]
		[EZCurveRect(0f, 0f, 1f, 1f)]
		private AnimationCurve m_DampingCurve = AnimationCurve.EaseInOut(0f, 0.5f, 1f, 1f);

		[SerializeField]
		[Range(0f, 1f)]
		private float m_Stiffness = 0.1f;

		[SerializeField]
		[EZCurveRect(0f, 0f, 1f, 1f)]
		private AnimationCurve m_StiffnessCurve = AnimationCurve.Linear(0f, 1f, 1f, 1f);

		[SerializeField]
		[Range(0f, 1f)]
		private float m_Resistance = 0.9f;

		[SerializeField]
		[EZCurveRect(0f, 0f, 1f, 1f)]
		private AnimationCurve m_ResistanceCurve = AnimationCurve.Linear(0f, 1f, 1f, 0f);

		[SerializeField]
		[Range(0f, 1f)]
		private float m_Slackness = 0.1f;

		[SerializeField]
		[EZCurveRect(0f, 0f, 1f, 1f)]
		private AnimationCurve m_SlacknessCurve = AnimationCurve.Linear(0f, 1f, 1f, 0.8f);

		private static EZSoftBoneMaterial m_DefaultMaterial;

		public float damping
		{
			get
			{
				return m_Damping;
			}
			set
			{
				m_Damping = Mathf.Clamp01(value);
			}
		}

		public AnimationCurve dampingCurve => m_DampingCurve;

		public float stiffness
		{
			get
			{
				return m_Stiffness;
			}
			set
			{
				m_Stiffness = Mathf.Clamp01(value);
			}
		}

		public AnimationCurve stiffnessCurve => m_StiffnessCurve;

		public float resistance
		{
			get
			{
				return m_Resistance;
			}
			set
			{
				m_Resistance = Mathf.Clamp01(value);
			}
		}

		public AnimationCurve resistanceCurve => m_ResistanceCurve;

		public float slackness
		{
			get
			{
				return m_Slackness;
			}
			set
			{
				m_Slackness = Mathf.Clamp01(value);
			}
		}

		public AnimationCurve slacknessCurve => m_SlacknessCurve;

		public static EZSoftBoneMaterial defaultMaterial
		{
			get
			{
				if ((Object)(object)m_DefaultMaterial == (Object)null)
				{
					m_DefaultMaterial = ScriptableObject.CreateInstance<EZSoftBoneMaterial>();
				}
				((Object)m_DefaultMaterial).name = "SBMat_Default";
				return m_DefaultMaterial;
			}
		}

		public float GetDamping(float t)
		{
			return damping * dampingCurve.Evaluate(t);
		}

		public float GetStiffness(float t)
		{
			return stiffness * stiffnessCurve.Evaluate(t);
		}

		public float GetResistance(float t)
		{
			return resistance * resistanceCurve.Evaluate(t);
		}

		public float GetSlackness(float t)
		{
			return slackness * slacknessCurve.Evaluate(t);
		}
	}
	public static class EZSoftBoneUtility
	{
		public static Vector3 Abs(this Vector3 v)
		{
			//IL_0000: 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_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			return new Vector3(Mathf.Abs(v.x), Mathf.Abs(v.y), Mathf.Abs(v.z));
		}

		public static float Max(this Vector3 v)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			return Mathf.Max(v.x, Mathf.Max(v.y, v.z));
		}

		public static bool Contains(this LayerMask mask, int layer)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			return (LayerMask.op_Implicit(mask) | (1 << layer)) == LayerMask.op_Implicit(mask);
		}

		public static void GetCapsuleParams(CapsuleCollider collider, out Vector3 center0, out Vector3 center1, out float radius)
		{
			//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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: 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_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)collider).transform.lossyScale.Abs();
			radius = collider.radius;
			center0 = (center1 = collider.center);
			float num = collider.height * 0.5f;
			switch (collider.direction)
			{
			case 0:
				radius *= Mathf.Max(val.y, val.z);
				num = Mathf.Max(0f, num - radius / val.x);
				center0.x -= num;
				center1.x += num;
				break;
			case 1:
				radius *= Mathf.Max(val.x, val.z);
				num = Mathf.Max(0f, num - radius / val.y);
				center0.y -= num;
				center1.y += num;
				break;
			case 2:
				radius *= Mathf.Max(val.x, val.y);
				num = Mathf.Max(0f, num - radius / val.z);
				center0.z -= num;
				center1.z += num;
				break;
			}
			center0 = ((Component)collider).transform.TransformPoint(center0);
			center1 = ((Component)collider).transform.TransformPoint(center1);
		}

		public static void GetCylinderParams(Transform transform, out Vector3 center, out Vector3 direction, out float radius, out float height)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//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_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//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)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = transform.lossyScale.Abs();
			center = transform.position;
			direction = transform.up;
			radius = Mathf.Max(val.x, val.z) * 0.5f;
			height = val.y;
		}

		public static void PointOutsideSphere(ref Vector3 position, SphereCollider collider, float spacing)
		{
			//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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			Vector3 v = ((Component)collider).transform.lossyScale.Abs();
			float num = collider.radius * v.Max();
			PointOutsideSphere(ref position, ((Component)collider).transform.TransformPoint(collider.center), num + spacing);
		}

		private static void PointOutsideSphere(ref Vector3 position, Vector3 spherePosition, float radius)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = position - spherePosition;
			if (((Vector3)(ref val)).magnitude < radius)
			{
				position = spherePosition + ((Vector3)(ref val)).normalized * radius;
			}
		}

		public static void PointInsideSphere(ref Vector3 position, SphereCollider collider, float spacing)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			PointInsideSphere(ref position, ((Component)collider).transform.TransformPoint(collider.center), collider.radius - spacing);
		}

		private static void PointInsideSphere(ref Vector3 position, Vector3 spherePosition, float radius)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = position - spherePosition;
			if (((Vector3)(ref val)).magnitude > radius)
			{
				position = spherePosition + ((Vector3)(ref val)).normalized * radius;
			}
		}

		public static void PointOutsideCapsule(ref Vector3 position, CapsuleCollider collider, float spacing)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			GetCapsuleParams(collider, out var center, out var center2, out var radius);
			PointOutsideCapsule(ref position, center, center2, radius + spacing);
		}

		private static void PointOutsideCapsule(ref Vector3 position, Vector3 center0, Vector3 center1, float radius)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: 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)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = center1 - center0;
			Vector3 val2 = position - center0;
			float num = Vector3.Dot(val, val2);
			if (num <= 0f)
			{
				PointOutsideSphere(ref position, center0, radius);
				return;
			}
			if (num >= ((Vector3)(ref val)).sqrMagnitude)
			{
				PointOutsideSphere(ref position, center1, radius);
				return;
			}
			Vector3 val3 = val2 - Vector3.Project(val2, val);
			float num2 = radius - ((Vector3)(ref val3)).magnitude;
			if (num2 > 0f)
			{
				position += ((Vector3)(ref val3)).normalized * num2;
			}
		}

		public static void PointInsideCapsule(ref Vector3 position, CapsuleCollider collider, float spacing)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			GetCapsuleParams(collider, out var center, out var center2, out var radius);
			PointInsideCapsule(ref position, center, center2, radius - spacing);
		}

		private static void PointInsideCapsule(ref Vector3 position, Vector3 center0, Vector3 center1, float radius)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: 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)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = center1 - center0;
			Vector3 val2 = position - center0;
			float num = Vector3.Dot(val, val2);
			if (num <= 0f)
			{
				PointInsideSphere(ref position, center0, radius);
				return;
			}
			if (num >= ((Vector3)(ref val)).sqrMagnitude)
			{
				PointInsideSphere(ref position, center1, radius);
				return;
			}
			Vector3 val3 = val2 - Vector3.Project(val2, val);
			float num2 = radius - ((Vector3)(ref val3)).magnitude;
			if (num2 < 0f)
			{
				position += ((Vector3)(ref val3)).normalized * num2;
			}
		}

		public static void PointOutsideCylinder(ref Vector3 position, Transform transform, float spacing)
		{
			//IL_000f: 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)
			GetCylinderParams(transform, out var center, out var direction, out var radius, out var height);
			PointOutsideCylinder(ref position, center, direction, radius + spacing, height + spacing);
		}

		private static void PointOutsideCylinder(ref Vector3 position, Vector3 center, Vector3 direction, float radius, float height)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = position - center;
			Vector3 val2 = Vector3.Project(val, direction);
			float num = height - ((Vector3)(ref val2)).magnitude;
			if (!(num > 0f))
			{
				return;
			}
			Vector3 val3 = val - val2;
			float num2 = radius - ((Vector3)(ref val3)).magnitude;
			if (num2 > 0f)
			{
				if (num2 < num)
				{
					position += ((Vector3)(ref val3)).normalized * num2;
				}
				else
				{
					position += ((Vector3)(ref val2)).normalized * num;
				}
			}
		}

		public static void PointInsideCylinder(ref Vector3 position, Transform transform, float spacing)
		{
			//IL_000f: 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)
			GetCylinderParams(transform, out var center, out var direction, out var radius, out var height);
			PointInsideCylinder(ref position, center, direction, radius - spacing, height - spacing);
		}

		private static void PointInsideCylinder(ref Vector3 position, Vector3 center, Vector3 direction, float radius, float height)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: 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)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = position - center;
			Vector3 val2 = Vector3.Project(val, direction);
			float num = height - ((Vector3)(ref val2)).magnitude;
			Vector3 val3 = val - val2;
			float num2 = radius - ((Vector3)(ref val3)).magnitude;
			if (num < 0f || num2 < 0f)
			{
				if (num2 < num)
				{
					position += ((Vector3)(ref val3)).normalized * num2;
				}
				else
				{
					position += ((Vector3)(ref val2)).normalized * num;
				}
			}
		}

		public static void PointOutsideBox(ref Vector3 position, BoxCollider collider, float spacing)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0061: 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_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position2 = ((Component)collider).transform.InverseTransformPoint(position) - collider.center;
			PointOutsideBox(ref position2, collider.size.Abs() / 2f + ((Component)collider).transform.InverseTransformVector(Vector3.one * spacing).Abs());
			position = ((Component)collider).transform.TransformPoint(collider.center + position2);
		}

		private static void PointOutsideBox(ref Vector3 position, Vector3 boxSize)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//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_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = position.Abs();
			if (!(val.x < boxSize.x) || !(val.y < boxSize.y) || !(val.z < boxSize.z))
			{
				return;
			}
			Vector3 val2 = (val - boxSize).Abs();
			if (val2.x < val2.y)
			{
				if (val2.x < val2.z)
				{
					position.x = Mathf.Sign(position.x) * boxSize.x;
				}
				else
				{
					position.z = Mathf.Sign(position.z) * boxSize.z;
				}
			}
			else if (val2.y < val2.z)
			{
				position.y = Mathf.Sign(position.y) * boxSize.y;
			}
			else
			{
				position.z = Mathf.Sign(position.z) * boxSize.z;
			}
		}

		public static void PointInsideBox(ref Vector3 position, BoxCollider collider, float spacing)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0061: 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_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position2 = ((Component)collider).transform.InverseTransformPoint(position) - collider.center;
			PointInsideBox(ref position2, collider.size.Abs() / 2f - ((Component)collider).transform.InverseTransformVector(Vector3.one * spacing).Abs());
			position = ((Component)collider).transform.TransformPoint(collider.center + position2);
		}

		private static void PointInsideBox(ref Vector3 position, Vector3 boxSize)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//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_0011: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = position.Abs();
			if (val.x > boxSize.x)
			{
				position.x = Mathf.Sign(position.x) * boxSize.x;
			}
			if (val.y > boxSize.y)
			{
				position.y = Mathf.Sign(position.y) * boxSize.y;
			}
			if (val.z > boxSize.z)
			{
				position.z = Mathf.Sign(position.z) * boxSize.z;
			}
		}

		public static void PointOutsideCollider(ref Vector3 position, Collider collider, float spacing)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: 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_002f: 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)
			//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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: 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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = collider.ClosestPoint(position);
			if (position == val)
			{
				Vector3 val2 = position;
				Bounds bounds = collider.bounds;
				Vector3 val3 = val2 - ((Bounds)(ref bounds)).center;
				bounds = collider.bounds;
				Debug.DrawLine(((Bounds)(ref bounds)).center, val, Color.red);
				position = val + ((Vector3)(ref val3)).normalized * spacing;
			}
			else
			{
				Vector3 val4 = position - val;
				if (((Vector3)(ref val4)).magnitude < spacing)
				{
					position = val + ((Vector3)(ref val4)).normalized * spacing;
				}
			}
		}

		public static void DrawGizmosArrow(Vector3 startPoint, Vector3 direction, float halfWidth, Vector3 normal)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_0015: 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)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = Vector3.Cross(direction, normal);
			Vector3 val2 = ((Vector3)(ref val)).normalized * halfWidth;
			Vector3[] array = (Vector3[])(object)new Vector3[8];
			array[0] = startPoint + val2 * 0.5f;
			array[1] = array[0] + direction * 0.5f;
			array[2] = array[1] + val2 * 0.5f;
			array[3] = startPoint + direction;
			array[4] = startPoint - val2 + direction * 0.5f;
			array[5] = array[4] + val2 * 0.5f;
			array[6] = startPoint - val2 * 0.5f;
			array[7] = array[0];
			DrawGizmosPolyLine(array);
		}

		public static void DrawGizmosPolyLine(params Vector3[] vertices)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < vertices.Length - 1; i++)
			{
				Gizmos.DrawLine(vertices[i], vertices[i + 1]);
			}
		}
	}
}
namespace LethalCroc
{
	internal class AvatarReplacement : BodyReplacementBase
	{
		protected override GameObject LoadAssetsAndReturnModel()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			string text = "LethalCrocPrefab";
			GameObject obj = Assets.MainAssetBundle.LoadAsset<GameObject>(text);
			EZSoftBone eZSoftBone = obj.AddComponent<EZSoftBone>();
			eZSoftBone.rootBones = new List<Transform>();
			Transform item = obj.transform.Find("Armature.001/spine/Bone");
			eZSoftBone.rootBones.Add(item);
			eZSoftBone.gravity = new Vector3(0f, -3f, 0f);
			return obj;
		}
	}
	[BepInPlugin("Aze.LethalCroc", "Lethal Croc", "1.0.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class LethalCrocBase : BaseUnityPlugin
	{
		private const string modGUID = "Aze.LethalCroc";

		private const string modName = "Lethal Croc";

		private const string modVersion = "1.0.0.0";

		private readonly Harmony harmony = new Harmony("Aze.LethalCroc");

		internal ManualLogSource mls;

		public static ConfigFile config;

		private static LethalCrocBase Instance;

		public static ConfigEntry<bool> enableCrocForAllSuits { get; private set; }

		public static ConfigEntry<bool> enableCrocAsDefault { get; private set; }

		public static ConfigEntry<string> suitNamesToEnableCroc { get; private set; }

		private void Awake()
		{
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			config = ((BaseUnityPlugin)this).Config;
			InitConfig();
			Assets.PopulateAssets();
			if (enableCrocForAllSuits.Value)
			{
				ModelReplacementAPI.RegisterModelReplacementOverride(typeof(AvatarReplacement));
			}
			if (enableCrocAsDefault.Value)
			{
				ModelReplacementAPI.RegisterModelReplacementDefault(typeof(AvatarReplacement));
			}
			string[] array = suitNamesToEnableCroc.Value.Split(',');
			for (int i = 0; i < array.Length; i++)
			{
				ModelReplacementAPI.RegisterSuitModelReplacement(array[i], typeof(AvatarReplacement));
			}
			new Harmony("Aze.LethalCroc").PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Aze.LethalCroc is loaded!");
		}

		private static void InitConfig()
		{
			enableCrocForAllSuits = config.Bind<bool>("Suits to Replace Settings", "Enable Croc for all Suits", false, "Enable to replace every suit with Croc. Set to false to specify suits");
			enableCrocAsDefault = config.Bind<bool>("Suits to Replace Settings", "Enable Croc as default", false, "Enable to replace every suit that hasn't been otherwise registered with Croc.");
			suitNamesToEnableCroc = config.Bind<string>("Suits to Replace Settings", "Suits to enable Croc for", "Default,Orange suit", "Enter a comma separated list of suit names.(Additionally, [Green suit,Pajama suit,Hazard suit])");
		}
	}
	public static class Assets
	{
		public static string mainAssetBundleName = "lethalcrocbundle";

		public static AssetBundle MainAssetBundle = null;

		private static string GetAssemblyName()
		{
			return Assembly.GetExecutingAssembly().GetName().Name;
		}

		public static void PopulateAssets()
		{
			if ((Object)(object)MainAssetBundle == (Object)null)
			{
				Console.WriteLine(GetAssemblyName() + "." + mainAssetBundleName);
				using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetAssemblyName() + "." + mainAssetBundleName);
				MainAssetBundle = AssetBundle.LoadFromStream(stream);
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}