using System;
using UnityEngine;

[Serializable]
public class BodyCtrlData : IKCtrlData
{
	public BodyCtrlData(FullBodyIKCtrl ik_ctrl) : base(ik_ctrl, ik_ctrl.GetIKBone(IKManager.BoneType.Root), false, false)
	{
		this.PosBaseBone = base.TargetBone;
		this.m_ForceIKEnable = false;
	}

	public Vector3 OrijinMaidPos { get; private set; }

	public Vector3 OrijinAllPos { get; private set; }

	public bool DoAllOffset { get; private set; }

	public Vector3 BodyOffset
	{
		get
		{
			return this.m_PosOffset + this.m_AddOffset;
		}
	}

	public Vector3 AllOffset
	{
		get
		{
			return this.m_AllOffset;
		}
	}

	public Vector3 AddOffset
	{
		get
		{
			return this.m_AddOffset;
		}
	}

	public override Transform[] ChainBones
	{
		get
		{
			return new Transform[]
			{
				this.MyIKCtrl.GetIKBone(IKManager.BoneType.Root)
			};
		}
	}

	public override float PositionWeight { get; set; }

	public override float RotationWeight { get; set; }

	private bool CheckDoIK()
	{
		if (!base.IsIKExec)
		{
			return false;
		}
		if (this.HeightFit == BodyCtrlData.HeightFitType.None)
		{
			return true;
		}
		int value = this.MyIKCtrl.TgtMaid.GetProp(MPN.sintyou).value;
		int value2 = base.PointIK.TgtMaid.GetProp(MPN.sintyou).value;
		if (this.HeightFit == BodyCtrlData.HeightFitType.Higher)
		{
			return value < value2;
		}
		return value > value2;
	}

	protected override void SetTargetTransform(IKCtrlData.IKParam data, Vector3 pos, Quaternion rot)
	{
		if (!data.IsPointAttach || !this.CheckDoIK())
		{
			return;
		}
		if (data.FirstFrame && !data.BlendNow)
		{
			this.m_FirstBonePos = this.PosBaseBone.position;
		}
		Vector3 b = (!data.BlendNow) ? this.m_FirstBonePos : this.PosBaseBone.position;
		pos = ((!data.BlendNow) ? this.m_FirstTgtPosRot.pos : pos);
		if (!data.DoSetOffset)
		{
			if (this.OffsetWorld)
			{
				base.IKTarget.position = pos + data.TgtOffset;
			}
			else if (this.OffsetBone)
			{
				KasaiUtility.DrawAxis(pos, base.TargetBone.rotation, 0.0625f);
				base.IKTarget.position = pos + base.TargetBone.rotation * data.TgtOffset;
			}
			else
			{
				base.IKTarget.position = pos + rot * data.TgtOffset;
			}
			Debug.DrawLine(pos, base.IKTarget.position, Color.white);
		}
		Vector3 enablePos = this.m_OffsetEnable.GetEnablePos(base.IKTarget.position - b, false);
		if (data.BlendType == IKCtrlData.IKBlendType.IK_To_IK)
		{
			this.m_PosOffset += Vector3.Lerp(this.m_lastPosOffset, enablePos, data.BlendWeight);
		}
		else if (data.BlendType == IKCtrlData.IKBlendType.IK_To_Detach)
		{
			this.m_PosOffset += Vector3.Lerp(Vector3.zero, enablePos, 1f - data.BlendWeight);
		}
		else
		{
			this.m_PosOffset += Vector3.Lerp(Vector3.zero, enablePos, data.BlendWeight);
		}
	}

	public void SetAllOffset(Vector3 offset)
	{
		if (!base.IsIKExec)
		{
			base.PointIK.IsIKExec = true;
		}
		this.DoAllOffset = true;
		this.m_AllOffset = offset;
	}

	public void SetAddOffset(Vector3 offset)
	{
		if (!base.IsIKExec)
		{
			base.PointIK.IsIKExec = true;
		}
		this.m_AddOffset = offset;
	}

	public override void ApplyIKSetting()
	{
		this.m_AddOffset = Vector3.zero;
		this.DoAllOffset = false;
		this.m_PosOffset = this.OrijinMaidPos;
		this.m_AllOffset = this.OrijinAllPos;
		base.ApplyIKSetting();
	}

	public override void SetIKSetting(IKCtrlData.IKAttachType attachType, bool is_another, Maid tgt_maid, int slot_no, string attach_name, Transform axis_bone, Transform target, Vector3 f_vecOffset, bool do_animation, float blend_time)
	{
		this.OrijinMaidPos = this.MyIKCtrl.TgtMaid.GetPos();
		this.OrijinAllPos = GameMain.Instance.CharacterMgr.GetCharaAllPos();
		base.SetIKSetting(attachType, is_another, tgt_maid, slot_no, attach_name, axis_bone, target, f_vecOffset, do_animation, blend_time);
	}

	public override void Update()
	{
		if (this.DoAllOffset)
		{
			GameMain.Instance.CharacterMgr.SetCharaAllPos(this.m_AllOffset);
		}
		if (!this.CheckDoIK())
		{
			return;
		}
		this.MyIKCtrl.TgtMaid.SetPos(this.BodyOffset);
	}

	public override void Detach(IKCtrlData.IKAttachType attachType, float blend_time = 0f)
	{
		this.m_lastPosOffset = this.m_PosOffset - this.OrijinMaidPos;
		base.Detach(attachType, blend_time);
		base.BlendPosRot.Copy(this.PosBaseBone);
		this.m_AddOffset = Vector3.zero;
		this.HeightFit = BodyCtrlData.HeightFitType.None;
		this.OrijinMaidPos = this.MyIKCtrl.TgtMaid.GetPos();
		this.OrijinAllPos = GameMain.Instance.CharacterMgr.GetCharaAllPos();
	}

	[SerializeField]
	private Vector3 m_PosOffset = Vector3.zero;

	private Vector3 m_AddOffset = Vector3.zero;

	private Vector3 m_FirstBonePos = Vector3.zero;

	private Vector3 m_lastPosOffset = Vector3.zero;

	[SerializeField]
	private Vector3 m_AllOffset = Vector3.zero;

	public Transform PosBaseBone;

	public BodyCtrlData.HeightFitType HeightFit = BodyCtrlData.HeightFitType.None;

	public enum HeightFitType
	{
		Higher,
		Lower,
		None
	}
}
