using System;
using System.Collections;
using System.Collections.Generic;
using DarkTonic.MasterAudio;
using Pathfinding;
using PixelCrushers.DialogueSystem;
using TMPro;
using UnityEngine;

// Token: 0x0200001B RID: 27
public class Character : MonoBehaviour
{
	// Token: 0x060002F0 RID: 752 RVA: 0x00039F18 File Offset: 0x00038118
	private void Update()
	{
		if (!Links.x.gaia.sceneLoaded)
		{
			return;
		}
		if (Records.x.inOverworldMap)
		{
			return;
		}
		if (this.offMap || !this.body)
		{
			return;
		}
		if (this.setupComplete)
		{
			if (!this.npc && this.mainSelected && !Records.x.pocketPause)
			{
				Links.x.follow.position = this.tr.position + this.headHeight;
				float num = this.attackTime;
				if (!this.CanAttack())
				{
					num = 0f;
				}
				if (Links.x.combat.bubbleEvent)
				{
					num = 1f;
				}
				Shader.SetGlobalFloat("_AttackTime", num);
			}
			if (Links.x.gaia.sceneLoaded && !this.dead && !this.inactive)
			{
				if (!this.body)
				{
					this.SetupBody();
				}
				if (this.body.tr.parent == Links.x.archives.tr || !this.body.gameObject.activeSelf)
				{
					this.SetupBody();
					if (this.party)
					{
						this.SetupPartyAfterLoadedVariables2();
					}
				}
				if (this.body.headObject && this.body.headObject.transform.parent == Links.x.archives.tr)
				{
					this.SetupBody();
					if (this.party)
					{
						this.SetupPartyAfterLoadedVariables2();
					}
				}
			}
			if (this.inactive && !this.dayNightVanishing && !this.alwaysOn && !this.dead)
			{
				this.TurnScriptsOff();
				return;
			}
			if (this.isBoro)
			{
				if (this.inactive || Links.x.gaia.boroControls.boroInvisible)
				{
					return;
				}
				if (!Links.x.gaia.boroControls.BoroNearby())
				{
					Links.x.gaia.boroControls.StartLeaveWait();
				}
			}
			bool flag = false;
			if (this.isHit)
			{
				if (Links.x.gameplay.seconds > this.hitTime)
				{
					bool flag2 = true;
					if (this.bouncer)
					{
						flag2 = false;
						RaycastHit raycastHit;
						if (Physics.SphereCast(this.tr.position + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit, 100f, 4194433))
						{
							this.groundPoint = raycastHit.point;
							if (Mathf.Abs(this.groundPoint.y - this.tr.position.y) < 0.5f)
							{
								flag2 = true;
							}
						}
						else
						{
							flag2 = true;
						}
						if (this.bouncer.rbody.linearVelocity.magnitude < 0.3f)
						{
							flag2 = true;
						}
						if (!this.bouncer.gameObject.activeSelf)
						{
							this.bouncer.gameObject.SetActive(true);
						}
					}
					if ((!this.bouncer && (this.body.downHash == this.body.currentHash || this.body.downStartHash == this.body.currentHash)) || flag2)
					{
						this.isHit = false;
						this.postHitTime = Links.x.gameplay.seconds;
						if ((this.body.bounceHash == this.body.currentHash || this.body.downHash == this.body.currentHash || this.animID == 8) && !this.dead)
						{
							this.PlayAnimation("GetUp", 0f);
						}
						this.hitTime = 0f;
						this.hitTimeReal = 0f;
						if (this.stunned)
						{
							this.PlayAnimation("Hit Down", 0f);
						}
						RaycastHit raycastHit2;
						if (this.bouncer && this.bouncer.gameObject.activeSelf && Physics.SphereCast(this.tr.position + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit2, 100f, 4194433))
						{
							this.groundPoint = raycastHit2.point;
							if (this.groundPoint.y > this.tr.position.y)
							{
								this.SetPosition(this.groundPoint, null);
							}
						}
						if (!this.dead)
						{
							this.ClaimNode(null, this.tr.position, false);
						}
					}
					if (this.hitTime == 0f)
					{
						this.PlayFaceAnimation(FaceAnimations.AnimationNames.Blink);
						if (this.isHit)
						{
							this.ClaimNode(null, this.tr.position, false);
						}
						this.isHit = false;
						this.postHitTime = Links.x.gameplay.seconds;
						if (this.hasActions)
						{
							Links.x.combat.GetNextAction(this);
						}
						flag = true;
						if (this.bouncer)
						{
							this.bouncer.End();
						}
						if (this.dead && !this.party)
						{
							base.enabled = false;
						}
					}
					else if (this.NodesCount() > 0)
					{
						this.ClearNodePath();
					}
				}
				if (this.bouncer && this.hitTime != 0f && this.bouncer.gameObject.activeSelf)
				{
					if (Time.timeSinceLevelLoad > this.hitTimeReal + 0.4f && Links.x.combat.inPocketAttack && this.pocketPausedOverride)
					{
						this.pocketPausedOverride = false;
						this.animator.speed = 0f;
						this.hitTimeReal = 0f;
					}
					if ((Links.x.combat.inPocketAttack || Records.x.pocketPause) && !this.pocketPausedOverride)
					{
						if (this.savedBounceVel == this.vectorZero)
						{
							this.savedBounceVel = this.bouncer.rbody.linearVelocity;
							this.savedBounceAngVel = this.bouncer.rbody.angularVelocity;
						}
						this.bouncer.rbody.useGravity = false;
						this.bouncer.rbody.isKinematic = true;
					}
					else
					{
						if (this.savedBounceVel != this.vectorZero)
						{
							this.bouncer.rbody.AddForce(this.savedBounceVel, ForceMode.VelocityChange);
							this.bouncer.rbody.AddTorque(this.savedBounceAngVel, ForceMode.VelocityChange);
							this.savedBounceVel = this.vectorZero;
							this.savedBounceAngVel = this.vectorZero;
							this.bouncer.rbody.useGravity = true;
							this.bouncer.rbody.isKinematic = false;
						}
						float num2 = 0f;
						RaycastHit raycastHit3;
						if (Physics.SphereCast(this.tr.position + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit3, 100f, 4194433))
						{
							this.groundPoint = raycastHit3.point;
							if (this.groundPoint.y < this.tr.position.y + 0.6f)
							{
								num2 = this.tr.position.y - this.groundPoint.y;
							}
						}
						if (num2 > 0f)
						{
							float num3 = -600f;
							if (this.dead)
							{
								num3 = -300f;
							}
							this.bouncer.rbody.AddForce(Vector3.up * num3, ForceMode.Force);
						}
						if (num2 < 0.5f || this.bouncer.rbody.linearVelocity.sqrMagnitude < 0.1f)
						{
							if (this.stunned)
							{
								this.PlayAnimation("Hit Down", 0f);
							}
							if (this.body.currentHash == this.body.bounceHash)
							{
								this.animator.SetBool("Bounce Over", true);
							}
						}
					}
				}
			}
			if (this.dead && !this.party)
			{
				return;
			}
			if (this.postHitTime > 0f && (Links.x.gameplay.seconds > this.postHitTime + 15f || this.isHit || this.dead || this.stunned || this.downed || this.stats.pinned))
			{
				this.postHitTime = 0f;
			}
			if (this.inActionTime > 0f)
			{
				if (!this.inAction)
				{
					this.inActionTime = 0f;
				}
				else if (Links.x.gameplay.seconds > this.inActionTime + 100f && this.animID != 14)
				{
					this.inAction = false;
					this.inActionTime = 0f;
				}
			}
			if (this.animID == 14 && this.body.currentHash != this.body.channelHash)
			{
				this.animID = 0;
			}
			if (this.inRecoveryTime > 0f)
			{
				if (!this.inRecovery)
				{
					this.inRecoveryTime = 0f;
				}
				else if (Links.x.gameplay.seconds > this.inRecoveryTime + 15f)
				{
					this.inRecovery = false;
					this.inRecoveryTime = 0f;
				}
			}
			if (this.inQueuedAbilityTime > 0f)
			{
				if (!this.inQueuedAbility)
				{
					this.inQueuedAbilityTime = 0f;
				}
				else if (Time.timeSinceLevelLoad > this.inQueuedAbilityTime + 2f)
				{
					this.inQueuedAbility = false;
					this.inQueuedAbilityTime = 0f;
				}
			}
			if (this.chargeTime > 0f)
			{
				if (this.charging)
				{
					if (Links.x.gameplay.seconds > this.chargeTime + 18f)
					{
						this.charging = false;
						if (Records.x.editor)
						{
							Debug.Log("setting charge false for " + ((this != null) ? this.ToString() : null));
						}
					}
				}
				else
				{
					this.chargeTime = 0f;
				}
			}
			if (this.listenForPhysicsEnd && !this.rb.isKinematic)
			{
				Debug.Log(((this != null) ? this.ToString() : null) + " listen for physics end " + this.rb.linearVelocity.magnitude.ToString());
				if (this.rb.linearVelocity.magnitude < 0.2f)
				{
					this.rb.isKinematic = true;
					this.ClaimNode(null, Vector3.zero, true);
					this.listenForPhysicsEnd = false;
					if (!this.moving)
					{
						this.jumping = false;
					}
					if (this.node != null)
					{
						this.SetPosition((Vector3)this.node.position, null);
					}
					this.SetRotation(Quaternion.identity, false, false);
				}
			}
			bool flag3 = false;
			if (Records.x.combat)
			{
				if (this.npc)
				{
				}
				if (this.npc || Records.x.InCombat(false))
				{
				}
			}
			bool flag4 = true;
			if (this.IsSentient() && !this.dead && flag4 && !Records.x.removeControls && this.stats.Confuse() == 0 && (flag3 || !Records.x.pocketPause))
			{
				if (this.attackTime < 1f)
				{
					if (!this.inAction && !this.inRecovery && !this.inQueuedAbility)
					{
						this.at += Time.deltaTime / this.currentAttackSpeed;
					}
					float num4 = this.attackTime;
					this.attackTime = Mathf.Lerp(0f, 1f, this.at);
					if (this.attackTime >= 1f)
					{
						this.inventoryTime = 0f;
					}
					if (this.mainSelected)
					{
						Links.x.hudControl.UpdateAttackTime(this.attackTime, 1f, this.inventoryTime);
					}
					if (num4 != this.attackTime && this.portrait)
					{
						this.portrait.SetActionBar(this.attackTime);
						this.portrait.skillBag.SetSelectedState();
					}
				}
				else
				{
					if (this.mainSelected)
					{
						Links.x.hudControl.UpdateAttackTime(1f, 1f, this.inventoryTime);
						if (Links.x.combat.attackingInteractiveOutsideOfCombat && !Records.x.InCombat(false))
						{
							Links.x.hudControl.ToggleAttackTimer(false);
							Links.x.combat.attackingInteractiveOutsideOfCombat = false;
							Links.x.combat.npcsInCombat = false;
						}
					}
					if (!Records.x.pocketPause)
					{
						float num5 = this.attackTime;
						if (!Records.x.removeControls)
						{
							this.attackTime = 1f;
						}
						if (!this.inAction && !this.inRecovery)
						{
							if (num5 != this.attackTime && this.portrait)
							{
								this.portrait.SetActionBar(this.attackTime);
								this.portrait.skillBag.SetSelectedState();
							}
						}
						else if (this.portrait)
						{
							this.portrait.SetActionBar(0f);
						}
					}
				}
			}
			else if (!Records.x.pocketPause)
			{
				float num6 = this.attackTime;
				if (!Records.x.removeControls)
				{
					this.attackTime = 1f;
				}
				if (num6 != this.attackTime && this.portrait)
				{
					this.portrait.SetActionBar(this.attackTime);
				}
			}
			else
			{
				if (this.dead)
				{
					this.attackTime = 0f;
				}
				if (this.mainSelected)
				{
					Links.x.hudControl.UpdateAttackTime(this.attackTime, 1f, 0f);
				}
			}
			if (this.hasActions && this.party && !this.dead && !this.stunned)
			{
				this.portrait.skillBag.UpdateAbilityTriggers();
			}
			if (this.party && this.currentAnimatorSpeed != this.animator.speed && !this.body.animationHold)
			{
				float num7 = 10f;
				if (this.IsWalking() && this.stats.moveSpeedMod == 0f)
				{
					this.animator.speed = Mathf.Lerp(this.animator.speed, this.currentAnimatorSpeed, Time.deltaTime * num7);
				}
				else
				{
					this.animator.speed = this.currentAnimatorSpeed;
				}
			}
			if (this.inAction || this.inRecovery)
			{
				this.body.CheckBlink();
			}
			if (this.node != null)
			{
				if (this.slideNode == null)
				{
					if (!this.node.Walkable)
					{
						if (Records.x.editor)
						{
							Debug.Log(((this != null) ? this.ToString() : null) + " node is not walkable, moving to new node");
						}
						GraphNode graphNode = this.NearNode(this.tr.position, true, 0, 2, 0);
						if (graphNode != null)
						{
							this.ClaimNode(graphNode, this.tr.position, false);
							if (!this.moving && !this.sailing)
							{
								this.SetMoveFollowPosition(this.NodePosition());
								this.Slide(this.node, true);
							}
						}
						else if (this.party && !this.mainSelected)
						{
							this.setArea = (int)Links.x.main.node.Area;
							graphNode = this.NearNode(Links.x.main.tr.position, true, 0, 2, 0);
							if (graphNode != null)
							{
								this.ClaimNode(graphNode, (Vector3)graphNode.position, false);
								if (!this.moving && !this.sailing)
								{
									this.tr.position = (Vector3)graphNode.position;
									this.SetMoveFollowPosition(this.NodePosition());
								}
							}
						}
					}
					if (!this.moving && this.nodePath.Count == 0 && !this.dead && !this.stunned && !this.downed && !this.sleeping && (!this.resting || (this.resting && !this.inCircle && this.hasActions)) && !this.mainSelected)
					{
						this.CheckInTile();
					}
				}
				if (this.ghost && !Records.x.pocketPause)
				{
					int num8 = 1;
					if (this.ghost && !this.ghostVanishing)
					{
						num8 = 0;
					}
					if (this.sailing || this.movesOnWater)
					{
						num8 = 2;
					}
					if (!this.node.AllConnectionsWalkable(this.ConnectionNumber(), num8) && this.slideNode == null)
					{
						this.GhostFlee();
					}
				}
			}
			if (this.fleeing && !this.moving && this.waitingForPath == 0 && Links.x.gameplay.seconds >= this.fleeStartTime + this.fleeTime)
			{
				this.CheckFleeEnd();
			}
			if (this.summoned && this.stats.leaveTime > 0f && (Links.x.gameplay.seconds > this.stats.leaveTime || Links.x.gaia.waitingToRemoveScene))
			{
				this.Missing();
			}
			if (this.party)
			{
				if (Time.timeSinceLevelLoad > this.timeSinceMoveEnded && this.timeSinceMoveEnded != 0f && this.timeSinceMoveEnded != -100f && !Records.x.pocketPause)
				{
					if (!this.hasActions && this.animID == 0 && this.slideNode == null)
					{
						this.PlayIdle();
						this.timeSinceMoveEnded = 0f;
					}
					else
					{
						this.timeSinceMoveEnded = 0f;
					}
				}
				if (this.sailing && this.sporeTime == 0f)
				{
					this.sporeTime = Links.x.gameplay.seconds;
				}
				if (this.sporeTime > 0f && (this.inSporeForest || this.sailing))
				{
					float seconds = Links.x.gameplay.seconds;
					if ((seconds > this.sporeTime + 100f && this.inSporeForest) || (seconds > this.sporeTime + (500f - Records.x.boroBonus.z * 250f) && this.sailing))
					{
						int num9 = 1;
						if (this.sailing)
						{
							num9 = 2;
						}
						this.stats.AddSpiritFromKill((float)num9);
						this.sporeTime = seconds;
					}
				}
			}
			if (this.kickUseTime > 0f && Time.timeSinceLevelLoad > this.kickUseTime + 0.75f)
			{
				this.kickUseTime = 0f;
				if (this.animID == 25 || this.animID == 26)
				{
					this.animID = 0;
				}
			}
			if (this.jumpTime > 0f && ((Links.x.gameplay.seconds > this.jumpTime + 60f && this.body.currentHash != this.body.jumpLoopHash && !this.mainSelected) || Links.x.gameplay.seconds > this.jumpTime + 130f || !this.jumping || this.dead || this.stunned))
			{
				this.StopEvading();
				if (this.jumping && this.IsSentient())
				{
					this.ForceEndJump();
					this.jumping = false;
					this.TargetReached();
					if (this.actions && !this.mainSelected)
					{
						Links.x.combat.GetNextAction(this);
					}
				}
				this.jumpTime = 0f;
				this.jumping = false;
				if (this.isHitFlying)
				{
					this.isHitFlying = false;
				}
			}
			if (this.slideNode != null && !Records.x.paused && !this.dead && (!this.pocketPaused || (this.pocketPaused && this.pocketPausedOverride && !this.party && this.isHit)))
			{
				if (this.turning)
				{
					this.EndTurning(false);
				}
				if (this.stuckInPlace || this.stats.Stuck() > 0 || this.sailing || this.jumpingAreas || (!this.movesOnWater && this.isHit) || this.jumping || this.jumpingPosition)
				{
					this.slideNode = null;
					this.slideNodePosition = Vector3.zero;
					this.ClaimNode(null, this.vectorZero, false);
					if (this.node != null && !this.sailing && !this.isHit)
					{
						this.SetMoveFollowPosition(this.NodePosition());
					}
				}
				else
				{
					float sqrMagnitude = (this.slideNodePosition - this.tr.position).sqrMagnitude;
					float sqrMagnitude2 = (this.prevNodePosition - this.tr.position).sqrMagnitude;
					if (sqrMagnitude < 0.0025000002f || (this.body.IsHit() && this.body.animationHold && !this.movesOnWater) || flag || ((sqrMagnitude > 20f || sqrMagnitude2 > 20f) && this.mainSelected))
					{
						this.ttime = 0f;
						if (this.isHitFlying)
						{
							this.KnockbackEnd(false);
							this.isHitFlying = false;
						}
						if (this.IsWalking() && this.NodesCount() == 0)
						{
							this.SetIdle(true);
						}
						if ((Vector3)this.slideNode.position == this.slideNodePosition)
						{
							this.SetPosition((Vector3)this.slideNode.position, null);
							this.ClaimNode(this.slideNode, this.slideNodePosition, false);
						}
						else
						{
							this.ClaimNode(null, this.tr.position, false);
						}
						this.SetMoveFollowPosition(this.slideNodePosition);
						this.slideNode = null;
						this.slideNodePosition = Vector3.zero;
						this.movingOutOfWay = false;
						if (this.lookTarget)
						{
							this.lookTargetTime = Time.timeSinceLevelLoad;
						}
						if (this.hasActions && !this.body.IsHit() && this.timelineIcon && !this.mainSelected && this.timelineIcon.Nothing())
						{
							this.actions.CheckIfRunningAI();
							this.actions.EndTurn(true);
						}
					}
					else if (this.slideNode != null && this.tr.position != this.vectorZero)
					{
						if (this.isHit)
						{
							this.ttime += Time.deltaTime * 1f;
						}
						else
						{
							this.ttime += Time.deltaTime * 2f;
						}
						Vector3 vector = Vector3.MoveTowards(this.tr.position, this.slideNodePosition, 12f * Time.deltaTime);
						if (vector != this.tr.position && vector != this.vectorZero)
						{
							this.SetPosition(vector, null);
							this.SetMoveFollowPosition(this.tr.position);
						}
						if (!this.isHit && (vector - this.tr.position).sqrMagnitude > 0.010000001f)
						{
							this.SetRotation(Quaternion.LookRotation(vector - this.tr.position), false, false);
						}
						if (this.isHitFlying)
						{
							this.tr.Rotate(this.randomRot * 30f * Time.deltaTime);
							this.rot = this.tr.rotation;
							this.smoothRot = this.tr.rotation;
						}
					}
					else
					{
						this.ClaimNode(null, this.vectorZero, false);
						this.slideNode = null;
						this.movingOutOfWay = false;
					}
				}
			}
			if (this.jumpingAreas)
			{
				if (Time.timeSinceLevelLoad > this.jumpingAreasTime + 0.5f)
				{
					if (this.nodePath.Count > 0)
					{
						this.SetPosition((Vector3)this.jumpAreasNode.position, this.jumpAreasNode);
						this.moveFollow.position = (Vector3)this.jumpAreasNode.position;
						this.ClaimNode(this.jumpAreasNode, this.tr.position, true);
						this.TurnExit();
					}
					else
					{
						this.ClaimNode(this.jumpAreasNode, this.tr.position, true);
						this.SetPosition((Vector3)this.jumpAreasNode.position, this.jumpAreasNode);
					}
					if (this.jumpAreasNode.GraphIndex == 0U)
					{
						this.indoorID = "";
						this.desiredGraph = 0;
					}
					else
					{
						this.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName((Vector3)this.jumpAreasNode.position);
						this.desiredGraph = 1;
					}
					Links.x.sensory.UpdateCharactersIntExt(true);
					this.ChangeTorchLight();
					this.body.SetMagicaClothState(false);
					this.body.turnOnMagicaClothNextFrame = 3;
					this.jumpingAreas = false;
					this.slideNode = null;
					this.tempStop = false;
					if (this.animID != 0)
					{
						this.PlayIdle();
					}
				}
				else
				{
					this.savedPathTarget = this.jumpAreasNode;
					if (this.sphere)
					{
						this.sphere.transform.position = (Vector3)this.jumpAreasNode.position;
					}
					this.SetPosition((Vector3)this.jumpAreasNode.position, this.jumpAreasNode);
					this.moveFollow.position = (Vector3)this.jumpAreasNode.position;
				}
			}
			if (Time.timeSinceLevelLoad > this.movingOutOfWayTime + 8f)
			{
				this.movingOutOfWayTime = 0f;
				this.movingOutOfWay = false;
			}
			if (this.attentionTime > 0f && Time.timeSinceLevelLoad > this.attentionTime + 0.25f)
			{
				if (this.attentionCount < 4)
				{
					this.attentionTime = Time.timeSinceLevelLoad;
				}
				else
				{
					this.attentionTime = 0f;
					this.attentionCount = 0;
				}
				this.attentionCount++;
				if (this.attentionCount % 2 != 0)
				{
					if (!this.hovering)
					{
						this.body.Hover(false, true);
					}
				}
				else
				{
					this.body.Hover(true, true);
				}
			}
			this.updateCount--;
			if (this.lookTargetTime > 0f && Time.timeSinceLevelLoad > this.lookTargetTime + 2f)
			{
				if (this.lookTarget && !this.boatNavigator && !this.moving && !this.physicsMove && !this.inAction && !this.inQueuedAbility && !this.inRecovery)
				{
					if (this.lookTarget.tr.position != this.tr.position)
					{
						this.SetRotation(Quaternion.LookRotation(this.lookTarget.tr.position - this.tr.position), false, false);
					}
					this.lookTarget = null;
					this.lookTargetTime = 0f;
				}
				else
				{
					this.lookTarget = null;
					this.lookTargetTime = 0f;
				}
			}
			if (this.attackTargetTime > 0f)
			{
				if (Links.x.gameplay.seconds > this.attackTargetTime || !this.inAction)
				{
					this.attackTargetTime = 0f;
					this.attackTarget = null;
				}
				else
				{
					this.SetRotation(Quaternion.LookRotation(this.attackTarget.tr.position - this.tr.position), false, true);
				}
			}
			if (!this.hasActions && !this.movingOutOfWay && !this.jumpingAreas && !this.jumpingPosition && !this.mainSelected && !Records.x.removeControls && !Records.x.inMenus && Links.x.main.moving && !Links.x.main.body.sneaking && !this.body.sneaking)
			{
				float sqrMagnitude3 = (Links.x.main.tr.position - this.tr.position).sqrMagnitude;
				if (sqrMagnitude3 < 1f && !this.isBoro)
				{
					Links.x.main.Collide(this, false);
				}
				else if (sqrMagnitude3 < 12.25f && (this.isBoro || this.npc) && this.hostility < 2 && !this.attackingUntilBribe && !this.fleeing && Links.x.main.physicsMove && !this.resting)
				{
					Vector3 vector2 = Vector3.Normalize(Links.x.main.tr.forward);
					Vector3 vector3 = Vector3.Normalize(this.tr.position - Links.x.main.tr.position);
					if (Vector3.Dot(vector2, vector3) > 0f)
					{
						if (this.collidedTime == 0f)
						{
							this.collidedTime = Time.timeSinceLevelLoad + 4f;
						}
						else if (Time.timeSinceLevelLoad > this.collidedTime && !this.movingOutOfWay)
						{
							Links.x.main.Collide(this, false);
							if (this.movingOutOfWayTime > 0f && !this.stats.animal && this.quip == null && !this.stats.xmlName.Contains("Fairy"))
							{
								if (this.stats.xmlName.Contains("Dryad"))
								{
									int num10 = Random.Range(0, 5);
									if (num10 == 0)
									{
										this.StartQuip("I will pass");
									}
									if (num10 == 1)
									{
										this.StartQuip("You are here");
									}
									if (num10 == 2)
									{
										this.StartQuip("Vol knows your step");
									}
									if (num10 == 3)
									{
										this.StartQuip("Be gentle");
									}
									if (num10 == 4)
									{
										this.StartQuip("I am in the path");
									}
								}
								else
								{
									int num11 = Random.Range(0, 5);
									if (num11 == 0)
									{
										this.StartQuip("Excuse me");
									}
									if (num11 == 1)
									{
										this.StartQuip("Am I in your way?");
									}
									if (num11 == 2)
									{
										this.StartQuip("Did you need somewhat?");
									}
									if (num11 == 3)
									{
										this.StartQuip("Pardon me");
									}
									if (num11 == 4)
									{
										this.StartQuip("I'll let you pass");
									}
								}
							}
						}
					}
				}
				if (this.stats.hasNonCombatAI && this.stats.nonCombatAI == "Shy" && this.visible == 1)
				{
					if (sqrMagnitude3 < 64f)
					{
						if (!this.fleeing)
						{
							if (this.stats.xmlName.Contains("Fairy"))
							{
								this.ignoreNodeIDs = true;
							}
							this.Flee(Links.x.main.node, false, Links.x.gameplay.seconds, 100f);
						}
					}
					else if (this.stats.xmlName.Contains("Fairy") && sqrMagnitude3 > 100f)
					{
						this.ignoreNodeIDs = false;
					}
				}
			}
			if (this.collidedTime > 0f && Time.timeSinceLevelLoad > this.collidedTime + 3f)
			{
				this.collidedTime = 0f;
			}
			if (this.updateCount <= 0)
			{
				if (!this.outsideBounds && !this.stuckInPlace && !this.moving && !this.dead && !this.stunned)
				{
					if (this.node == null && Links.x.gaia.sceneLoaded)
					{
						this.FindCurrentNode(this.inCombat);
					}
					else
					{
						this.CheckInTile();
					}
				}
				if (!this.npc || this.node == null || this.sleeping || this.resting)
				{
					this.updateCount = Random.Range(10, 30);
					if (this.resting && this.hasActions)
					{
						this.updateCount = Random.Range(2, 6);
					}
				}
				else
				{
					this.updateCount = Random.Range(100, 300);
				}
				if ((this.resting || this.sleeping) && this.visible == 1 && !this.inactive && (this.body.currentHash == this.body.idleHash || this.body.currentHash == this.body.combatIdleHash))
				{
					this.animID = 0;
					if (this.inCircle && !this.sleeping)
					{
						this.PlayAnimation("Fatigued", 0f);
					}
					else
					{
						this.PlayAnimation("Hit Down", 0f);
					}
				}
				if (!this.dead && (!this.stunned || (this.stunned && this.party)) && ((this.stunned && this.party) || this.downed || (!this.hasActions && this.resting)) && this.body.currentHash != this.body.hitDownHash)
				{
					this.PlayAnimation("Hit Down", 0f);
				}
				if (this.party)
				{
					this.CheckInTown();
				}
				if (this.sleeping || this.resting || this.stunned || this.dead || this.downed)
				{
					this.PlayFaceAnimation(FaceAnimations.AnimationNames.Sleep);
				}
				if (this.isBoro && !this.sailing && Random.Range(0, 100) == 0 && !Records.x.InCombat(false) && this.waitingForPath == 0 && !this.moving && !this.justMoved && !this.movingOutOfWay)
				{
					this.MakePath(Links.x.main.node, 3, false, true, false);
				}
			}
			if (this.party && (this.moving || this.physicsMove))
			{
				this.CheckInTown();
			}
			if (this.summoned)
			{
				if (this.animator.speed > 1f && !this.IsWalking() && this.animID != 1)
				{
					this.SetAnimatorSpeed(1f);
				}
				if (this.missingTime > 0f)
				{
					if (Time.timeSinceLevelLoad > this.missingTime + 5f && !Records.x.pocketPause)
					{
						this.SetMeshState(false);
					}
					if (Time.timeSinceLevelLoad > this.missingTime + 7f && !Records.x.pocketPause && this.visible == 0)
					{
						this.Missing();
						return;
					}
				}
			}
			if (!this.CheckControls() || Records.x.dialogue)
			{
				if (!this.currentlyInDialogue)
				{
					this.currentlyInDialogue = true;
					if (!this.ignoreRemoveControls && Records.x.dialogue && this.nodePath.Count > 0 && !this.fleeing)
					{
						this.EndPath();
					}
				}
			}
			else if (this.currentlyInDialogue)
			{
				this.currentlyInDialogue = false;
				if (this.circleTr && !this.isBoro && !this.stunned && this.usingCircles)
				{
					this.circle.SetActive(true);
				}
				if (this.npc && this.ghost && this.hostility == 0)
				{
					this.circle.SetActive(false);
				}
				this.GetPatrolHoldTime(true);
			}
			if (this.npc)
			{
				if (this.visible == 0)
				{
					if (!this.inactive && !this.missing && !this.fleeing && !this.dead && this.usingCircles && this.circle.activeSelf)
					{
						this.circle.SetActive(false);
					}
				}
				else if (!this.inactive && !this.dead && !this.stats.dead && !this.stunned && this.usingCircles && !this.circle.activeSelf && (!this.npc || !this.ghost || this.hostility != 0))
				{
					this.circle.SetActive(true);
				}
			}
			if (Time.realtimeSinceStartup > this.currentEffectTime + 0.75f && !this.dead)
			{
				this.RotateEffects();
			}
			if (this.body.dodgeTime > 0f && Time.timeSinceLevelLoad > this.body.dodgeTime + 0.3f)
			{
				this.body.dodgeTime = 0f;
				this.body.Dodge(false);
			}
			if (this.quipStartTime > -1f && this.quip && Time.time > this.quipStartTime + 5f)
			{
				this.quip.End();
				this.quip = null;
				this.quipStartTime = -1f;
			}
			if (this.blockedTime > 0f)
			{
				this.blocked = true;
			}
			else
			{
				this.blocked = false;
			}
			if (Time.timeSinceLevelLoad > this.updateTime + 5f && !this.dayNightVanishing && !this.alwaysOn)
			{
				this.updateTime = Time.timeSinceLevelLoad + Random.Range(0f, 5f);
				if ((this.stats.animal || this.stats.soundID > 0) && ((this.summoned && Random.Range(0, 20) == 0) || (!this.summoned && Random.Range(0, 2) == 0)) && !Records.x.paused && !Records.x.pocketPause && !this.sleeping && !this.resting && !Records.x.InCombat(false))
				{
					this.PlaySoundFX(0, 6);
				}
			}
			if ((!this.npc || (this.npc && this.inCombat && this.IsSentient())) && !this.stats.pinned && !this.stats.pinning)
			{
				float num12 = 50f;
				if (!this.npc)
				{
					num12 = 7f;
				}
				if (Links.x.gameplay.seconds > this.fatigueUpdateTime + num12)
				{
					this.fatigueUpdateTime = Links.x.gameplay.seconds;
					if (this.npc)
					{
						this.stats.AddStamina(1f);
					}
					else
					{
						this.stats.AddStamina(1f);
					}
				}
			}
			if (this.DoPatrolRotate() && true && (Time.timeSinceLevelLoad > this.patrolHoldTime || this.alwaysLookAtParty))
			{
				this.PatrolRotate();
			}
			if (this.pocketPaused && !this.pocketPausedOverride && !Records.x.pocketPause)
			{
				this.pocketPaused = false;
				if (this.blockedTime == 0f && this.prePausedSpeed < 0.1f)
				{
					this.prePausedSpeed = 1f;
				}
				this.SetAnimatorSpeed(this.prePausedSpeed);
			}
			this.UpdateRotation();
			if (this.ambushing)
			{
				this.jumpingPosition = false;
			}
			if (this.jumpingPosition)
			{
				if (Time.timeSinceLevelLoad > this.jumpPositionTime + 0.5f)
				{
					this.jumpPositionTime = 0f;
					this.jumpingPosition = false;
					if (this.party)
					{
						this.animator.enabled = true;
					}
					this.ClaimNode(this.node, this.tr.position, false);
					if (this.party && !this.mainSelected && Links.x.gaia.sceneLoaded && this.makePathAfterJump && Records.x.InCombat(false) && Links.x.main.node != null)
					{
						this.setArea = (int)Links.x.main.node.Area;
						this.MakePath(Links.x.main.node, 3, false, true, true);
					}
					this.makePathAfterJump = false;
				}
				else
				{
					this.TargetReached();
					this.ClearPathUpdates();
					this.SetPosition(this.jumpPositionVector, null);
					this.ClaimNode(this.node, this.tr.position, false);
					if (this.party && this.cc)
					{
						this.cc.enabled = false;
						this.cc.transform.position = this.tr.position;
						this.cc.transform.rotation = this.tr.rotation;
						this.cc.enabled = true;
						this.cc.enabled = false;
					}
				}
			}
			if (this.party)
			{
				bool flag5 = false;
				if (this.mainSelected && (Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")) || Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) || Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")) || Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down"))))
				{
					flag5 = true;
				}
				if (this.mainSelected && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Commands")) && !this.inAction && !this.turning && !this.jumping && this.slideNode == null && !this.charging && ((Links.x.joy && !Records.x.pocketPause) || (Links.x.pathfind && !Links.x.gameplay.makeCircleMode && Input.GetMouseButton(0) && Links.x.mk && !Links.x.gameplay.ClickingOnInteractable() && !Input.GetMouseButtonDown(0) && (this.waitingForPath == 0 || Links.x.gameplay.holdingMouseButton)) || (Links.x.mk && flag5)))
				{
					if (this.stats.Stuck() == 0 && this.stats.Confuse() == 0)
					{
						Vector3 one = Vector3.one;
						Quaternion quaternion = this.rot;
						bool flag6 = this.physicsMove;
						this.movingAreas = false;
						this.physicsMove = Links.x.fellowship.GetDirection(this, out quaternion, out one);
						if (Links.x.combat.attackingInteractiveOutsideOfCombat && !Records.x.InCombat(false))
						{
							Links.x.hudControl.ToggleAttackTimer(false);
							Links.x.combat.attackingInteractiveOutsideOfCombat = false;
							Links.x.combat.npcsInCombat = false;
						}
						if (this.physicsMove && (!this.CanPhysicsMove(flag5) || this.sailing || this.jumpingPosition))
						{
							this.ClaimNode(this.node, this.tr.position, false);
							this.physicsMove = false;
						}
						if (this.physicsMove)
						{
							if (this.dodging)
							{
								this.EndDodge();
							}
							bool flag7 = false;
							if (Input.GetMouseButton(0) && Links.x.pathfind && Links.x.gameplay.hitInteractable)
							{
								flag7 = true;
							}
							if (this.stats.Stuck() > 0 || !this.IsSentient() || this.downed || this.dodging || this.body.currentHash == this.body.useHash || this.body.currentHash == this.body.kickHash || ((this.animID == 25 || this.animID == 26) && this.animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 0.25f) || flag7)
							{
								this.physicsMove = false;
							}
							if (((Links.x.mk && ((Input.GetMouseButtonDown(0) && Links.x.pathfind) || (flag5 && !flag6))) || (Links.x.joy && this.prevMoveSpeed == Vector3.zero)) && this.stats.Overburdened())
							{
								this.StartQuip("I'm overburdened");
							}
							if (flag5 && Links.x.gameplay.makeCircleMode)
							{
								Links.x.gameplay.EndCircleMode();
							}
						}
						else if (this.turningMain)
						{
							this.EndTurning(false);
							this.turningMain = false;
						}
						this.prevMoveSpeed = one;
						if (this.physicsMove)
						{
							if (this.previouslyMovingStartTime == 0f && !flag6)
							{
								this.previouslyMovingStartTime = Time.timeSinceLevelLoad;
							}
							if (this.previouslyMovingStartTime > 0f && Time.timeSinceLevelLoad > this.previouslyMovingStartTime + 0.05f)
							{
								this.previouslyMovingStartTime = 0f;
							}
							if (this.waypoint && this.waypoint.transform.position.x != Links.x.gameplay.farPosition.x)
							{
								this.waypoint.transform.position = Links.x.gameplay.farPosition;
								if (this.waypointAnimator.enabled)
								{
									this.waypointAnimator.enabled = false;
								}
							}
							if (!flag6 && (Links.x.gameplay.holdingMouseButton || flag5))
							{
								this.ClearMoveTargets();
							}
							if ((this.nodePath.Count > 0 || (flag5 && !flag6)) && (Links.x.gameplay.holdingMouseButton || (flag5 && !flag6)))
							{
								this.nodePath.Clear();
								this.nodeActions.Clear();
								this.vectorPath.Clear();
								this.justMoved = true;
								this.timeSinceLastMove = Time.timeSinceLevelLoad;
								this.moving = false;
								this.moveNode = null;
								this.movePoint = this.vectorZero;
								this.waitingForNewPath = true;
								this.waitingForPath = 0;
								this.waitingForNewPathTime = 0f;
								this.tempStop = false;
								this.blockedTime = 0f;
							}
							if (!Records.x.pocketPause && Records.x.combat && Links.x.combat.GetNPCCountHostile() == 0 && !Links.x.combat.npcOnlyCombat && this.attackTime >= 1f)
							{
								Links.x.combat.EndCombat(false);
							}
							if (this.actions && this.actions.hasTarget)
							{
								this.actions.ClearSelectedActionRealTime();
							}
							this.groundPoint = this.tr.position;
							Quaternion quaternion2 = Quaternion.Slerp(this.tr.rotation, quaternion, Time.fixedDeltaTime * 40f);
							this.rot = quaternion;
							this.tr.position + quaternion2 * Vector3.forward * 1f;
							RaycastHit raycastHit4;
							if (Physics.SphereCast(this.tr.position + quaternion2 * Vector3.forward * 0.5f + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit4, 100f, 4194433))
							{
								this.groundPoint = raycastHit4.point;
							}
							else
							{
								this.groundPoint = this.tr.position + quaternion2 * Vector3.forward * 0.5f;
							}
							if (this.node != null)
							{
								this.setArea = (int)this.node.Area;
							}
							GraphNode graphNode2 = this.NearNode(this.groundPoint, false, 0, 2, 0);
							if (!this.sailing)
							{
								Vector3 position = this.tr.position;
								if (Physics.SphereCast(this.tr.position + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit4, 100f, 4194433))
								{
									Vector3 point = raycastHit4.point;
								}
								if (Physics.SphereCast(this.tr.position + quaternion2 * Vector3.forward * 1f + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit4, 100f, 4194433))
								{
									this.groundPoint = raycastHit4.point;
								}
							}
							Vector3 vector4 = Vector3.Normalize(this.body.tr.forward);
							Vector3 vector5 = Vector3.Normalize(this.tr.position + quaternion * Vector3.forward * 5f - this.tr.position);
							Vector3.Dot(vector4, vector5);
							bool flag8 = this.moving;
							float num13 = Quaternion.Angle(quaternion, this.body.tr.rotation);
							bool flag9 = false;
							if (flag9 && ((this.turning && num13 > 45f) || (flag9 && this.body.currentHash != this.body.walkEndHash && this.body.currentHash != this.body.combatWalkEndHash && this.body.currentHash != this.body.creepEndHash && num13 > 140f)))
							{
								this.turningMain = true;
							}
							else
							{
								if (this.turningMain)
								{
									this.RotateToChild();
									this.turningMain = false;
								}
								if (this.turning)
								{
									this.EndTurning(false);
								}
								this.smoothRot = this.tr.rotation;
								this.rot = this.tr.rotation;
							}
							float num14 = 5f;
							if (!this.turningMain && !this.turning)
							{
								this.moving = true;
								if (this.dodging)
								{
									this.EndDodge();
								}
								this.SetAnimatorSpeed(1f);
								if (this.waitingForPath == 0)
								{
									this.sphere.transform.position = this.tr.position;
									if (graphNode2 != this.node && graphNode2 != null)
									{
										this.savedPathTarget = graphNode2;
										this.ClaimNode(graphNode2, (Vector3)graphNode2.position, false);
										Links.x.gameplay.CheckTileEffects(this, this.node, false);
										this.mainMovePoint = (Vector3)graphNode2.position;
										this.DoFootsteps();
									}
									else
									{
										this.ClaimNode(this.node, this.tr.position, false);
									}
								}
								if (Physics.SphereCast(this.groundPoint + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit4, 100f, 4194433))
								{
									this.groundPoint = raycastHit4.point;
								}
								if (this.animID != 1)
								{
									this.PlayAnimation("Walk", 0f);
								}
								if (this.groundPoint != Vector3.zero)
								{
									if (!this.cc)
									{
										this.AddCC();
									}
									if (!this.cc.enabled)
									{
										this.cc.enabled = true;
										this.cc.transform.position = this.tr.position;
										this.cc.transform.rotation = this.tr.rotation;
									}
									if (!this.playerBorders.enabled)
									{
										this.playerBorders.enabled = true;
									}
									Collider firstCollider = this.body.GetFirstCollider();
									if (firstCollider && firstCollider.enabled)
									{
										this.body.SeeThroughColliders(false);
									}
									if ((Vector3)this.node.position != this.tr.position)
									{
										Vector3 vector6 = Quaternion.LookRotation(this.groundPoint - this.tr.position) * Vector3.forward * num14 * Time.deltaTime;
										if (Records.x.pocketPause && !this.pocketPaused)
										{
											num14 = 8f;
										}
										this.physicsY = vector6;
										if (one == Vector3.zero)
										{
											this.physicsY = Vector3.zero;
										}
									}
									if (this.animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.5f)
									{
										this.animator.SetFloat("Walk End", 1f);
									}
									else
									{
										this.animator.SetFloat("Walk End", 0f);
									}
								}
							}
							if (flag8 && !this.turningMain)
							{
								Quaternion quaternion3 = quaternion2;
								if (this.tr.position != this.lastFrame)
								{
									quaternion3 = Quaternion.LookRotation(this.tr.position - this.lastFrame);
								}
								Vector3 eulerAngles = quaternion3.eulerAngles;
								eulerAngles.x = 0f;
								eulerAngles.z = 0f;
								if (this.nodePath.Count > 0)
								{
									quaternion3 = Quaternion.Slerp(this.tr.rotation, quaternion2, Time.deltaTime * 50f);
								}
								else
								{
									quaternion3 = Quaternion.Slerp(this.tr.rotation, quaternion2, Time.deltaTime * 20f);
								}
								float num15 = Vector3.Dot(quaternion2 * Vector3.forward, Quaternion.Euler(eulerAngles) * Vector3.forward);
								LayerMask layerMask = 70400;
								float num16 = 1f;
								Vector3 vector7 = new Vector3(0f, 1.25f, 0f);
								bool flag10 = Physics.Raycast(this.tr.position + vector7 + this.tr.right * 0.5f, quaternion2 * Vector3.forward, num16, layerMask);
								if (!flag10)
								{
									flag10 = Physics.Raycast(this.tr.position + vector7 + this.tr.right * -0.5f, quaternion2 * Vector3.forward, num16, layerMask);
								}
								if (!flag10)
								{
									flag10 = Physics.Raycast(this.tr.position + vector7, quaternion2 * Vector3.forward, num16, layerMask);
								}
								if (this.previouslyMovingStartTime == 0f)
								{
									if (this.cc.velocity.magnitude > 0.1f && flag10 && num15 > -0.25f && this.nodePath.Count == 0)
									{
										this.tr.rotation = Quaternion.Slerp(this.tr.rotation, Quaternion.Euler(eulerAngles), Time.deltaTime * 10f);
									}
									else
									{
										this.tr.rotation = quaternion3;
									}
								}
								if (Physics.SphereCast(this.tr.position + this.tr.forward * 2f + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit4, 100f, 4194305))
								{
									Vector3 vector8 = Quaternion.LookRotation(raycastHit4.point - this.tr.position) * Vector3.forward * num14 * Time.deltaTime;
									this.physicsY = vector8;
									if (one == Vector3.zero)
									{
										this.physicsY = Vector3.zero;
									}
								}
								if (Time.timeSinceLevelLoad > this.lastFrameTime + 0.3f || this.lastFrame == Vector3.zero)
								{
									this.lastFrame = this.tr.position;
									this.lastFrameTime = Time.timeSinceLevelLoad;
								}
							}
							if (!Records.x.InCombat(false) && this.mainSelected)
							{
								Character character = null;
								RaycastHit raycastHit5;
								if (Physics.Raycast(this.tr.position + new Vector3(0f, 1.5f, 0f), this.tr.forward, out raycastHit5, 1.5f, 64))
								{
									Character character2 = raycastHit5.collider.gameObject.GetComponent<Character>();
									if (character2)
									{
										if (!character2.npc && Links.x.fellowship.NearCompanionNode(character2) && raycastHit5.distance > 4f)
										{
											character2 = null;
										}
										if (character2 && character2 != character && (!character2.npc || character2.vipFollow) && character2 != this && !character2.isBoro)
										{
											character = character2;
											if (this.party)
											{
												this.lookTarget = Links.x.main;
											}
											this.Collide(character2, false);
										}
									}
								}
								float num17 = 4f;
								if (Records.x.circle)
								{
									num17 = 2f;
								}
								if (Physics.SphereCast(this.tr.position + new Vector3(0f, 1.5f, 0f), 2f, quaternion * Vector3.forward, out raycastHit5, num17, 64))
								{
									Character character3 = raycastHit5.collider.gameObject.GetComponent<Character>();
									if (character3)
									{
										if (!character3.npc && Links.x.fellowship.NearCompanionNode(character3) && raycastHit5.distance > 4f)
										{
											character3 = null;
										}
										if (character3 && character3 != character && (!character3.npc || character3.vipFollow) && character3 != this)
										{
											if (this.party)
											{
												this.lookTarget = Links.x.main;
											}
											if (!character3.isBoro)
											{
												this.Collide(character3, false);
											}
										}
									}
								}
							}
							this.moveFollow.position = this.tr.position;
							this.lastRotation = quaternion2;
						}
						else if (!Records.x.removeControls && this.IsWalking())
						{
							this.justMoved = true;
							this.timeSinceLastMove = Time.timeSinceLevelLoad;
							this.StopMove();
						}
					}
					else if (this.IsWalking() && this.nodePath.Count == 0)
					{
						this.justMoved = true;
						this.timeSinceLastMove = Time.timeSinceLevelLoad;
						this.StopMove();
					}
				}
				else if (this.party)
				{
					this.physicsMove = false;
					if (this.cc && this.cc.enabled && !this.mainSelected)
					{
						this.cc.enabled = false;
					}
				}
			}
			if (Records.x.editor && Input.GetKeyDown(KeyCode.B) && !Records.x.typing)
			{
				Debug.Log(string.Concat(new string[]
				{
					(this != null) ? this.ToString() : null,
					" ",
					Records.x.pocketPause.ToString(),
					" ",
					this.pocketPaused.ToString(),
					" ",
					Records.x.removeControls.ToString(),
					" ",
					this.CanMove().ToString(),
					" ",
					this.CheckControls().ToString(),
					" ",
					Records.x.paused.ToString(),
					" ",
					Links.x.combat.inRally.ToString(),
					" ",
					this.IsSentient().ToString(),
					" ",
					this.isHit.ToString(),
					" ",
					this.blockedTime.ToString()
				}));
			}
			bool flag11 = false;
			if (this.mainSelected && this.actions && this.actions.ai.jumping)
			{
				flag11 = true;
			}
			if ((!Records.x.pocketPause || (Records.x.pocketPause && this.party && (this.pocketPausedOverride || !this.pocketPaused) && (flag3 || this.isHitFlying || Links.x.combat.inRally || Links.x.combat.inPocketAttack || flag11) && (!this.inAction || this.jumping) && (!this.inRecovery || this.jumping))) && (!this.isHit || this.jumping) && (this.jumping || this.IsSentient()) && !Records.x.paused && !this.physicsMove && !this.inactive)
			{
				if (this.waitingForPath == 3 && Time.timeSinceLevelLoad > this.waitForPathTime + 0.5f && !this.jumping)
				{
					this.DoPath(false);
					this.waitForPathTime = Time.timeSinceLevelLoad;
				}
				if (this.CanMove() && !this.jumpingAreas)
				{
					bool flag12 = this.AllTilesFree(this.moveNode, false);
					if (this.mainSelected)
					{
						this.playerBorders.enabled = true;
					}
					if (this.jumping)
					{
						flag12 = true;
					}
					if (!flag12)
					{
						if (this.NodeBlocked(this.moveNode, null))
						{
							flag12 = true;
						}
						if (this.fleeing && this.hostility == 1)
						{
							flag12 = true;
						}
						if (this.jumping && this.ignoreRemoveControls)
						{
							flag12 = true;
						}
						if (this.jumping)
						{
							flag12 = true;
						}
						if (this.sailing && this.boatNavigator && this.boat.turning)
						{
							flag12 = true;
						}
						if (this.ghostVanishing || this.ambushing)
						{
							flag12 = true;
						}
						if (Records.x.pocketPause && this.pocketPausedOverride && this.party)
						{
							flag12 = true;
						}
					}
					if (this.blockedTime > 0f && flag12)
					{
						this.tempStop = false;
						this.blocked = false;
						this.blockedTime = 0f;
						this.animID = 0;
						if (Records.x.astarDebugging)
						{
							Debug.Log("Remove blocked time " + ((this != null) ? this.ToString() : null));
						}
					}
					else if (this.blockedTime > 0.2f && !flag12 && !this.jumping)
					{
						if (!this.boatNavigator)
						{
							this.SetIdle(true);
						}
						this.SetAnimatorSpeed(1f);
					}
					if (Records.x.editor && Input.GetKeyDown(KeyCode.B))
					{
						string[] array = new string[7];
						array[0] = ((this != null) ? this.ToString() : null);
						array[1] = " ";
						array[2] = flag12.ToString();
						array[3] = " ";
						int num18 = 4;
						GraphNode graphNode3 = this.moveNode;
						array[num18] = ((graphNode3 != null) ? graphNode3.ToString() : null);
						array[5] = " ";
						array[6] = this.AllTilesFree(this.moveNode, false).ToString();
						Debug.Log(string.Concat(array));
					}
					if (this.moveBackward)
					{
						if (!this.moveBackTarget)
						{
							this.animator.SetBool("Backward", false);
							this.moveBackward = false;
						}
						else if (!this.animator.GetBool("Backward"))
						{
							this.animator.SetBool("Backward", true);
						}
					}
					else if (this.moveBackTarget)
					{
						this.animator.SetBool("Backward", true);
						this.moveBackward = true;
					}
					if (flag12 && (this.moveNode != null || (this.jumping && this.mainSelected)))
					{
						this.moving = true;
						if (this.dodging && !this.evading)
						{
							this.EndDodge();
						}
						if (this.waitingForNewPath && Time.timeSinceLevelLoad > this.waitingForNewPathTime + 2f)
						{
							this.waitingForNewPath = false;
						}
						if (this.boatNavigator)
						{
							if (this.boat.node != this.moveNode && !this.boat.turning)
							{
								this.SetMoveNode();
							}
						}
						else if (this.node != this.moveNode && this.moveNode != null)
						{
							this.SetMoveNode();
						}
						this.SetAnimatorSpeed(1f);
						float num19 = (this.animator.deltaPosition / Time.deltaTime).magnitude * Time.deltaTime;
						this.moveFollowTime += num19;
						Transform transform = this.tr;
						Transform transform2 = this.moveFollow;
						if (this.boatNavigator)
						{
							transform = this.boat.tr;
							transform2 = this.boat.moveFollow;
						}
						this.totalDist = Vector3.Distance(transform.position, this.movePoint);
						this.totalDistNodes = Vector3.Distance(transform2.position, this.movePoint);
						float num20 = this.totalDistNodes / this.totalDist;
						int shortNameHash = this.body.stateInfo.shortNameHash;
						if ((shortNameHash == this.body.walkHash || shortNameHash == this.body.walkStartHash || shortNameHash == this.body.walkEndHash || shortNameHash == this.body.combatWalkHash || shortNameHash == this.body.walkPartyHash || shortNameHash == this.body.combatWalkStartHash || shortNameHash == this.body.combatWalkEndHash || shortNameHash == this.body.creepHash || shortNameHash == this.body.creepStartHash || shortNameHash == this.body.runStartHash || shortNameHash == this.body.runHash || shortNameHash == this.body.runEndHash || shortNameHash == this.body.walkBackHash || shortNameHash == this.body.walkBackStartHash || shortNameHash == this.body.walkBackEndHash) && !float.IsNaN(num19))
						{
							Vector3 vector9 = Vector3.MoveTowards(transform2.position, new Vector3(this.movePoint.x, transform.position.y, this.movePoint.z), num19 * num20);
							this.SetMoveFollowPosition(vector9);
						}
						float sqrMagnitude4 = (transform.position - new Vector3(this.movePoint.x, transform.position.y, this.movePoint.z)).sqrMagnitude;
						float sqrMagnitude5 = (transform2.position - new Vector3(this.movePoint.x, transform2.position.y, this.movePoint.z)).sqrMagnitude;
						if (float.IsNaN(num19))
						{
							this.SetAnimatorSpeed(1E-06f);
						}
						else
						{
							this.SetAnimatorSpeed(1f);
							if (this.jumping && !this.charging)
							{
								this.Jumping();
							}
							else if (this.boatNavigator && this.sailing)
							{
								this.boat.movePoint = this.movePoint;
								if (this.boat.closeToPoint && !this.boat.turning)
								{
									this.TurnExit();
								}
							}
							else if (this.nodePath.Count <= 1 && (this.npc || this.mainSelected || this.hasActions))
							{
								float num21 = 2.5f;
								Vector3 vector10 = Vector3.MoveTowards(transform.position, this.movePoint, num19);
								this.SetPosition(vector10, null);
								if ((transform.position.x == this.movePoint.x && transform.position.z == this.movePoint.z) || sqrMagnitude4 < 0.0625f || sqrMagnitude4 > this.totalDist * num21 * (this.totalDist * num21) || sqrMagnitude5 > this.totalDist * num21 * (this.totalDist * num21))
								{
									if (this.animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.5f)
									{
										this.animator.SetFloat("Walk End", 1f);
									}
									else
									{
										this.animator.SetFloat("Walk End", 0f);
									}
									if (this.charging)
									{
										this.jumping = false;
									}
									this.TurnExit();
								}
								else
								{
									if ((this.animID != this.moveAnimID || (Random.Range(0, 10) == 0 && !this.IsWalking())) && this.animID != 23 && !this.boatNavigator)
									{
										this.PlayAnimation("Walk", 0f);
									}
									if (sqrMagnitude4 <= 0.040000003f)
									{
										this.turningComplete = true;
									}
									if (sqrMagnitude4 > 0.040000003f && !this.turningComplete)
									{
										if (!this.boatNavigator)
										{
											this.GetLook(false);
										}
										if (this.usingKeys)
										{
											if (sqrMagnitude5 > 0.01f)
											{
												this.SetRotation(this.look, false, false);
											}
										}
										else
										{
											this.SetRotation(this.look, false, false);
										}
									}
								}
							}
							else
							{
								if ((this.animID != this.moveAnimID || (Random.Range(0, 10) == 0 && !this.IsWalking())) && this.animID != 23)
								{
									this.PlayAnimation("Walk", 0f);
								}
								if (sqrMagnitude4 <= 0.040000003f)
								{
									this.turningComplete = true;
								}
								if (sqrMagnitude4 > 0.040000003f && !this.turningComplete)
								{
									this.GetLook(this.mainSelected);
									if (this.animID == this.moveAnimID)
									{
										this.SetRotation(this.look, false, false);
									}
								}
								if ((transform2.position.x == this.movePoint.x && transform2.position.z == this.movePoint.z) || sqrMagnitude5 < 0.010000001f || sqrMagnitude4 > this.totalDist * 1.5f * (this.totalDist * 1.5f) || sqrMagnitude5 > this.totalDist * 1.5f * (this.totalDist * 1.5f))
								{
									this.TurnExit();
								}
							}
						}
					}
				}
				else
				{
					if (this.moving)
					{
						this.justMoved = true;
						this.timeSinceLastMove = Time.timeSinceLevelLoad;
					}
					this.moving = false;
					if (!this.turning && (this.IsWalking() || this.IsMoveAnim()) && !this.dead && !this.stunned && ((this.waitingForNewPath && this.animator.speed > 0.1f && this.NodesCount() == 0) || !this.waitingForNewPath) && this.waitingForPath == 0 && this.slideNode == null && !this.jumpingAreas)
					{
						if (!this.boatNavigator)
						{
							this.SetIdle(true);
						}
						this.waitingForNewPath = false;
					}
					if (this.waitingForNewPath && !this.turning && this.slideNode == null && !this.jumpingAreas)
					{
						if (Time.timeSinceLevelLoad > this.waitingForNewPathTime + 0.2f && this.waitingForNewPathTime > 0f)
						{
							if (!this.boatNavigator)
							{
								this.SetIdle(true);
							}
							this.SetAnimatorSpeed(1f);
							this.waitingForNewPath = false;
							this.waitingForNewPathTime = 0f;
						}
						else if (this.IsWalking())
						{
							this.SetAnimatorSpeed(0.0001f);
						}
					}
					if (this.waitForPathToCharacter && ((Records.x.turnBased && !this.doingAction) || !Records.x.turnBased) && this.slideNode == null)
					{
						if (this.inCombat && !this.CanChooseActions())
						{
							this.ClearMoveTargets();
							this.waitForPathToCharacter = false;
						}
						if (this.followingType != "")
						{
							if (Records.x.astarDebugging)
							{
								Debug.Log(((this != null) ? this.ToString() : null) + " prepping path from wait, delayPathCoroutine in use");
							}
							bool flag13 = Links.x.gameplay.CanScatterPartyToMakePath(this.followingType);
							if (this.npc || this.hasActions)
							{
								flag13 = false;
							}
							this.StartGetPathToTarget(this.followingNode, this.followingCharacter, this.followingItem, this.followingBreakable, this.followingChest, this.followingDoor, this.followingInteractive, this.followingBoat, this, this.followingExit, flag13, false, false, this.followingType, false);
							this.waitForPathToCharacter = false;
						}
					}
					if (this.returnToPointTime > 0f && this.slideNode == null && this.body.currentHash == this.body.idleHash && Time.timeSinceLevelLoad > this.returnToPointTime + 2f && Time.timeSinceLevelLoad < this.returnToPointTime + 6f)
					{
						this.MakePath(this.returnToPoint, 20, false, false, false);
						this.returnToPoint = null;
						this.returnToPointTime = 0f;
					}
					if (this.animID == 1 && !this.IsWalking() && (this.body.currentHash == this.body.idleHash || this.body.currentHash == this.body.combatIdleHash))
					{
						this.animID = 0;
					}
				}
			}
			else
			{
				if (!this.physicsMove)
				{
					if (this.moving)
					{
						this.justMoved = true;
						this.timeSinceLastMove = Time.timeSinceLevelLoad;
					}
					this.moving = false;
					this.waitingForNewPath = false;
					if (this.IsWalking() && !this.dead && !this.stunned && !this.waitingForNewPath && !this.turning && !this.boatNavigator)
					{
						this.SetIdle(true);
					}
				}
				if (!this.moving && this.movePoint == Vector3.zero && this.IsWalking())
				{
					this.SetIdle(true);
				}
			}
			if (this.justMoved && Time.timeSinceLevelLoad > this.timeSinceLastMove + 0.5f)
			{
				this.justMoved = false;
			}
			if (this.pickupTime > 0f && Time.timeSinceLevelLoad > this.pickupTime + 5f)
			{
				this.pickupTime = 0f;
			}
			if (this.party && this.mapIcon)
			{
				this.mapIcon.transform.position = this.tr.position;
			}
			if (!this.moving && this.node != null && !this.turning && this.slideNode == null && !this.sailing && !Records.x.paused && this.moveFollow)
			{
				float sqrMagnitude6 = (this.moveFollow.position - this.NodePosition()).sqrMagnitude;
				float sqrMagnitude7 = (this.tr.position - this.NodePosition()).sqrMagnitude;
				if (sqrMagnitude6 > 0.25f && sqrMagnitude6 < 100f && sqrMagnitude7 < 4f)
				{
					this.SetMoveFollowPosition(Vector3.Lerp(this.moveFollow.position, this.NodePosition(), Time.deltaTime * 8f));
				}
			}
			if (this.sailing)
			{
				Vector3 position2 = this.tr.position;
				position2.y = this.nodePoint.y;
				this.SetMoveFollowPosition(Vector3.Lerp(this.moveFollow.position, position2, Time.deltaTime * 8f));
			}
			if (this.usingCircles && this.circleTr)
			{
				if (this.sailing)
				{
					this.circleTr.position = Vector3.Lerp(this.circleTr.position, this.AddVectorY(this.tr.position, 0.05f), Time.deltaTime * 40f);
				}
				else
				{
					this.circleTr.position = Vector3.Lerp(this.circleTr.position, this.AddVectorY(this.moveFollow.position, 0.05f), Time.deltaTime * 40f);
				}
			}
			RaycastHit raycastHit6;
			if (Physics.Raycast(this.tr.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit6, 6f, 4194449))
			{
				Vector3 normal = raycastHit6.normal;
				normal.y = Mathf.Clamp(normal.y, 0.97f, 1f);
				this.circleRot = Quaternion.FromToRotation(Vector3.up, normal);
				if (this.usingCircles)
				{
					this.circleTr.rotation = Quaternion.Slerp(this.circleTr.rotation, this.circleRot, Time.deltaTime * 10f);
				}
				if (this.party || this.visible == 1)
				{
					bool flag14 = false;
					if (this.hasActions && this.actions.ai && (this.actions.ai.busy || this.actions.ai.jumping))
					{
						flag14 = true;
					}
					if (!this.moving && !this.physicsMove && !this.sailing && !this.jumpingAreas && !this.pocketPaused && !this.body.IsHit() && !this.jumping && !flag14 && !this.sailing && !this.movesOnWater)
					{
						float num22 = Mathf.Abs(this.tr.position.y - raycastHit6.point.y);
						if (num22 > 0.25f && num22 < 10f)
						{
							this.SetPosition(Vector3.Lerp(this.tr.position, new Vector3(this.tr.position.x, raycastHit6.point.y, this.tr.position.z), Time.deltaTime * 25f), null);
						}
					}
				}
				if (!this.jumping && !this.jumpingAreas)
				{
					this.useGrounder = true;
					if ((normal.y < 0.95f || this.mainSelected) && !this.body.grounderOn)
					{
						this.body.SetGrounderState(true);
					}
					if (!this.sailing)
					{
						this.terrainNormal = raycastHit6.normal;
					}
				}
				else if (this.jumping)
				{
					this.useGrounder = false;
					if (this.body.grounderOn)
					{
						this.body.SetGrounderState(false);
					}
				}
			}
			if (this.dodging)
			{
				if (this.moving || this.physicsMove || this.downed || this.stunned || this.sleeping || this.dead || this.inAction || this.inRecovery || this.inQueuedAbility || this.fleeing)
				{
					this.EndDodge();
				}
				if (!this.mainSelected && Links.x.gameplay.seconds > this.blockDodgeStartTime + 17f)
				{
					this.EndDodge();
					if (this.actions && !this.inAction && !this.inRecovery && !this.inQueuedAbility && this.timelineIcon && this.timelineIcon.Nothing() && !this.actions.ai.findingAction)
					{
						Links.x.combat.GetNextAction(this);
					}
				}
			}
			if (this.mainSelected)
			{
				Links.x.partyColliderAdventure.ToggleDefend();
				bool flag15 = false;
				if (Links.x.mk && Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("DodgePathfind")))
				{
					flag15 = true;
				}
				if (Links.x.joy && !Links.x.gameplay.badgeScrolling && Links.x.gameplay.targetDodgeStart)
				{
					flag15 = true;
				}
				if (Records.x.typing || Records.x.removeControls)
				{
					flag15 = false;
				}
				if (flag15 && !this.evading && this.stats.stamina >= 10f && this.CanDefend() && !Links.x.combat.inPocketAttack && !Records.x.typing && this.slideNode == null && !this.stats.pinned && !this.stats.pinning && this.stats.Stuck() == 0)
				{
					if (!this.sailing && (!this.inCircle || (this.inCircle && !this.hasCircleBuff)))
					{
						Vector3 vector11 = this.currentPosition + Quaternion.LookRotation(this.currentPosition - Links.x.gameplay.mousePoint) * Vector3.forward * 2.5f * 1f;
						this.nodeConstraint.walkable = true;
						this.nodeConstraint.constrainWalkability = true;
						this.nodeConstraint.constrainTags = true;
						this.nodeConstraint.passID = this.nodeStationaryID;
						this.nodeConstraint.passID2 = this.nodeMovingID;
						this.nodeConstraint.checkCircleID = this.CheckCircleID();
						this.nodeConstraint.checkConnections = this.ConnectionNumber();
						this.nodeConstraint.constrainToArea = (int)this.node.Area;
						int num23 = 0;
						if (this.party)
						{
							num23 = 2;
						}
						GraphNode graphNode4 = this.GetSlideNode(vector11, this.node, false, this.CheckCircleID(), num23);
						if (graphNode4 == null)
						{
							graphNode4 = this.node;
						}
						this.look = Quaternion.LookRotation(this.tr.position - Links.x.gameplay.mousePoint);
						if (Physics.Raycast(this.torsoPosition, this.look * Vector3.forward, 2f, Links.x.allObstacles))
						{
							graphNode4 = null;
						}
						if (graphNode4 != null && this.stats.Stuck() == 0 && !this.jumping)
						{
							if (Records.x.pocketPause)
							{
								Links.x.gameplay.PocketPause(false);
							}
							if (this.dodging)
							{
								this.EndDodge();
							}
							if (this.moving)
							{
								this.ClearNodePath();
							}
							this.Jump(graphNode4, (Vector3)graphNode4.position, true, false);
							this.evading = true;
							this.stats.AddStamina(-10f);
							this.blockDodgeStartTime = Links.x.gameplay.seconds;
						}
					}
					if (!this.evading)
					{
						if (this.dodgeFX)
						{
							Links.x.cellar.ReturnPooledGameObject(91, this.dodgeFX);
							this.dodgeFX.SetActive(false);
							this.dodgeFX = null;
							this.waitToNextDodge = 0f;
						}
						if (Records.x.pocketPause)
						{
							Links.x.gameplay.PocketPause(false);
						}
						this.animator.SetBool("DefendDone", false);
						this.justMoved = false;
						this.dodging = true;
						this.stats.AddStamina(-10f);
						this.PlayAnimation("Defend", 0f);
						this.animator.SetBool("Dodging", true);
						this.blockDodgeStartTime = Links.x.gameplay.seconds;
						MasterAudio.PlaySound3DAtVector3AndForget("Main Dodge", this.tr.position, Random.Range(0.4f, 0.5f), new float?(Random.Range(0.8f, 1f)), 0f, "", null);
						if (!this.dodgeFX)
						{
							this.dodgeFX = Links.x.cellar.GetPooledGameObject(91);
							this.dodgeFX.transform.position = this.tr.position + new Vector3(0f, 0.2f, 0f);
							this.dodgeFX.SetActive(true);
						}
						this.dodgeFX.transform.GetChild(0).gameObject.GetComponent<Animator>().enabled = true;
						this.dodgeFX.transform.GetChild(0).gameObject.GetComponent<Animator>().Play("DodgeStart", -1, 0f);
						this.alwaysTurn = true;
						this.SetRotation(Quaternion.LookRotation(Links.x.gameplay.mousePoint - this.tr.position), false, false);
					}
				}
				else if (flag15)
				{
					GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(86);
					pooledGameObject.transform.position = this.body.HeadPosition(0.5f);
					pooledGameObject.SetActive(true);
					MasterAudio.PlaySound3DAtVector3AndForget("Skills", this.tr.position, Random.Range(0.8f, 0.9f), new float?(Random.Range(0.8f, 1f)), 0f, "Fail", null);
				}
				if (this.dodging && Links.x.gameplay.seconds > this.blockDodgeStartTime + 7f)
				{
					if (Links.x.gameplay.seconds < this.blockDodgeStartTime + 12f)
					{
						this.dodgeFX.transform.GetChild(0).gameObject.GetComponent<Animator>().Play("DodgeOut");
					}
					else
					{
						this.EndDodge();
						this.waitToNextDodge = 0f;
					}
				}
				if ((this.evading || !this.dodging) && Time.timeSinceLevelLoad > this.waitToNextDodge && this.waitToNextDodge > 0f)
				{
					if (this.dodgeFX)
					{
						Links.x.cellar.ReturnPooledGameObject(91, this.dodgeFX);
						this.dodgeFX.SetActive(false);
						this.dodgeFX = null;
					}
					this.waitToNextDodge = 0f;
				}
			}
			bool flag16 = false;
			if ((!this.npc || (this.npc && this.inCircle)) && ((this.inCircle && !this.npc && !this.mainSelected) || (this.inCircle && this.npc)))
			{
				int num24 = 0;
				if (this.hasActions)
				{
					num24 = this.actions.TargetCount() + this.actions.SpellCount();
				}
				if (this.actions && this.actions.ai)
				{
					if (this.actions.ai.findingAction)
					{
						flag16 = true;
					}
					if (this.actions.ai.busy)
					{
						flag16 = true;
					}
				}
				if (!this.stats.pinned && !this.stats.pinning && num24 == 0 && !this.jumping && this.IsSentient() && !this.inAction && !this.charging && !this.fleeing && !this.physicsMove && !flag16 && this.waitingForPath == 0 && !this.moving && this.NodesCount() == 0 && this.stats.Confuse() == 0 && (this.timeSinceLastDirectiveCheck == 0f || Links.x.gameplay.seconds > this.timeSinceLastDirectiveCheck + 20f) && !Links.x.combat.inPocketAttack)
				{
					GraphNode graphNode5 = this.commandMove;
					bool flag17 = false;
					if (this.commandMove != null)
					{
						graphNode5 = this.commandMove;
						float sqrMagnitude8 = ((Vector3)graphNode5.position - this.currentPosition).sqrMagnitude;
						float sqrMagnitude9 = ((Vector3)graphNode5.position - Links.x.main.tr.position).sqrMagnitude;
						if (sqrMagnitude8 < 9f || sqrMagnitude9 > 1600f)
						{
							this.commandMove = null;
							this.timeSinceLastDirectiveCheck = 0f;
						}
						else if (!this.mainSelected)
						{
							flag17 = true;
						}
					}
					if (this.inCircle && this.commandMove == null && !this.npc && !this.mainSelected)
					{
						graphNode5 = Links.x.fellowship.GetFormationPointInCircle(this);
						if (graphNode5 != null && graphNode5 != this.node)
						{
							flag17 = true;
						}
					}
					if (this.inCircle && this.npc && !this.group.InFormationMovement(this) && !this.group.inSwarmWait && !this.group.inSwarm)
					{
						graphNode5 = this.group.GetFormationPointInCircle(this, false);
						if (graphNode5 != null && graphNode5 != this.node)
						{
							flag17 = true;
						}
						else if (this.group.defensive)
						{
							this.ignoreNodeIDs = false;
						}
					}
					if (flag17)
					{
						this.timeSinceLastDirectiveCheck = Links.x.gameplay.seconds;
						this.ClearPathUpdates();
						this.ClearCurrentPathNodes();
						if (this.dodging)
						{
							this.EndDodge();
						}
						this.pathTargPosition = (Vector3)graphNode5.position;
						if (this.npc)
						{
							this.group.JoinCirclePath(graphNode5, this);
						}
						else
						{
							this.MakePath(graphNode5, 500, false, false, true);
						}
						flag16 = true;
					}
					else
					{
						this.timeSinceLastDirectiveCheck = 0f;
						if (this.inCircle && !this.hasActions && !this.npc)
						{
							if (this.GetRotationAngle(Links.x.gameplay.circleRotation, this.rot) > 60f)
							{
								this.SetRotation(Links.x.gameplay.circleRotation, true, false);
							}
						}
						else if (this.npc && !this.group.inFormationMovement && !this.group.inSwarm && this.GetRotationAngle(this.group.targetRotation, this.rot) > 40f)
						{
							this.SetRotation(this.group.targetRotation, true, false);
						}
					}
				}
			}
			if (this.hasActions && !this.mainSelected)
			{
				if (this.actions && this.actions.ai)
				{
					if (this.actions.ai.findingAction)
					{
						flag16 = true;
					}
					if (this.actions.ai.busy || this.actions.spellWaveFX)
					{
						flag16 = true;
					}
				}
				bool flag18 = true;
				if (!this.stats.pinned && !this.stats.pinning && this.IsSentient() && !this.inAction && !this.inRecovery && !this.charging && !this.inQueuedAbility && !this.isHit && (flag3 || !Records.x.pocketPause) && (!this.turning || (this.turning && this.party)) && !this.fleeing && (!this.stats.animal || (this.stats.animal && this.stats.canJumpEvade)) && !flag16 && this.NodesCount() == 0 && !this.evading && !this.jumping && flag18 && this.stats.stamina >= 10f && !Links.x.combat.inPocketAttack && this.slideNode == null)
				{
					int num25 = 0;
					if (this.combatLevel == 0)
					{
						num25 = 1;
					}
					if (this.combatLevel == 1)
					{
						num25 = 1;
					}
					if (this.combatLevel == 2)
					{
						num25 = Random.Range(0, 12);
					}
					if (this.combatLevel == 3)
					{
						num25 = Random.Range(0, 8);
					}
					if (this.combatLevel == 4)
					{
						num25 = Random.Range(0, 5);
					}
					if (this.combatLevel == 5 || this.stats.canJumpEvade)
					{
						num25 = Random.Range(0, 3);
					}
					if (this.combatLevel >= 6)
					{
						num25 = Random.Range(0, 2);
					}
					if (this.party || (!this.party && num25 == 0) || this.stats.canJumpEvade)
					{
						bool flag19 = false;
						Character character4 = this.actions.AttackInBound(out flag19);
						if (this.party && (this.tr.position - Links.x.main.tr.position).sqrMagnitude > 900f)
						{
							character4 = null;
							if (this.dodging && this.actions.TargetCount() == 0 && this.actions.SpellCount() == 0 && !this.moving)
							{
								this.actions.ai.MovetoMain();
							}
							if (this.dodging)
							{
								this.EndDodge();
							}
						}
						if (!this.sailing)
						{
							bool flag20 = true;
							Vector3 vector12 = this.actions.ai.SpecialAttackInBound(out flag19);
							if (vector12 == Vector3.zero)
							{
								flag20 = false;
								if (character4)
								{
									vector12 = character4.currentPosition;
								}
							}
							if (vector12 != Vector3.zero && this.currentPosition != vector12 && ((flag20 && Links.x.gameplay.seconds > this.timeSinceLastEvade + 5f) || this.timeSinceLastEvade == 0f || Links.x.gameplay.seconds > this.timeSinceLastEvade + 5f))
							{
								Quaternion quaternion4 = Quaternion.LookRotation(this.currentPosition - vector12);
								float num26 = -1f;
								Vector3 vector13 = this.currentPosition + quaternion4 * Vector3.forward * 2.5f * 1f;
								if (flag19)
								{
									if (Random.Range(0, 2) == 0)
									{
										num26 = 1f;
									}
									vector13 += quaternion4 * Vector3.right * num26 * 2.5f;
								}
								this.nodeConstraint.walkable = true;
								this.nodeConstraint.constrainWalkability = true;
								this.nodeConstraint.constrainTags = true;
								this.nodeConstraint.passID = this.nodeStationaryID;
								this.nodeConstraint.passID2 = this.nodeMovingID;
								this.nodeConstraint.checkConnections = this.ConnectionNumber();
								this.nodeConstraint.constrainToArea = (int)this.node.Area;
								this.nodeConstraint.checkCircleID = this.CheckCircleID();
								GraphNode graphNode6 = this.GetSlideNode(vector13, this.node, true, this.CheckCircleID(), 2);
								if (this.inCircle && graphNode6 != null)
								{
									if (this.npc)
									{
										if (!this.group.InCircle((Vector3)graphNode6.position, true, false, null))
										{
											graphNode6 = null;
										}
									}
									else if (!Links.x.fellowship.InCircle((Vector3)graphNode6.position, true))
									{
										graphNode6 = null;
									}
								}
								if (graphNode6 == null && flag19)
								{
									vector13 += quaternion4 * Vector3.right * num26 * -5f;
									graphNode6 = this.GetSlideNode(vector13, this.node, true, this.CheckCircleID(), 2);
								}
								if (graphNode6 != null && this.stats.Stuck() == 0)
								{
									float sqrMagnitude10 = ((Vector3)graphNode6.position - this.currentPosition).sqrMagnitude;
									if (sqrMagnitude10 < 40f && sqrMagnitude10 > 0.25f && PathUtilities.IsPathPossible(graphNode6, this.node))
									{
										this.timeSinceLastEvade = Links.x.gameplay.seconds;
										if (this.dodging)
										{
											this.EndDodge();
										}
										if (this.moving)
										{
											this.ClearNodePath();
										}
										this.stats.AddStamina(-10f);
										this.blockDodgeStartTime = Links.x.gameplay.seconds;
										this.Jump(graphNode6, (Vector3)graphNode6.position, true, false);
									}
								}
							}
						}
						if (character4 && !this.evading && (!this.dodging || (this.dodging && Links.x.gameplay.seconds > this.blockDodgeStartTime + 10f)) && !this.stats.animal)
						{
							this.Dodge();
							this.stats.AddStamina(-10f);
							this.actions.ai.StopLookingForAction();
						}
						if (this.dodging && character4)
						{
							if ((this.blockDodgeStartTime == Links.x.gameplay.seconds || Links.x.gameplay.seconds > this.blockDodgeStartTime + 7f) && !this.Pivoting() && Random.Range(0, 5) == 0)
							{
								if (this.actions)
								{
									this.actions.ai.TurnToEnemy(false, character4);
								}
								else
								{
									this.alwaysTurn = true;
									this.SetRotation(Quaternion.LookRotation(character4.tr.position - this.tr.position), true, false);
								}
							}
						}
						else if (this.party && this.attackTime < 0.25f && !this.Pivoting() && !this.turning && Random.Range(0, 5) == 0)
						{
							character4 = this.actions.ai.EnemyToGuardFrom();
							if (character4)
							{
								this.alwaysTurn = true;
								this.SetRotation(Quaternion.LookRotation(character4.tr.position - this.tr.position), true, false);
							}
						}
					}
				}
			}
			if (this.dodging || this.mainSelected)
			{
				if (this.dodging && this.party && this.hasActions && this.stats.formationGroup >= 7 && !this.mainSelected && this.actions && !this.inAction && !this.inRecovery && !this.inQueuedAbility && this.timelineIcon && this.timelineIcon.Nothing() && this.actions && this.actions.ai && !this.actions.ai.IsPointAwayFromEnemies(this.tr.position, false, false))
				{
					this.EndDodge();
					if (!this.actions.ai.findingAction)
					{
						Links.x.combat.GetNextAction(this);
					}
				}
				if (this.dodgeFX)
				{
					this.dodgeFX.transform.position = this.tr.position + new Vector3(0f, 0.2f, 0f);
					RaycastHit raycastHit7;
					if (Physics.Raycast(this.tr.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit7, 6f, 4194449))
					{
						Vector3 normal2 = raycastHit7.normal;
						normal2.y = Mathf.Clamp(normal2.y, 0.97f, 1f);
						this.circleRot = Quaternion.FromToRotation(Vector3.up, normal2);
						this.dodgeFX.transform.rotation = Quaternion.Slerp(this.dodgeFX.transform.rotation, this.circleRot, Time.deltaTime * 10f);
					}
				}
			}
			if (!this.hasActions)
			{
				this.inCombat = false;
			}
			this.torsoPosition = this.tr.position;
			if (this.sleeping || this.downed || this.stunned)
			{
				this.torsoPosition.y = this.torsoPosition.y + 0.5f;
			}
			else
			{
				this.torsoPosition.y = this.torsoPosition.y + (this.characterHeight - 0.5f);
			}
			this.raycastPosition = this.tr.position;
			this.raycastPosition.y = this.raycastPosition.y + 3f;
			if (this.grassInteraction)
			{
				this.grassInteraction.position = this.tr.position;
			}
			if (this.startTurnExit)
			{
				this.startTurnExit = false;
				this.TurnExit();
			}
		}
		if (this.tr)
		{
			this.currentPosition = this.tr.position;
			if (this.movesOnWater && this.waterColliderRigidbody)
			{
				this.waterColliderRigidbody.position = this.currentPosition;
			}
		}
		if (Records.x.editor && Records.x.testQuests)
		{
			if (this.stats.dead && !this.dead)
			{
				this.stats.dead = false;
				this.stats.SetHealth(0, false);
				this.body.StartDead(Vector3.up);
				this.Dead(false, true, false);
			}
			if (this.stats.stunned && !this.stunned)
			{
				this.stats.stunned = false;
				this.stats.SetHealth(0, false);
				this.Stunned(false);
			}
		}
	}

	// Token: 0x060002F1 RID: 753 RVA: 0x000404E8 File Offset: 0x0003E6E8
	private void Dodge()
	{
		this.animator.SetBool("DefendDone", false);
		this.animator.SetBool("Dodging", true);
		if (this.moving)
		{
			this.TargetReached();
		}
		this.PlayAnimation("Defend", 0f);
		if (!this.dodging)
		{
			this.blockDodgeStartTime = Links.x.gameplay.seconds;
			if (this.hasActions)
			{
				this.actions.ai.SkipFromDodge();
			}
		}
		if (!this.dodgeFX)
		{
			this.dodgeFX = Links.x.cellar.GetPooledGameObject(91);
			this.dodgeFX.transform.position = this.tr.position + new Vector3(0f, 0.2f, 0f);
			this.dodgeFX.SetActive(true);
			this.dodgeFX.transform.rotation = this.circleRot;
		}
		this.dodging = true;
	}

	// Token: 0x060002F2 RID: 754 RVA: 0x000405EC File Offset: 0x0003E7EC
	public void UpdatePositions()
	{
		this.PositionEffects();
		if (this.npc && this.hasActions)
		{
			this.SetStaminaBarPosition();
		}
		if (this.party && this.dead && this.revivalGem)
		{
			this.SetRevivalGemPosition();
		}
		if (!this.npc)
		{
			this.SetSelectedPosition();
		}
		if (this.charmed)
		{
			this.SetHeartPosition();
		}
		if (this.seen)
		{
			if (Time.timeSinceLevelLoad > this.seenTime + 2f && !Records.x.pocketPause)
			{
				this.seenTime = 0f;
				this.seen.SetActive(false);
				Links.x.cellar.ReturnPooledGameObject(23, this.seen);
				this.seen = null;
			}
			else
			{
				this.SetSeenPosition();
			}
		}
		if (this.heard)
		{
			this.SetHeardPosition();
		}
	}

	// Token: 0x060002F3 RID: 755 RVA: 0x000406D0 File Offset: 0x0003E8D0
	public void WorldUI()
	{
		if (!Links.x.gaia.sceneLoaded || this.inactive)
		{
			this.SetActiveStateWorldUI(this.visible);
			return;
		}
		if (this.party && this.hasActions && this == Links.x.pocketWheel.selectedRallyCharacter && Links.x.combat.inPocketAttack)
		{
			this.SetActiveStateWorldUI(this.visible);
			return;
		}
		if (this.visible == 0)
		{
			this.SetActiveStateWorldUI(this.visible);
			return;
		}
		if (this.worldUIFade == null)
		{
			this.worldUIFade = this.WorldUIFade();
			base.StartCoroutine(this.worldUIFade);
		}
	}

	// Token: 0x060002F4 RID: 756 RVA: 0x0004077E File Offset: 0x0003E97E
	private IEnumerator WorldUIFade()
	{
		yield return new WaitForSeconds(0.001f);
		while (this.body.dithering)
		{
			yield return null;
		}
		this.SetActiveStateWorldUI(this.visible);
		this.worldUIFade = null;
		yield break;
	}

	// Token: 0x060002F5 RID: 757 RVA: 0x00040790 File Offset: 0x0003E990
	public void SetActiveStateWorldUI(int vis)
	{
		if (vis == 1)
		{
			if (this.seen)
			{
				this.seen.SetActive(true);
			}
			if (this.heard)
			{
				this.heard.SetActive(true);
			}
			if (this.stamina)
			{
				this.stamina.Activate();
			}
			if (this.statusRing)
			{
				this.statusRing.gameObject.SetActive(true);
			}
			for (int i = 0; i < this.headEffects.Count; i++)
			{
				if (this.headEffects[i])
				{
					this.headEffects[i].SetActive(true);
				}
			}
			if (this.hasActions && this.actions.chargeUpFX)
			{
				this.actions.chargeUpFX.SetActive(true);
				return;
			}
		}
		else
		{
			if (this.seen)
			{
				this.seen.SetActive(false);
			}
			if (this.heard)
			{
				this.heard.SetActive(false);
			}
			if (this.stamina)
			{
				this.stamina.Deactivate();
			}
			if (this.statusRing)
			{
				this.statusRing.gameObject.SetActive(false);
			}
			for (int j = 0; j < this.headEffects.Count; j++)
			{
				if (this.headEffects[j])
				{
					this.headEffects[j].SetActive(false);
				}
			}
			if (this.hasActions && this.actions.chargeUpFX)
			{
				this.actions.chargeUpFX.SetActive(false);
			}
		}
	}

	// Token: 0x060002F6 RID: 758 RVA: 0x00040948 File Offset: 0x0003EB48
	private void Jumping()
	{
		if (this.jumpLanding)
		{
			if (this.moveNode != null)
			{
				this.SetMoveFollowPosition((Vector3)this.moveNode.position);
			}
			this.jumping = false;
			if (!this.InAttack() && this.IsSentient())
			{
				this.PlayAnimation("Idle", Random.Range(0f, 1f));
			}
			if (this.evading && !this.mainSelected && this.actions && this.actions.ai)
			{
				this.moving = true;
				this.Dodge();
				if (this.actions)
				{
					this.actions.ai.TurnToEnemy(true, null);
				}
			}
			this.StopEvading();
			if (!this.dodging)
			{
				this.TurnExit();
				return;
			}
		}
		else
		{
			if (this.currentArcIndex >= 0 && this.currentArcIndex < this.arcPoints.Count)
			{
				if (this.mainSelected && this.evading && !Links.x.combat.miniEvent)
				{
					if (Links.x.mk && Input.GetKeyUp(Links.x.gameplay.keyControl.GetHotkey("DodgePathfind")))
					{
						this.needToEndJump = true;
					}
					if (Links.x.joy && (Links.x.gameplay.targetDodgeUp || Links.x.gameplay.gameFeedScrolling))
					{
						this.needToEndJump = true;
					}
					if (Links.x.combat.miniEvent)
					{
						this.needToEndJump = true;
					}
					this.slideNode = null;
					this.slideNodePosition = Vector3.zero;
					if (!this.cc.enabled)
					{
						this.cc.enabled = true;
						this.cc.transform.position = this.tr.position;
						this.cc.transform.rotation = this.tr.rotation;
					}
					if (!this.playerBorders.enabled)
					{
						this.playerBorders.enabled = true;
					}
					if (this.currentArcIndex == 1)
					{
						this.needToEndJump = false;
						this.look = Quaternion.LookRotation(Links.x.gameplay.mousePoint - this.tr.position);
						this.SetRotation(Quaternion.LookRotation(Links.x.gameplay.mousePoint - this.tr.position), false, true);
						this.jumpSpeed = 50f;
						this.currentArcIndex = 2;
						this.jumpTime = Links.x.gameplay.seconds;
					}
					RaycastHit raycastHit;
					if (Physics.SphereCast(this.tr.position + new Vector3(0f, 10f, 0f), 0.25f, -1f * this.upVector, out raycastHit, 100f, 4194433))
					{
						this.groundPoint = raycastHit.point;
					}
					else
					{
						this.groundPoint = this.tr.position;
					}
					if (this.needToEndJump)
					{
						this.jumpSpeed -= Time.deltaTime * 500f;
					}
					else
					{
						this.jumpSpeed -= Time.deltaTime * 130f;
					}
					Vector3 vector = this.look * Vector3.forward * this.jumpSpeed * Time.deltaTime;
					if (this.groundPoint.y < this.tr.position.y)
					{
						vector.y -= 2f;
					}
					this.cc.Move(vector);
					if (this.node != null)
					{
						this.setArea = (int)this.node.Area;
					}
					GraphNode graphNode = this.NearNode(this.groundPoint, false, 0, 2, 0);
					this.sphere.transform.position = this.tr.position;
					if (graphNode != this.node && graphNode != null)
					{
						this.savedPathTarget = graphNode;
						this.ClaimNode(graphNode, (Vector3)graphNode.position, false);
						Links.x.gameplay.CheckTileEffects(this, this.node, false);
					}
					this.prevNodePosition = this.tr.position;
					if (this.jumpSpeed > 8f)
					{
						bool flag = this.needToEndJump;
					}
					if (this.jumpSpeed <= 0f)
					{
						this.jumping = false;
						this.jumpLanding = false;
						this.jumpSpeed = 0f;
						this.StopEvading();
						if (!this.InAttack() && this.IsSentient())
						{
							this.PlayAnimation("Idle", Random.Range(0f, 1f));
						}
						if (!Links.x.combat.miniEvent)
						{
							this.TurnExit();
						}
						this.SetMoveFollowPosition(this.currentPosition);
					}
				}
				else
				{
					Vector3 vector2 = this.arcPoints[this.currentArcIndex];
					bool flag2 = false;
					if (this.hasActions && !this.ambushing && this.npc && this.actions && this.actions.ai.jumping)
					{
						flag2 = true;
					}
					float num = Vector3.Distance(this.topJumpPoint, this.tr.position);
					if (num > 2f)
					{
						num = 2f;
					}
					num *= 0.5f;
					num = 1f - num;
					float num2 = 2.5f * Time.deltaTime * 10f;
					if (flag2)
					{
						num2 = (5f - num) * Time.deltaTime * 10f;
					}
					if (this.isHitFlying)
					{
						num *= 3f;
						num2 = (5f - num) * Time.deltaTime * 10f;
					}
					Transform transform = this.tr;
					Vector3 vector3 = Vector3.MoveTowards(transform.position, vector2, num2);
					this.SetPosition(vector3, null);
					if (this.body.stateInfo.shortNameHash == this.body.jumpLoopHash)
					{
						this.SetMoveFollowPosition(vector2);
					}
					this.slideNode = null;
					this.slideNodePosition = Vector3.zero;
					float sqrMagnitude = (transform.position - vector2).sqrMagnitude;
					if (this.isHitFlying)
					{
						int count = this.arcPoints.Count;
						if (this.currentArcIndex < 1)
						{
							this.SetRotation(Quaternion.LookRotation(this.movePoint - this.prevPoint), false, false);
						}
						if (this.currentArcIndex > count - 3)
						{
							this.SetRotation(Quaternion.LookRotation(this.movePoint - this.prevPoint), false, false);
							this.body.tr.rotation = Quaternion.Slerp(this.body.tr.rotation, Quaternion.Euler(Vector3.zero), Time.deltaTime * 40f);
						}
						if (this.currentArcIndex <= count - 3 && this.currentArcIndex >= 1)
						{
							this.tr.Rotate(this.randomRot * 20f * Time.deltaTime);
							this.rot = this.tr.rotation;
							this.smoothRot = this.tr.rotation;
						}
					}
					if (sqrMagnitude < 0.0001f || (this.currentArcIndex == this.arcPoints.Count - 1 && sqrMagnitude < 0.010000001f) || Links.x.gameplay.seconds > this.jumpTime + 80f)
					{
						this.currentArcIndex++;
						if (this.evading)
						{
							if (this.currentArcIndex < this.arcPoints.Count + 4)
							{
								this.currentArcIndex += 3;
							}
							else
							{
								this.currentArcIndex = this.arcPoints.Count - 1;
							}
						}
						if (this.currentArcIndex > this.arcPoints.Count - 3 && this.isHitFlying && !this.stats.HasEffect("ImpactStun"))
						{
							this.KnockbackEnd(false);
						}
						if (this.currentArcIndex >= this.arcPoints.Count)
						{
							this.jumpLanding = true;
							if (this.hasActions && this.actions && this.actions.ai && this.actions.ai.jumping)
							{
								this.actions.ai.jumpDone = true;
							}
							this.currentArcIndex--;
							if (this.isHitFlying)
							{
								this.SetRotation(Quaternion.LookRotation(this.movePoint - this.prevPoint), false, true);
								this.isHitFlying = false;
								this.PlayAnimation("Hit Down", 0f);
							}
						}
					}
					else
					{
						this.SetRotation(this.look, false, false);
					}
				}
				this.body.tr.localRotation = Quaternion.Euler(Vector3.zero);
				return;
			}
			this.SetMoveFollowPosition((Vector3)this.moveNode.position);
			this.jumping = false;
			if (this.isHitFlying)
			{
				this.isHitFlying = false;
			}
			this.TurnExit();
		}
	}

	// Token: 0x060002F7 RID: 759 RVA: 0x0004124C File Offset: 0x0003F44C
	public void KnockbackEnd(bool fromKick)
	{
		MasterAudio.PlaySound3DAtVector3AndForget("Body Fall", this.currentPosition, 1f, new float?(1f), 0.5f, "", null);
		Effects effects = base.gameObject.AddComponent<Effects>();
		Links.x.cellar.AddEffects(effects);
		effects.gameObject.SetActive(true);
		effects.source = null;
		effects.target = this;
		effects.fromLoad = false;
		effects.effectName = "ImpactStun";
		effects.sourceLevel = 0f;
		effects.Inflicted(true);
		GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(112);
		pooledGameObject.transform.position = this.tr.position;
		pooledGameObject.SetActive(true);
		if (fromKick)
		{
			this.isHitFlying = false;
		}
		this.ignoreNodeIDs = false;
		if (!fromKick && this.movePoint != this.prevPoint)
		{
			this.SetRotation(Quaternion.LookRotation(this.movePoint - this.prevPoint), false, true);
		}
	}

	// Token: 0x060002F8 RID: 760 RVA: 0x0004135C File Offset: 0x0003F55C
	public bool NearFriend(out Vector3 testPointLeader, out GraphNode lookFor)
	{
		Vector3 vector = this.tr.position;
		testPointLeader = this.friendLeader.tr.position;
		lookFor = this.friendLeader.node;
		if (this.NodesCount() > 0)
		{
			if (this.savedPathTarget != null)
			{
				vector = (Vector3)this.savedPathTarget.position;
			}
			else
			{
				vector = (Vector3)this.GetLastNode().position;
			}
		}
		if (this.friendLeader.NodesCount() > 0 || this.friendLeader.moving)
		{
			if (this.friendLeader.savedPathTarget != null)
			{
				testPointLeader = (Vector3)this.friendLeader.savedPathTarget.position;
				lookFor = this.friendLeader.savedPathTarget;
			}
			else if (this.friendLeader.NodesCount() > 0)
			{
				testPointLeader = (Vector3)this.friendLeader.GetLastNode().position;
				lookFor = this.friendLeader.GetLastNode();
			}
		}
		return (vector - testPointLeader).sqrMagnitude <= 36f;
	}

	// Token: 0x060002F9 RID: 761 RVA: 0x00041474 File Offset: 0x0003F674
	public void UpdateCC()
	{
		if (!this.physicsMove && this.mainSelected)
		{
			if (this.cc)
			{
				if (this.party && (!this.mainSelected || (this.mainSelected && !this.cc.enabled)))
				{
					this.cc.enabled = false;
					this.cc.transform.position = this.tr.position;
					this.cc.transform.rotation = this.tr.rotation;
					this.cc.enabled = true;
					this.cc.enabled = false;
					return;
				}
				if (this.mainSelected && !this.physicsMove)
				{
					if (this.cc.enabled)
					{
						this.cc.transform.position = this.tr.position;
						this.cc.transform.rotation = this.tr.rotation;
						return;
					}
					this.cc.enabled = false;
					this.cc.transform.position = this.tr.position;
					this.cc.transform.rotation = this.tr.rotation;
					this.cc.enabled = true;
					this.cc.enabled = false;
					return;
				}
			}
		}
		else if (!this.mainSelected && this.cc)
		{
			this.cc.enabled = false;
		}
	}

	// Token: 0x060002FA RID: 762 RVA: 0x00041600 File Offset: 0x0003F800
	public bool CanPhysicsMove(bool wasd)
	{
		if (((!Links.x.mk || Input.GetMouseButtonUp(0)) && (!Links.x.joy || Links.x.gameplay.actionDown || Links.x.gameplay.actionUp || Links.x.gameplay.descWindowOpen || Links.x.gameplay.hudLeftOpen || Links.x.gameplay.hudRightOpen || Links.x.gameplay.spellTargetingGround)) || Records.x.typing || Records.x.removeControls || Records.x.pocketPause || Records.x.paused || Links.x.combat.miniEvent || !Links.x.gaia.sceneLoaded || !Links.x.gaia.pathfindingReady || Records.x.dialogue || this.inAction || this.inRecovery || this.inQueuedAbility || Records.x.inMenus || this.slideNode != null || this.isHit || !this.IsSentient())
		{
			return false;
		}
		if (Links.x.mk && Links.x.gameplay.clickStartOnUIHover)
		{
			return wasd;
		}
		if (Links.x.mk && this.followingType != "")
		{
			return wasd;
		}
		return this.stats.Stuck() <= 0 && this.stats.Confuse() <= 0 && !this.fleeing && (Links.x.joy || !Links.x.gameplay.uiHover || !Links.x.mk || !Links.x.gameplay.uiHover || !Links.x.gameplay.clickStartOnUIHover);
	}

	// Token: 0x060002FB RID: 763 RVA: 0x0004184C File Offset: 0x0003FA4C
	public bool CanDefend()
	{
		return this.IsSentient() && !this.dead && !this.downed && !this.inAction && !this.inRecovery && !this.inQueuedAbility && !this.dodging && !this.waitingForDodgeUp && !this.fleeing && !Records.x.typing && !this.stats.pinning && !this.stats.pinned && !this.isHit && !Records.x.removeControls && !Links.x.combat.inPocketAttack && !Links.x.combat.miniEvent;
	}

	// Token: 0x060002FC RID: 764 RVA: 0x0004190C File Offset: 0x0003FB0C
	public bool CanAttack()
	{
		return this.IsSentient() && !this.stats.pinned && !this.stats.pinning && !this.isHit && !this.inAction && !this.fleeing && !this.inQueuedAbility && this.attackTime >= 1f && this.stats.Confuse() == 0 && !this.IsAttacking(this.body.currentHash);
	}

	// Token: 0x060002FD RID: 765 RVA: 0x0004198C File Offset: 0x0003FB8C
	public bool CanStartSpin()
	{
		if (Records.x.typing || Records.x.removeControls || Records.x.pocketPause || Records.x.paused || !Links.x.gaia.sceneLoaded || !Links.x.gaia.pathfindingReady || Records.x.dialogue || this.inAction || this.inRecovery || this.inQueuedAbility || Records.x.inMenus || this.slideNode != null || !this.IsSentient())
		{
			return false;
		}
		if (this.stats.Stuck() > 0)
		{
			return false;
		}
		if (this.stats.Confuse() > 0)
		{
			return false;
		}
		if (this.fleeing)
		{
			return false;
		}
		bool joy = Links.x.joy;
		return true;
	}

	// Token: 0x060002FE RID: 766 RVA: 0x00041A74 File Offset: 0x0003FC74
	private void StopMove()
	{
		int currentHash = this.body.currentHash;
		if (currentHash == this.body.walkHash || currentHash == this.body.walkStartHash || currentHash == this.body.walkBackHash || currentHash == this.body.walkBackStartHash || currentHash == this.body.combatWalkHash || currentHash == this.body.walkPartyHash || currentHash == this.body.combatWalkStartHash || currentHash == this.body.runHash || currentHash == this.body.runStartHash)
		{
			if (this.slideNode == null)
			{
				this.animator.SetBool("Idle", true);
				if (this.animID == 1)
				{
					this.animID = 0;
				}
			}
			if (Links.x.gaia.sceneLoaded)
			{
				this.timeSinceMoveEnded = Time.timeSinceLevelLoad + Random.Range(3f, 8f);
			}
		}
		this.lastRotation = this.tr.rotation;
		this.moving = false;
		if (this.turning)
		{
			this.EndTurning(false);
		}
		this.turningMain = false;
		this.physicsY = Vector3.zero;
		this.physicsMove = false;
		this.ClaimNode(this.node, this.tr.position, false);
		if (this.IsWalking() || this.turningMain)
		{
			this.moveFollow.position = this.tr.position;
		}
		this.mainMovePoint = Vector3.zero;
	}

	// Token: 0x060002FF RID: 767 RVA: 0x00041BEC File Offset: 0x0003FDEC
	public void EndDodge()
	{
		this.dodging = false;
		this.animator.SetBool("Dodging", false);
		this.animator.SetBool("DefendDone", true);
		if (this.dodgeFX)
		{
			Links.x.cellar.ReturnPooledGameObject(91, this.dodgeFX);
			this.dodgeFX = null;
		}
	}

	// Token: 0x06000300 RID: 768 RVA: 0x00041C4D File Offset: 0x0003FE4D
	public bool CanChooseActions()
	{
		return true;
	}

	// Token: 0x06000301 RID: 769 RVA: 0x00041C50 File Offset: 0x0003FE50
	public bool CanMove()
	{
		if (this.jumping && !Records.x.paused && this.party && (!this.pocketPaused || this.pocketPausedOverride))
		{
			return true;
		}
		if (Links.x.combat.inPocketAttack && !this.pocketPaused && this.party)
		{
			return true;
		}
		if (this.body.IsHit())
		{
			this.SetAnimatorSpeed(1f);
		}
		return !this.body.IsHit() && !this.stats.pinned && !this.stats.pinning && !this.turning && !this.dodging && this.moveNode != null && this.slideNode == null && this.prevNodePosition != this.vectorZero && this.moveTurns > 0f && !this.inAction && !this.inRecovery && !this.inQueuedAbility && this.CanChooseActions() && !Records.x.paused && !this.pocketPaused && !this.downed;
	}

	// Token: 0x06000302 RID: 770 RVA: 0x00041D72 File Offset: 0x0003FF72
	public bool IsSentient()
	{
		return !this.dead && !this.downed && !this.stunned && !this.offMap && !this.sleeping;
	}

	// Token: 0x06000303 RID: 771 RVA: 0x00041DA0 File Offset: 0x0003FFA0
	public bool CanMakePath()
	{
		return !this.offMap && this.slideNode == null && this.CanChooseActions() && ((Records.x.turnBased && !this.doingAction) || !Records.x.turnBased) && this.CheckControls() && !this.downed && !this.dead && !this.sleeping && !this.stunned;
	}

	// Token: 0x06000304 RID: 772 RVA: 0x00041E10 File Offset: 0x00040010
	public bool CheckControls()
	{
		return !this.offMap && !this.turning && this.IsSentient() && !Records.x.paused && !this.pocketPaused && (!Records.x.dialogue || (Records.x.dialogue && this.ignoreRemoveControls));
	}

	// Token: 0x06000305 RID: 773 RVA: 0x00041E6C File Offset: 0x0004006C
	public void ChangePauseState()
	{
		if (!Records.x.paused)
		{
			if (!this.moving)
			{
				this.prePausedSpeed = 1f;
			}
			if (this.waitingToUseItem)
			{
				Links.x.inventory.UseItemFromPause(this.waitingToUseBagItem, this.waitingToUseBeltItemIndex, this.waitingToUseBeltItemID, this);
				if (this.portrait)
				{
					this.portrait.QueueIcon(false);
				}
			}
			this.SetAnimatorSpeed(this.prePausedSpeed);
			return;
		}
		if (!this.pocketPaused)
		{
			this.prePausedSpeed = this.animator.speed;
		}
		this.animator.speed = 0f;
	}

	// Token: 0x06000306 RID: 774 RVA: 0x00041F14 File Offset: 0x00040114
	public void ChangePocketPauseState()
	{
		if (false)
		{
			return;
		}
		if (Links.x.combat.bubbleEvent && this == Links.x.combat.bubbleEventTarget)
		{
			this.pocketPaused = false;
			this.pocketPausedOverride = false;
			this.prePausedSpeed = 1f;
			this.SetAnimatorSpeed(1f);
			return;
		}
		bool flag = false;
		if (Links.x.combat.inPocketAttack)
		{
			if (this == Links.x.pocketWheel.selectedRallyCharacter)
			{
				flag = true;
			}
		}
		else
		{
			flag = this.mainSelected;
		}
		if (!flag || (flag && Links.x.combat.bubbleEvent))
		{
			this.pocketPausedOverride = false;
			if (!Records.x.pocketPause && !Links.x.combat.inPocketAttack)
			{
				if (this.dead)
				{
					this.body.PocketGore(true);
				}
				this.pocketPaused = false;
				this.pocketPausedOverride = false;
				if (this.blockedTime == 0f && this.prePausedSpeed < 0.1f)
				{
					this.prePausedSpeed = 1f;
				}
				this.SetAnimatorSpeed(this.prePausedSpeed);
				this.NeedToUpdateSailingAnimator(false);
				return;
			}
			if (!this.pocketPaused)
			{
				this.prePausedSpeed = this.animator.speed;
			}
			if (!this.moving)
			{
				this.prePausedSpeed = 1f;
			}
			this.SetAnimatorSpeed(0f);
			this.animator.speed = 0f;
			this.pocketPaused = true;
			this.currentAnimatorSpeed = 0f;
			if (this.dead)
			{
				this.body.PocketGore(false);
				return;
			}
		}
		else
		{
			if (this.pocketPaused)
			{
				this.pocketPaused = false;
				this.prePausedSpeed = 1f;
				this.SetAnimatorSpeed(1f);
			}
			this.pocketPaused = false;
			this.pocketPausedOverride = false;
		}
	}

	// Token: 0x06000307 RID: 775 RVA: 0x000420E8 File Offset: 0x000402E8
	public void OverridePocketPause()
	{
		bool flag = false;
		if (Links.x.combat.inPocketAttack)
		{
			if (this == Links.x.pocketWheel.selectedRallyCharacter)
			{
				flag = true;
			}
		}
		else
		{
			flag = this.mainSelected;
		}
		if (flag && (this.inAction || this.inQueuedAbility || this.inRecovery) && this.actions && !Links.x.combat.bubbleEvent)
		{
			return;
		}
		this.pocketPausedOverride = true;
		this.SetAnimatorSpeed(this.prePausedSpeed);
		if (this.party && !Links.x.combat.bubbleEvent)
		{
			this.pocketPaused = false;
		}
	}

	// Token: 0x06000308 RID: 776 RVA: 0x00042198 File Offset: 0x00040398
	private void GetPatrolHoldTime(bool addRandom)
	{
		this.patrolHoldTime = Time.timeSinceLevelLoad;
		if (this.stats.isGuard || this.stats.allegiance == 7U)
		{
			this.patrolHoldTime += 8f;
			if (addRandom)
			{
				this.patrolHoldTime += Random.Range(0f, 5f);
			}
		}
		else if (this.stats.allegiance == 6U || this.stats.allegiance == 5U || this.stats.allegiance == 0U)
		{
			this.patrolHoldTime += Random.Range(12f, 25f);
		}
		else if (this.stats.allegiance == 9U)
		{
			this.patrolHoldTime += Random.Range(10f, 20f);
		}
		else
		{
			this.patrolHoldTime += Random.Range(4f, 8f);
			if (addRandom)
			{
				this.patrolHoldTime += Random.Range(0f, 3f);
			}
		}
		if (this.stats.merchant)
		{
			this.patrolHoldTime = Time.timeSinceLevelLoad + Random.Range(0.1f, 2f);
		}
	}

	// Token: 0x06000309 RID: 777 RVA: 0x000422DC File Offset: 0x000404DC
	public bool Pivoting()
	{
		return this.body.stateInfo.shortNameHash == this.body.patrolLeftHash || this.body.stateInfo.shortNameHash == this.body.patrolRightHash || this.body.stateInfo.shortNameHash == this.body.patrolLeft45Hash || this.body.stateInfo.shortNameHash == this.body.patrolRight45Hash || this.body.stateInfo.shortNameHash == this.body.combatPivotLeftHash || this.body.stateInfo.shortNameHash == this.body.combatPivotRightHash || this.body.stateInfo.shortNameHash == this.body.combatPivotLeft45Hash || this.body.stateInfo.shortNameHash == this.body.combatPivotRight45Hash || this.body.stateInfo.shortNameHash == this.body.combatPivot180 || this.body.stateInfo.shortNameHash == this.body.patrol180 || this.body.stateInfo.shortNameHash == this.body.combatPivotLeftBackHash || this.body.stateInfo.shortNameHash == this.body.combatPivotRightBackHash || this.body.stateInfo.shortNameHash == this.body.combatPivotLeft45BackHash || this.body.stateInfo.shortNameHash == this.body.combatPivotRight45BackHash || this.body.stateInfo.shortNameHash == this.body.combatPivotBack180;
	}

	// Token: 0x0600030A RID: 778 RVA: 0x000424C0 File Offset: 0x000406C0
	public bool HasPivotID()
	{
		return this.animID == 21 || this.animID == 22 || this.animID == 32 || this.animID == 31 || this.animID == 43 || this.animID == 44 || this.animID == 45 || this.animID == 46 || this.animID == 47 || this.animID == 48;
	}

	// Token: 0x0600030B RID: 779 RVA: 0x00042534 File Offset: 0x00040734
	public float GetRotationAngle(Quaternion r1, Quaternion r2)
	{
		Vector3 eulerAngles = r1.eulerAngles;
		eulerAngles.x = 0f;
		eulerAngles.z = 0f;
		r1 = Quaternion.Euler(eulerAngles);
		Vector3 eulerAngles2 = r2.eulerAngles;
		eulerAngles.x = 0f;
		eulerAngles.z = 0f;
		r2 = Quaternion.Euler(eulerAngles2);
		return Quaternion.Angle(r1, r2);
	}

	// Token: 0x0600030C RID: 780 RVA: 0x00042598 File Offset: 0x00040798
	public void UpdateRotation()
	{
		if (this.mainSelected && !this.fleeing && this.physicsMove && !this.pocketPaused && !Records.x.dialogue && !this.turning && (this.moving || this.physicsMove) && !this.turningMain)
		{
			this.savedRot = this.body.tr.rotation;
			return;
		}
		if (this.IsSentient() && !this.body.IsHit() && !this.pocketPaused && !this.ambushing && !this.stats.pinned && !this.downed && this.body.currentHash != this.body.downStartHash && this.body.currentHash != this.body.downHash && !this.resting)
		{
			if (this.Pivoting() && !this.turning)
			{
				this.rot = this.body.tr.rotation;
				this.smoothRot = this.rot;
				this.savedRot = this.rot;
				if (this.body.lookAtController.hasTarget)
				{
					this.body.lookAtController.EndLook();
					return;
				}
			}
			else
			{
				Quaternion quaternion = this.rot;
				Quaternion quaternion2 = this.smoothRot;
				Quaternion quaternion3 = this.body.tr.rotation;
				Quaternion quaternion4 = this.tr.rotation;
				Vector3 vector = quaternion.eulerAngles;
				vector.x = 0f;
				vector.z = 0f;
				quaternion = Quaternion.Euler(vector);
				vector = quaternion2.eulerAngles;
				vector.x = 0f;
				vector.z = 0f;
				quaternion2 = Quaternion.Euler(vector);
				vector = quaternion3.eulerAngles;
				vector.x = 0f;
				vector.z = 0f;
				quaternion3 = Quaternion.Euler(vector);
				vector = quaternion4.eulerAngles;
				vector.x = 0f;
				vector.z = 0f;
				quaternion4 = Quaternion.Euler(vector);
				if (quaternion4 != quaternion || this.turning)
				{
					Vector3 forward = this.tr.forward;
					Vector3 vector2 = this.rot * Vector3.forward;
					Vector3.Dot(forward, vector2);
					float rotationAngle = this.GetRotationAngle(quaternion, quaternion3);
					bool flag = false;
					if (!this.physicsMove && this.moving)
					{
						flag = true;
					}
					if (this.mainSelected && this.physicsMove && !this.turningMain)
					{
						flag = true;
					}
					if (this.blockedTime > 0f)
					{
						flag = true;
					}
					if (this.waitingForNewPath || this.jumping)
					{
						flag = true;
					}
					if (this.slideNode != null)
					{
						flag = true;
					}
					bool alwaysRootMotion = this.stats.characterRow._AlwaysRootMotion;
					if (this.NodesCount() > 0 && !alwaysRootMotion)
					{
						flag = true;
					}
					if (this.alwaysTurn && !this.ignoreRemoveControls)
					{
						this.patrolSpeed = 2f;
						flag = false;
						this.alwaysTurn = false;
					}
					if ((Records.x.pocketPause && this.pocketPaused) || Records.x.miniGame)
					{
						flag = true;
					}
					if (alwaysRootMotion && rotationAngle > 40f)
					{
						flag = false;
					}
					if (this.jumping)
					{
						flag = true;
					}
					if (this.sailing && this.boatNavigator)
					{
						flag = true;
					}
					if (this.IsSentient() && (this.turning || (!flag && rotationAngle > 40f)))
					{
						bool hasRootMotionTurn = this.stats.characterRow._HasRootMotionTurn;
						float num = Quaternion.Angle(quaternion, quaternion2);
						float num2 = Quaternion.Angle(this.intervalRot, quaternion2);
						float num3 = Quaternion.Angle(quaternion, quaternion3);
						bool flag2 = this.mainSelected;
						if ((this.turning && this.turnTimeStarted != 0f && Time.timeSinceLevelLoad > this.turnTimeStarted + 2f) || (this.turning && (quaternion == quaternion2 || num < 15f || (this.turning && num3 < 15f && hasRootMotionTurn)) && rotationAngle < 15f))
						{
							if (this.inAction)
							{
								if (!this.moving)
								{
									this.EndTurning(true);
								}
								else
								{
									this.EndTurning(false);
								}
							}
							if (this.turning && this.turnTimeStarted != 0f && Time.timeSinceLevelLoad > this.turnTimeStarted + 2f)
							{
								this.SetRotation(this.rot, false, true);
							}
							this.turning = false;
							this.rot = this.SlopedRotation(this.tr.rotation);
							quaternion2 = this.SlopedRotation(this.tr.rotation);
							this.animator.SetBool("TurningDone", true);
							if (!hasRootMotionTurn)
							{
								this.SetIdle(true);
							}
							this.turnTimeStarted = 0f;
							this.savedRot = this.tr.rotation;
							return;
						}
						if (rotationAngle > 15f || num2 < 10f || !this.turning)
						{
							if (!this.turning)
							{
								bool flag3 = this.mainSelected;
								this.SetIdle(false);
							}
							this.animator.SetBool("TurningDone", false);
							this.rotationTime = 0f;
							this.startRot = quaternion2;
							this.startRotY = this.startRot.eulerAngles.y;
							if (!this.turning)
							{
								this.turnTimeStarted = Time.timeSinceLevelLoad;
							}
							this.turning = true;
							this.savedRot = quaternion;
							this.SetAnimatorSpeed(1f);
							this.turnDirection = this.AngleDir(quaternion3 * Vector3.forward, quaternion * Vector3.forward, Vector3.up);
							float num4 = num;
							if (num4 <= 45f)
							{
								Vector3 eulerAngles = quaternion2.eulerAngles;
								this.intervalY = eulerAngles.y + num4 * this.turnDirection;
								this.intervalRot = quaternion;
							}
							else
							{
								Vector3 eulerAngles2 = quaternion2.eulerAngles;
								this.intervalY = eulerAngles2.y + 45f * this.turnDirection;
								this.intervalRot = Quaternion.Euler(new Vector3(eulerAngles2.x, this.intervalY, eulerAngles2.z));
							}
						}
						if (this.turning)
						{
							if (hasRootMotionTurn && !this.stats.pinning)
							{
								if (!this.Pivoting())
								{
									float num5 = Vector3.Dot(Vector3.Cross(quaternion3 * Vector3.forward, quaternion * Vector3.forward), Vector3.up);
									bool flag4 = this.hasActions;
									float num6 = 100f;
									float num7 = 60f;
									if (this.party)
									{
										num6 = 100f;
										num7 = 60f;
									}
									if (this.animator.GetBool("Combat"))
									{
										if (num5 < 0f)
										{
											if (num > num6)
											{
												this.PlayAnimation("CombatPivot180", 0f);
											}
											else if (num > num7 && num <= num6)
											{
												this.PlayAnimation("CombatPivotLeft90", 0f);
											}
											else
											{
												this.PlayAnimation("CombatPivotLeft45", 0f);
											}
										}
										else if (num > num6)
										{
											this.PlayAnimation("CombatPivot180", 0f);
										}
										else if (num > num7 && num <= num6)
										{
											this.PlayAnimation("CombatPivotRight90", 0f);
										}
										else
										{
											this.PlayAnimation("CombatPivotRight45", 0f);
										}
									}
									else if (num5 < 0f)
									{
										if (num > num6)
										{
											this.PlayAnimation("Patrol180", 0f);
										}
										else if (num > num7 && num <= num6)
										{
											this.PlayAnimation("PatrolLeft90", 0f);
										}
										else
										{
											this.PlayAnimation("PatrolLeft45", 0f);
										}
									}
									else if (num > num6)
									{
										this.PlayAnimation("Patrol180", 0f);
									}
									else if (num > num7 && num <= num6)
									{
										this.PlayAnimation("PatrolRight90", 0f);
									}
									else
									{
										this.PlayAnimation("PatrolRight45", 0f);
									}
								}
								this.SetAnimatorSpeed(1f);
								this.smoothRot = this.body.tr.rotation;
							}
							else
							{
								this.SetIdle(true);
								float num8 = 12f;
								this.rotationTime += Time.deltaTime * num8;
								float num9 = Mathf.Lerp(this.startRotY, this.intervalY, this.rotationTime);
								this.smoothRot = Quaternion.Euler(new Vector3(0f, num9, 0f));
								this.tr.rotation = this.smoothRot;
							}
						}
					}
					bool flag5 = this.moving;
					if (this.IsWalking())
					{
						flag5 = true;
					}
					if (this.boatNavigator)
					{
						flag5 = false;
					}
					if (!this.turning && !this.stunned && !this.dead && !this.downed && !this.Pivoting() && !this.body.nextFrameRotateToChild)
					{
						if (this.turning)
						{
							this.EndTurning(true);
						}
						if (flag5)
						{
							float num10 = 30f;
							if (Records.x.miniGame)
							{
								num10 = 100f;
							}
							this.smoothRot = Quaternion.Slerp(this.smoothRot, this.rot, Time.deltaTime * num10);
						}
						else
						{
							float num11 = 35f;
							if (this.slowLook)
							{
								this.smoothRot = this.SlopedRotation(this.tr.rotation);
								this.rot = this.SlopedRotation(this.tr.rotation);
								if (this.slowLook)
								{
									Quaternion quaternion5 = this.rot;
									vector = quaternion5.eulerAngles;
									vector.z = 0f;
									vector.x = 0f;
									quaternion5 = Quaternion.Euler(vector);
									vector2 = quaternion5 * Vector3.forward;
									if (this.body.headBone && !Records.x.dialogue)
									{
										this.lookAtTurnTarget.transform.position = this.body.HeadPosition(0f) + vector2 * 10f + new Vector3(0f, 0f, 0f);
										this.body.lookAtController.SetNewTarget(this.lookAtTurnTarget, 0f, 0f, false);
									}
								}
								this.slowLook = false;
							}
							else
							{
								float num12 = 1f;
								if (this.summoned && this.npc)
								{
									num12 = 3f;
								}
								this.smoothRot = Quaternion.Slerp(this.smoothRot, this.rot, Time.deltaTime * num11 * num12);
							}
						}
						this.tr.rotation = this.smoothRot;
						this.savedRot = this.smoothRot;
						return;
					}
				}
				else if (this.turning)
				{
					this.EndTurning(true);
				}
			}
		}
	}

	// Token: 0x0600030D RID: 781 RVA: 0x00043074 File Offset: 0x00041274
	public void EndTurning(bool playIdle)
	{
		this.turning = false;
		this.RotateToChild();
		this.turnTimeStarted = 0f;
		if (playIdle)
		{
			this.rot = this.SlopedRotation(this.tr.rotation);
			this.smoothRot = this.SlopedRotation(this.tr.rotation);
			this.SetIdle(true);
		}
	}

	// Token: 0x0600030E RID: 782 RVA: 0x000430D1 File Offset: 0x000412D1
	public Quaternion SlopeRotation()
	{
		return Quaternion.FromToRotation(Vector3.up, this.terrainNormal);
	}

	// Token: 0x0600030F RID: 783 RVA: 0x000430E4 File Offset: 0x000412E4
	public Quaternion FinalSlopedRotation(Quaternion wantedRotation)
	{
		Quaternion quaternion = wantedRotation;
		if (this.rotateToSlope && !this.sailing && !this.movesOnWater)
		{
			Quaternion quaternion2 = Quaternion.FromToRotation(this.tr.up, this.terrainNormal);
			if (this.turning)
			{
				quaternion = quaternion2 * wantedRotation;
			}
		}
		return quaternion;
	}

	// Token: 0x06000310 RID: 784 RVA: 0x00043138 File Offset: 0x00041338
	public Quaternion SlopedRotation(Quaternion wantedRotation)
	{
		Quaternion quaternion = wantedRotation;
		if (this.rotateToSlope && !this.sailing && !this.movesOnWater)
		{
			Quaternion quaternion2 = Quaternion.FromToRotation(this.tr.up, this.terrainNormal);
			if (this.turning)
			{
				quaternion = quaternion2 * wantedRotation;
			}
			else
			{
				quaternion = Quaternion.Slerp(this.smoothRot, quaternion2 * wantedRotation, 10f * Time.deltaTime);
			}
		}
		return quaternion;
	}

	// Token: 0x06000311 RID: 785 RVA: 0x000431AC File Offset: 0x000413AC
	public void SetPosition(Vector3 pt, GraphNode n)
	{
		if (this.stats.Stuck() > 0 && this.npc && !this.jumpingAreas && !this.jumpingPosition && !this.jumping)
		{
			return;
		}
		if (this.movesOnWater && this.waterCollisions && this.waterCollisions.sliding)
		{
			return;
		}
		if (n == null)
		{
			this.tr.position = pt;
			return;
		}
		this.tr.position = (Vector3)n.position;
	}

	// Token: 0x06000312 RID: 786 RVA: 0x00043234 File Offset: 0x00041434
	public void SetMoveFollowPosition(Vector3 pt)
	{
		if ((this.tr.position - pt).sqrMagnitude > 36f && !this.jumping && !this.sailing)
		{
			if (!this.ignoreRemoveControls && !this.jumpingAreas && !this.jumpingPosition && this.npc && !this.ambushing)
			{
				float num = 36f;
				if (!this.npc)
				{
					num = 225f;
				}
				if ((this.tr.position - new Vector3(pt.x, this.tr.position.y, pt.z)).sqrMagnitude > num)
				{
					this.ClaimNode(null, this.tr.position, true);
					this.TargetReached();
				}
			}
			if (!this.jumpingAreas && !this.ignoreRemoveControls && Records.x.editor && !this.summoned && !this.body.IsHit())
			{
				string[] array = new string[13];
				array[0] = ((this != null) ? this.ToString() : null);
				array[1] = " MOVE FOLLOW TOO FAR ";
				int num2 = 2;
				Vector3 vector = pt;
				array[num2] = vector.ToString();
				array[3] = " ";
				array[4] = this.tr.position.ToString();
				array[5] = " ";
				array[6] = this.body.stateInfo.shortNameHash.ToString();
				array[7] = " ";
				array[8] = this.nodePath.Count.ToString();
				array[9] = " ";
				array[10] = this.inactive.ToString();
				array[11] = " ";
				array[12] = this.moving.ToString();
				Debug.Log(string.Concat(array));
			}
		}
		if (!float.IsNaN(pt.x) && !float.IsNaN(pt.y) && !float.IsNaN(pt.z) && this.moveFollow)
		{
			this.moveFollow.position = pt;
		}
	}

	// Token: 0x06000313 RID: 787 RVA: 0x00043461 File Offset: 0x00041661
	public void SetAttackTarget(Character c)
	{
		this.attackTarget = c;
		this.attackTargetTime = Links.x.gameplay.seconds;
	}

	// Token: 0x06000314 RID: 788 RVA: 0x00043480 File Offset: 0x00041680
	public void SetRotation(Quaternion newRot, bool ikLook, bool instant)
	{
		if (this.stats.pinned)
		{
			return;
		}
		Vector3 eulerAngles = newRot.eulerAngles;
		if (!this.rotateToSlope)
		{
			eulerAngles.x = 0f;
			eulerAngles.z = 0f;
		}
		newRot = Quaternion.Euler(eulerAngles);
		this.rot = this.FinalSlopedRotation(newRot);
		this.slowLook = ikLook;
		if (this.inCombat || this.hasActions)
		{
			this.slowLook = false;
		}
		if (instant)
		{
			if (this.turning)
			{
				this.EndTurning(false);
			}
			this.smoothRot = newRot;
			this.rot = this.SlopedRotation(newRot);
			this.tr.rotation = newRot;
			this.body.tr.localRotation = Quaternion.Euler(Vector3.zero);
			this.alwaysTurn = false;
			return;
		}
		if (Quaternion.Angle(newRot, this.body.tr.rotation) > 45f && (this.alwaysTurn || !this.turning))
		{
			if (this.alwaysTurn && this.turning)
			{
				this.EndTurning(false);
				this.savedRot = this.rot;
			}
			this.UpdateRotation();
			return;
		}
		this.alwaysTurn = false;
	}

	// Token: 0x06000315 RID: 789 RVA: 0x000435A8 File Offset: 0x000417A8
	public void SetMeshState(bool on)
	{
		if (this.inactive || this.missing)
		{
			on = false;
		}
		if (this.ambushing && !this.jumping)
		{
			on = false;
		}
		if (this.meshAlwaysOn && !this.missing)
		{
			on = true;
		}
		if (this.isBoro && Links.x.gaia.boroControls.boroInvisible)
		{
			on = false;
		}
		if (!on)
		{
			this.visible = 0;
			if (this.grassInteraction && !Records.x.removeControls && !Links.x.combat.inRally && !Links.x.combat.inPocketAttack)
			{
				Links.x.cellar.ReturnPooledGameObject(89, this.grassInteraction.gameObject);
				this.grassInteraction = null;
			}
			if (this.audioSource)
			{
				this.audioSource.enabled = false;
			}
			if (this.movesOnWater && !Links.x.combat.inPocketAttack)
			{
				if (this.waterColliderRigidbody)
				{
					this.waterColliderRigidbody.isKinematic = true;
					this.waterCollisions.sliding = false;
				}
				if (this.splash)
				{
					Links.x.cellar.ReturnPooledGameObject(141, this.splash);
					this.splash = null;
				}
			}
			this.WorldUI();
		}
		else
		{
			this.visible = 1;
			if (!this.grassInteraction)
			{
				GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(89);
				if (pooledGameObject)
				{
					this.grassInteraction = pooledGameObject.transform;
					pooledGameObject.SetActive(true);
				}
				if (this.needsRebind && this.body)
				{
					this.body.anim.Rebind();
					this.body.anim.Update(0f);
				}
			}
			if (this.audioSource)
			{
				this.audioSource.enabled = true;
			}
			if (this.movesOnWater)
			{
				if (this.waterColliderRigidbody)
				{
					this.waterColliderRigidbody.isKinematic = false;
				}
				if (!this.splash && !this.stats.flying)
				{
					this.splash = Links.x.cellar.GetPooledGameObject(141);
					this.splash.SetActive(false);
				}
			}
			this.WorldUI();
		}
		if (this.body)
		{
			this.body.SetMeshState(on, true);
		}
	}

	// Token: 0x06000316 RID: 790 RVA: 0x00043820 File Offset: 0x00041A20
	public float GetAnimatorVariation(int multiple)
	{
		if (multiple == 2)
		{
			int num = Random.Range(0, 2);
			if (num == 0)
			{
				return 0f;
			}
			if (num == 1)
			{
				return 1f;
			}
		}
		else if (multiple == 3)
		{
			int num2 = Random.Range(0, 3);
			if (num2 == 0)
			{
				return 0f;
			}
			if (num2 == 1)
			{
				return 0.5f;
			}
			if (num2 == 2)
			{
				return 1f;
			}
		}
		return 0f;
	}

	// Token: 0x06000317 RID: 791 RVA: 0x0004387C File Offset: 0x00041A7C
	public void RotateToChild()
	{
		this.body.tr.parent = null;
		this.tr.rotation = this.body.tr.rotation;
		this.rot = this.SlopedRotation(this.tr.rotation);
		this.smoothRot = this.rot;
		this.body.tr.parent = this.tr;
		this.body.tr.localRotation = Quaternion.Euler(Vector3.zero);
	}

	// Token: 0x06000318 RID: 792 RVA: 0x00043908 File Offset: 0x00041B08
	public bool InAttack()
	{
		return this.inAction || this.inRecovery || this.inQueuedAbility;
	}

	// Token: 0x06000319 RID: 793 RVA: 0x00043928 File Offset: 0x00041B28
	public bool IsAttacking(int hash)
	{
		return hash == this.body.basicAttackHash || hash == this.body.basicAttack2Hash || hash == this.body.basicAttack3Hash || hash == this.body.basicAttack4Hash || hash == this.body.special1Hash || hash == this.body.special2Hash || hash == this.body.special3Hash || hash == this.body.special4Hash || hash == this.body.special5Hash || hash == this.body.powerDraw || hash == this.body.quickAttackHash;
	}

	// Token: 0x0600031A RID: 794 RVA: 0x000439E6 File Offset: 0x00041BE6
	public bool IsCasting(int hash)
	{
		return hash == this.body.channelHash;
	}

	// Token: 0x0600031B RID: 795 RVA: 0x000439F9 File Offset: 0x00041BF9
	public bool IsTrinketing(int hash)
	{
		return hash == this.body.instrumentHash || hash == this.body.charmHash;
	}

	// Token: 0x0600031C RID: 796 RVA: 0x00043A1C File Offset: 0x00041C1C
	public bool ActionAnimID()
	{
		return this.body.stateInfo.shortNameHash == this.body.basicAttackHash || this.body.stateInfo.shortNameHash == this.body.basicAttack2Hash || this.body.stateInfo.shortNameHash == this.body.basicAttack3Hash || this.body.stateInfo.shortNameHash == this.body.basicAttack4Hash || this.body.stateInfo.shortNameHash == this.body.quickAttackHash || this.body.stateInfo.shortNameHash == this.body.defendHash || this.body.stateInfo.shortNameHash == this.body.channelHash || this.body.stateInfo.shortNameHash == this.body.special1Hash || this.body.stateInfo.shortNameHash == this.body.special2Hash || this.body.stateInfo.shortNameHash == this.body.special3Hash || this.body.stateInfo.shortNameHash == this.body.kickHash || this.body.stateInfo.shortNameHash == this.body.useHash || this.body.stateInfo.shortNameHash == this.body.powerDraw || this.body.stateInfo.shortNameHash == this.body.instrumentHash || this.body.stateInfo.shortNameHash == this.body.charmHash || this.body.stateInfo.shortNameHash == this.body.channelHash;
	}

	// Token: 0x0600031D RID: 797 RVA: 0x00043C1C File Offset: 0x00041E1C
	public void PlayAnimation(string animName, float animTime)
	{
		if (this.inactive && !this.hasActions)
		{
			return;
		}
		bool flag = false;
		bool flag2 = false;
		if (this.party)
		{
			if (Links.x.combat.inPocketAttack)
			{
				if (this == Links.x.pocketWheel.selectedRallyCharacter)
				{
					flag2 = true;
				}
			}
			else
			{
				flag2 = this.mainSelected;
			}
		}
		if (flag2)
		{
			if (Links.x.combat.miniEvent && !Links.x.combat.bubbleEvent)
			{
				flag = true;
			}
			if (Links.x.combat.inPocketAttack && this.NodesCount() == 0)
			{
				flag = true;
			}
		}
		if (this.dead && !flag && !animName.Contains("Death"))
		{
			return;
		}
		if ((this.downed || this.sleeping) && !this.dead && !flag && !animName.Contains("Hit Down") && !animName.Contains("GetUp") && !animName.Contains("Suplex"))
		{
			if (this.body.currentHash == this.body.hitDownHash)
			{
				return;
			}
			animName = "Hit Down";
		}
		if (this.stunned && !flag)
		{
			if (this.body.currentHash == this.body.hitDownHash || this.isHit)
			{
				return;
			}
			animName = "Hit Down";
		}
		if (this.isHit && !flag && !this.stunned && !this.dead && !animName.Contains("Hit") && !animName.Contains("Death"))
		{
			return;
		}
		if ((this.animID == 25 || this.animID == 26) && !flag && this.animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 0.5f && (animName.Contains("Walk") || animName.Contains("Pivot") || animName.Contains("Idle") || animName.Contains("Patrol")))
		{
			return;
		}
		if (flag && !animName.Contains("Attack"))
		{
			return;
		}
		if (this.animID == 53)
		{
			return;
		}
		bool flag3 = true;
		string text = "";
		bool flag4 = this.stats.pinned;
		if (this.stats.pinning)
		{
			flag4 = true;
		}
		this.prevAnimID = this.animID;
		if ((this.stats.pinning || this.stats.pinned) && animName != "Pinning" && !animName.Contains("Down") && (!animName.Contains("Hit") || !this.stats.pinning) && !animName.Contains("Death"))
		{
			if (this.animID == 50)
			{
				return;
			}
			animName = "Pinning";
		}
		if (this.inCombat && this.hasActions && !flag && (this.animID == 14 || this.inAction || this.IsAttacking(this.body.currentHash) || this.IsCasting(this.body.currentHash)) && !this.pocketPaused)
		{
			bool flag5 = false;
			if ((animName.Contains("Pivot") || animName.Contains("Patrol")) && this.hasActions && this.actions.rolling)
			{
				flag5 = true;
			}
			if (!animName.Contains("Charm") && !animName.Contains("Excited") && !animName.Contains("Attack") && !animName.Contains("Cast") && !animName.Contains("Channel") && !animName.Contains("Kick") && !animName.Contains("Instrument") && !flag5)
			{
				if (!animName.Contains("Down") && !animName.Contains("Death") && !animName.Contains("Thrown") && !animName.Contains("Interrupt") && !animName.Contains("Bounce"))
				{
					return;
				}
				this.actions.Interrupt();
				if (this.animID == 8)
				{
					return;
				}
			}
		}
		if (animName.Contains("Idle"))
		{
			if (!this.npc && this.hasActions)
			{
				bool hasTarget = this.actions.hasTarget;
			}
			if (this.resting && (this.inCircle || !this.hasActions))
			{
				if (this.inCircle)
				{
					if (this.stats.hasCircleAnims)
					{
						text = "Fatigued";
					}
					else
					{
						text = "Hit_down";
					}
				}
				else
				{
					text = "Hit_down";
				}
				this.animator.SetBool("Idle", false);
				this.FinishAnimation(false, text, animTime, 0);
				this.SetAnimatorSpeed(1f);
				return;
			}
			if (this.party)
			{
				if (this.inTown && !this.hasActions)
				{
					this.animator.SetBool("Combat", false);
				}
				else
				{
					this.inTown = false;
				}
				if (!this.inTown && Time.timeSinceLevelLoad > this.timeSinceMoveEnded && this.timeSinceMoveEnded != 0f && this.timeSinceMoveEnded != -100f)
				{
					this.timeSinceMoveEnded = -100f;
				}
			}
			if (((this.summoned || this.npc) && (this.inCombat || this.hasActions || this.searching)) || (!this.inTown && this.party && this.timeSinceMoveEnded != -100f) || (this.hasActions && this.party) || (this.summoned && !this.npc && Records.x.InCombat(false)))
			{
				text = "Combat_Idle_loop";
				this.animator.SetBool("Combat", true);
			}
			else
			{
				text = "Idle";
				this.animator.SetBool("Combat", false);
			}
			this.animID = 0;
			if (this.animID != this.prevAnimID || !Links.x.gaia.sceneLoaded)
			{
				flag3 = false;
				this.SetIdle(true);
			}
			if (!flag3)
			{
				float num = this.GetAnimatorVariation(3);
				if (this.stats.hasCustomIdle && !this.hasActions)
				{
					num = 1f;
				}
				if (!this.sailing)
				{
					this.animator.SetFloat("Combat Variation", this.GetAnimatorVariation(2));
				}
				if (this.party && !this.inTown && !this.sailing)
				{
					if (!this.hasActions)
					{
						this.animator.SetFloat("Combat Variation", 1f);
					}
					else
					{
						this.animator.SetFloat("Combat Variation", 0f);
					}
				}
				if (!this.sailing)
				{
					this.animator.SetFloat("Idle Variation", num);
				}
				animTime = Random.Range(0f, 1f);
			}
			this.animator.SetBool("Was Walking", false);
			this.FinishAnimation(flag3, text, animTime, 0);
			this.SetAnimatorSpeed(1f);
			if (this.sailing)
			{
				this.NeedToUpdateSailingAnimator(false);
			}
			return;
		}
		else
		{
			if (animName.Contains("Walk"))
			{
				if (this.stats.Stuck() == 0)
				{
					this.animator.SetBool("Was Walking", false);
					this.animID = 1;
					if (this.animID != this.prevAnimID || !this.IsWalking())
					{
						flag3 = false;
					}
					if (this.body.sneaking && !this.npc)
					{
						text = "Walk_start";
						this.animator.SetBool("Combat", false);
					}
					else
					{
						if (this.inCombat && !this.fleeing)
						{
							this.animator.SetBool("Combat", true);
							text = "Combat_walk_start";
							if (this.stats.isFishMonster)
							{
								bool flag6 = false;
								if (this.inCircle && this.group && (this.group.inFormationMovement || this.group.inFormationWait || this.group.inSwarm || this.group.inSwarmWait))
								{
									flag6 = true;
								}
								if (this.charging || this.evading || this.moveBackTarget || flag6)
								{
									this.animator.SetFloat("Combat Variation", 1f);
								}
								else
								{
									this.animator.SetFloat("Combat Variation", this.GetAnimatorVariation(2));
								}
							}
							else if (!this.sailing)
							{
								this.animator.SetFloat("Combat Variation", this.GetAnimatorVariation(2));
							}
						}
						else
						{
							if (this.party)
							{
								if (this.inTown && !this.hasActions)
								{
									this.animator.SetBool("Combat", false);
								}
								else
								{
									this.inTown = false;
								}
								if (!this.inTown && this.timeSinceMoveEnded == -100f)
								{
									if (this.mainSelected)
									{
										this.timeSinceMoveEnded = 0f;
										flag3 = false;
									}
									else if (Links.x.main.moving || Links.x.main.physicsMove || (Links.x.main.tr.position - this.tr.position).sqrMagnitude > 625f)
									{
										this.timeSinceMoveEnded = 0f;
										flag3 = false;
									}
								}
							}
							if ((this.party && !this.inTown && this.timeSinceMoveEnded != -100f) || (this.party && this.hasActions) || (!Records.x.removeControls && this.running && !this.summoned && !this.inTown))
							{
								this.animator.SetBool("Combat", true);
								text = "Combat_walk_start";
							}
							else if (this.running && !this.stats.animal && this.ignoreRemoveControls && !this.inTown)
							{
								text = "Combat_walk_start";
								this.animator.SetBool("Combat", true);
							}
							else
							{
								text = "Walk_start";
								this.animator.SetBool("Combat", false);
							}
						}
						if (this.animator.GetBool("Combat"))
						{
							if (this.moveBackTarget)
							{
								text = "Combat_walk_start_back";
								this.animator.SetBool("Backward", true);
								this.moveBackward = true;
							}
							else
							{
								this.animator.SetBool("Backward", false);
								this.moveBackward = false;
							}
						}
					}
					if (!flag3 && this.body.tr.localRotation.eulerAngles.y != 0f)
					{
						this.RotateToChild();
					}
					this.SetIdle(false);
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
				}
				return;
			}
			if (animName.Contains("Patrol"))
			{
				if (animName.Contains("Left"))
				{
					if (animName.Contains("45"))
					{
						text = "Patrol_rotate_left 45";
						this.animID = 21;
					}
					else
					{
						text = "Patrol_rotate_left";
						this.animID = 22;
					}
				}
				else if (animName.Contains("Right"))
				{
					if (animName.Contains("45"))
					{
						text = "Patrol_rotate_right 45";
						this.animID = 44;
					}
					else
					{
						text = "Patrol_rotate_right";
						this.animID = 45;
					}
				}
				else
				{
					text = "Patrol_rotate_180";
					this.animID = 43;
				}
				if (this.animID != this.prevAnimID || this.t >= 0.95f)
				{
					flag3 = false;
				}
				this.FinishAnimation(flag3, text, animTime, 0);
				if (!flag3)
				{
					this.SetAnimatorSpeed(1f);
				}
				this.canSwitchBackToIdle = true;
				return;
			}
			if (animName.Contains("CombatPivot"))
			{
				if (animName.Contains("Left"))
				{
					if (animName.Contains("45"))
					{
						text = "Pivot Left 45";
						this.animID = 31;
					}
					else
					{
						text = "Pivot Left 90";
						this.animID = 30;
					}
				}
				else if (animName.Contains("Right"))
				{
					if (animName.Contains("45"))
					{
						text = "Pivot Right 45";
						this.animID = 46;
					}
					else
					{
						text = "Pivot Right 90";
						this.animID = 47;
					}
				}
				else
				{
					text = "Pivot 180";
					this.animID = 48;
				}
				if (this.moveBackward)
				{
					text += " back";
				}
				float normalizedTime = this.animator.GetCurrentAnimatorStateInfo(0).normalizedTime;
				if (this.animID != this.prevAnimID || normalizedTime >= 0.95f)
				{
					flag3 = false;
				}
				this.FinishAnimation(flag3, text, animTime, 0);
				if (!flag3)
				{
					this.SetAnimatorSpeed(1f);
				}
				this.canSwitchBackToIdle = true;
				return;
			}
			if (animName.Contains("BasicAttack"))
			{
				this.animID = 2;
				if (!this.IsAttacking(this.body.currentHash))
				{
					if (this.attackSpeed == 0f)
					{
						this.attackSpeed = 1f;
					}
					this.animator.SetFloat("Attack Variation", this.GetAnimatorVariation(3));
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Combat_basic_attack";
					this.NeedToUpdateSailingAnimator(false);
					if (this.needsRebind && this.body)
					{
						this.body.anim.Rebind();
						this.body.anim.Update(0f);
					}
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(this.attackSpeed);
					}
					this.canSwitchBackToIdle = true;
				}
				return;
			}
			if (animName.Contains("SynergyAttack"))
			{
				if (this.attackSpeed == 0f)
				{
					this.attackSpeed = 1f;
				}
				if (animName.Contains("1"))
				{
					text = "Combat_synergy_normal_1";
					this.animID = 15;
				}
				else if (animName.Contains("2"))
				{
					if (!Links.x.rallyStage.playing)
					{
						text = "Combat_synergy_normal_2";
					}
					else
					{
						text = "Combat_synergy_2";
					}
					this.animID = 16;
				}
				this.NeedToUpdateSailingAnimator(false);
				flag3 = false;
				this.FinishAnimation(false, text, animTime, 0);
				if (!flag3)
				{
					this.SetAnimatorSpeed(1f);
				}
				this.canSwitchBackToIdle = true;
				return;
			}
			if (animName.Contains("SecondAttack"))
			{
				this.animID = 2;
				this.NeedToUpdateSailingAnimator(false);
				if (this.attackSpeed == 0f)
				{
					this.attackSpeed = 1f;
				}
				this.animator.SetFloat("Attack Variation", this.GetAnimatorVariation(3));
				flag3 = false;
				text = "Combat_lefthand_attack";
				this.FinishAnimation(false, text, animTime, 0);
				if (!flag3)
				{
					this.SetAnimatorSpeed(this.attackSpeed);
				}
				this.canSwitchBackToIdle = true;
				this.animator.Update(0f);
				return;
			}
			if (animName.Contains("Instrument"))
			{
				if (animName.Contains("Horn"))
				{
					text = "Combat_instrument_horn";
					this.animID = 32;
				}
				else if (animName.Contains("Pipes"))
				{
					text = "Combat_instrument_pipes";
					this.animID = 41;
				}
				else
				{
					text = "Combat_instrument_flute";
					this.animID = 42;
				}
				this.NeedToUpdateSailingAnimator(false);
				if (this.animID != this.prevAnimID)
				{
					flag3 = false;
				}
				this.FinishAnimation(false, text, animTime, -1);
				if (!flag3)
				{
					this.SetAnimatorSpeed(1f);
				}
				this.canSwitchBackToIdle = false;
				return;
			}
			if (animName.Contains("Defend") && !flag4)
			{
				this.animID = 3;
				if (this.animID != this.prevAnimID)
				{
					flag3 = false;
				}
				text = "Defend";
				this.FinishAnimation(false, text, animTime, 0);
				if (!flag3)
				{
					this.SetAnimatorSpeed(1f);
				}
				this.canSwitchBackToIdle = false;
				return;
			}
			if (animName == "Hype" && !flag4)
			{
				if (this.animator.GetBool("Hyped"))
				{
					this.animID = 51;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Hype";
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = false;
					return;
				}
				return;
			}
			else
			{
				if (animName == "Fatigued" && !flag4)
				{
					this.animID = 52;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Fatigued";
					if (!this.stats.hasCircleAnims)
					{
						text = "Hit_down";
					}
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = false;
					return;
				}
				if (animName.Contains("Block") && !flag4)
				{
					if (animName.Contains("armor"))
					{
						text = "Block_armor";
						this.animID = 4;
					}
					else
					{
						text = "Block_dodge";
						this.animID = 5;
					}
					flag3 = false;
					this.FinishAnimation(flag3, text, animTime, -1);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Death"))
				{
					this.NeedToUpdateSailingAnimator(true);
					if (animName.Contains("1"))
					{
						text = "Death_1";
						this.animID = 6;
					}
					else
					{
						text = "Death_1";
						this.animID = 7;
					}
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = false;
					return;
				}
				if (animName.Contains("JumpStart"))
				{
					this.animID = 33;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Jump_start";
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = false;
					return;
				}
				if (animName.Contains("JumpDown"))
				{
					this.animID = 34;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Jump_end";
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Hit"))
				{
					if (animName.Contains("Down"))
					{
						if (!this.animator.GetCurrentAnimatorStateInfo(0).IsName("Hit_down"))
						{
							text = "Hit_down_start";
						}
						else
						{
							text = "Hit_down";
						}
						this.animID = 8;
						if (this.animID != this.prevAnimID)
						{
							flag3 = false;
						}
						this.canSwitchBackToIdle = false;
						this.PlayFaceAnimation(FaceAnimations.AnimationNames.Sleep);
					}
					else if (animName.Contains("Bounce") && !flag4)
					{
						text = "Hit_bounce";
						this.animID = 9;
						if (this.animID != this.prevAnimID)
						{
							flag3 = false;
						}
						this.canSwitchBackToIdle = false;
						if (this.hasActions)
						{
							this.actions.Interrupt();
						}
					}
					else if (animName.Contains("Suplex") && !flag4)
					{
						text = "Hit_suplex";
						this.animID = 53;
						if (this.animID != this.prevAnimID)
						{
							flag3 = false;
						}
						this.canSwitchBackToIdle = false;
					}
					else if (this.animID != 9)
					{
						if (animName.Contains("Interrupt") && this.actions && !this.jumping)
						{
							this.actions.Interrupt();
						}
						if (!this.jumping && !this.stats.pinned)
						{
							if (this.turning)
							{
								this.EndTurning(false);
							}
							this.animID = 10;
							text = "Hit";
							animTime = 0f;
							flag3 = false;
							this.SetAnimatorSpeed(1f);
							this.canSwitchBackToIdle = true;
						}
					}
					this.FinishAnimation(flag3, text, animTime, -1);
					return;
				}
				if (animName.Contains("CombatStart") && !flag4)
				{
					this.animID = 11;
					this.animator.SetBool("Combat", true);
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Combat_start";
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
						this.RotateToChild();
					}
					return;
				}
				if (animName.Contains("CombatEnd") && !flag4)
				{
					this.animID = 12;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Combat_end";
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Cast") && !flag4)
				{
					text = "Cast";
					this.animID = 14;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(false, text, animTime, -1);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("GetUp"))
				{
					this.animID = 24;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					text = "Get_up";
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					this.PlayFaceAnimation(FaceAnimations.AnimationNames.Blink);
					return;
				}
				if (animName.Contains("Kick"))
				{
					this.animID = 25;
					if (this.animID != this.prevAnimID)
					{
					}
					text = "Kick";
					this.FinishAnimation(false, text, animTime, -1);
					if (!false)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					this.kickUseTime = Time.timeSinceLevelLoad;
					return;
				}
				if (animName.Contains("Use"))
				{
					this.animID = 26;
					text = "Combat_use_trinket_or_potion";
					this.FinishAnimation(false, text, animTime, -1);
					if (!false)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					this.kickUseTime = Time.timeSinceLevelLoad;
					return;
				}
				if (animName.Contains("Pinning"))
				{
					this.animID = 50;
					if (this.stats.pinning)
					{
						text = "Combat_pins";
						bool flag7 = false;
						if (this.hasActions && this.actions.ai.pinLow)
						{
							flag7 = true;
						}
						if (flag7)
						{
							this.animator.SetFloat("Pins", 0.5f);
						}
						else
						{
							this.animator.SetFloat("Pins", 0f);
						}
					}
					else
					{
						text = "Combat_pins";
						this.animator.SetFloat("Pins", 1f);
					}
					this.FinishAnimation(false, text, animTime, -1);
					if (!false)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Talk"))
				{
					if (animName.Contains("1"))
					{
						text = "Talk_1";
						this.animID = 18;
					}
					else if (animName.Contains("2"))
					{
						text = "Talk_2";
						this.animID = 19;
					}
					else if (animName.Contains("3"))
					{
						text = "Talk_3";
						this.animID = 20;
					}
					else if (animName.Contains("Arms"))
					{
						text = "Talk_1";
						this.animID = 37;
					}
					else if (animName.Contains("Beseech"))
					{
						text = "Talk_1";
						this.animID = 38;
					}
					else if (animName.Contains("Explain"))
					{
						text = "Talk_1";
						this.animID = 39;
					}
					else if (animName.Contains("Grateful"))
					{
						text = "Talk_1";
						this.animID = 40;
					}
					this.animator.SetBool("Idle", false);
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = false;
					return;
				}
				if (animName.Contains("Heard") && !flag4)
				{
					text = "Heard";
					this.animID = 27;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(flag3, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Stop"))
				{
					text = "Walk_end";
					this.animID = 23;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(flag3, text, animTime, 0);
					this.SetAnimatorSpeed(1f);
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Excited"))
				{
					text = "Excited";
					this.animID = 1;
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.animator.SetFloat("Excited Variation", this.GetAnimatorVariation(3));
					this.FinishAnimation(flag3, text, animTime, 0);
					this.SetAnimatorSpeed(1f);
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Charm"))
				{
					this.animID = 36;
					text = "Combat_charm";
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				if (animName.Contains("Distress"))
				{
					this.animID = 49;
					text = "Distress";
					if (this.animID != this.prevAnimID)
					{
						flag3 = false;
					}
					this.FinishAnimation(false, text, animTime, 0);
					if (!flag3)
					{
						this.SetAnimatorSpeed(1f);
					}
					this.canSwitchBackToIdle = true;
					return;
				}
				return;
			}
		}
	}

	// Token: 0x0600031E RID: 798 RVA: 0x00045440 File Offset: 0x00043640
	public void FinishAnimation(bool same, string mecanimName, float animTime, int restart)
	{
		if (!same && mecanimName != "" && !this.inactive && this.animator.runtimeAnimatorController != null)
		{
			if (mecanimName.Contains("Idle") && !this.hasActions)
			{
				animTime = Random.Range(0f, 1f);
			}
			if (this.canSwitchBackToIdle)
			{
				this.body.waitForCrossFadeTime = Time.timeSinceLevelLoad;
			}
			if (this.animID != 43 && this.animID != 44 && this.animID != 45 && this.animID != 46 && this.animID != 47 && this.animID != 48 && this.animID != 21 && this.animID != 22 && this.animID != 30 && this.animID != 31 && this.animID != 8 && this.animID != 32 && this.animID != 41 && this.animID != 42 && this.animID != 2)
			{
				float num = 0.03f;
				if (this.stats.hasCustomIdle && this.animID == 0)
				{
					num = 0.1f;
				}
				this.animator.CrossFadeInFixedTime(mecanimName, num, restart, animTime);
				return;
			}
			this.animator.Play(mecanimName, restart, animTime);
		}
	}

	// Token: 0x0600031F RID: 799 RVA: 0x000455AC File Offset: 0x000437AC
	public void PlayFaceAnimation(FaceAnimations.AnimationNames faceAnimName)
	{
		if (this.body.headAnim && (this.visible == 1 || this.sleeping || this.stunned))
		{
			if ((this.stunned || this.sleeping) && faceAnimName != FaceAnimations.AnimationNames.Sleep)
			{
				return;
			}
			if (this.dead && faceAnimName != FaceAnimations.AnimationNames.Dead)
			{
				return;
			}
			this.body.headAnim.PlayAnimation(faceAnimName);
		}
	}

	// Token: 0x06000320 RID: 800 RVA: 0x00045619 File Offset: 0x00043819
	public void PlayFaceAnimation(string n)
	{
		if (this.body.headAnim && this.visible == 1)
		{
			this.body.headAnim.PlayAnimation(n);
		}
	}

	// Token: 0x06000321 RID: 801 RVA: 0x00045647 File Offset: 0x00043847
	public void SetHeadEmotion(string type)
	{
		if (this.body.headAnim)
		{
			this.body.headAnim.emotion = type;
		}
	}

	// Token: 0x06000322 RID: 802 RVA: 0x0004566C File Offset: 0x0004386C
	public void CircleAnimation(string animationToPlay)
	{
		if (this.dead)
		{
			return;
		}
		if (this.inactive)
		{
			return;
		}
		if (this.visible == 0 && (this.npc || Records.x.inOverworldMap))
		{
			return;
		}
		if (!this.usingCircles)
		{
			return;
		}
		if (!this.circleTr)
		{
			return;
		}
		if (this.stunned || (this.isBoro && Records.x.InCombat(false)) || (this.ghost && this.hostility == 0) || !this.usingCircles)
		{
			if (this.circle.activeSelf)
			{
				this.circle.SetActive(false);
			}
			return;
		}
		if (this.isBoro && this.sailing)
		{
			return;
		}
		if (!this.circle.activeSelf && !this.stunned && this.usingCircles)
		{
			this.circle.SetActive(true);
		}
		if (this.circle.activeSelf && !this.stunned)
		{
			if (!this.hovering)
			{
				this.circleAnimator.SetBool("Hover", false);
			}
			else
			{
				this.circleAnimator.SetBool("Hover", true);
			}
			if (this.npc && Records.x.kill)
			{
				this.circleAnimator.SetBool("Kill", true);
			}
			else
			{
				this.circleAnimator.SetBool("Kill", false);
			}
			if (this.hovering && !this.centerOfAttention && !this.isTarget && !this.stunned)
			{
				this.circleAnimator.enabled = true;
				this.circleAnimator.Play("Hover");
				this.circleAnimator.SetBool("Hover", true);
				this.circleAnimator.SetBool("Target", false);
			}
			else if (this.centerOfAttention && this.hovering && !this.mainSelected && !this.stunned)
			{
				this.circleAnimator.enabled = true;
				this.circleAnimator.Play("Center of Attention");
				this.circleAnimator.SetBool("Hover", true);
				this.circleAnimator.SetBool("Target", false);
			}
			else if (this.isTarget && this.hovering && !this.mainSelected && !this.stunned)
			{
				this.circleAnimator.enabled = true;
				this.circleAnimator.Play("Center of Attention");
				this.circleAnimator.SetBool("Hover", true);
				this.circleAnimator.SetBool("Target", false);
			}
			else if (this.centerOfAttention && !this.hovering && !this.stunned)
			{
				this.circleAnimator.enabled = true;
				this.circleAnimator.Play("Hover");
				this.circleAnimator.SetBool("Hover", false);
				this.circleAnimator.SetBool("Target", false);
			}
			else if (this.isTarget && !this.hovering && !this.stunned)
			{
				this.circleAnimator.SetBool("Hover", false);
				this.circleAnimator.SetBool("Target", true);
				this.circleAnimator.enabled = true;
			}
			else if (this.stunned && !this.isTarget && !this.hovering)
			{
				this.circleAnimator.enabled = true;
				this.circleAnimator.Play("Idle");
				if (this.circleAnimator.GetBool("Target"))
				{
					this.circleAnimator.SetBool("Target", false);
					this.circleAnimator.enabled = true;
				}
				else
				{
					this.circleAnimator.enabled = false;
				}
			}
			if (animationToPlay != "")
			{
				this.circleAnimator.enabled = true;
				this.circleAnimator.Play(animationToPlay);
			}
			this.CircleColor(this.fleeing);
		}
		if (this.npc && this.hostility < 2 && !this.attackingUntilBribe)
		{
			if (!this.inCombat && !this.hasActions && !this.hovering)
			{
				this.circleAnimator.enabled = false;
				this.circleRenderers[2].enabled = false;
				return;
			}
			this.circleRenderers[2].enabled = true;
		}
	}

	// Token: 0x06000323 RID: 803 RVA: 0x00045A98 File Offset: 0x00043C98
	public void CircleColor(bool kiting)
	{
		int num = this.partyColorID;
		for (int i = 0; i < this.circleRenderers.Count - 1; i++)
		{
			if (this.fleeing || kiting)
			{
				if (this.isTarget || this.centerOfAttention || this.hovering)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleFleeTarget;
				}
				else
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleFlee;
				}
			}
			else if (this.npc)
			{
				if (this.hostility < 2 && !this.attackingUntilBribe)
				{
					if (this.hovering)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleNeutralHover;
					}
					else if (this.isTarget)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleNeutralTarget;
					}
					else if (this.centerOfAttention)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleNeutralTarget;
					}
					else
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleNeutral;
					}
				}
				else if (this.radius > 3f)
				{
					if (this.hovering)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargeEnemyHover;
					}
					else if (this.isTarget)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargeEnemyTarget;
					}
					else if (this.centerOfAttention)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargeEnemyTarget;
					}
					else
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargeEnemy;
					}
				}
				else if (this.hovering)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleEnemyHover;
				}
				else if (this.isTarget)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleEnemyTarget;
				}
				else if (this.centerOfAttention)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleEnemyAction;
				}
				else
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleEnemy;
				}
			}
			else if (this.radius > 3f)
			{
				if (this.selected)
				{
					if (this.hovering)
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargePartyHover;
					}
					else
					{
						this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargePartySelected;
					}
				}
				else if (this.hovering)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargePartyUnseletedHover;
				}
				else
				{
					this.circleRenderers[i].sharedMaterial = Links.x.selectionCircleLargeParty;
				}
			}
			else if (this.selected)
			{
				if (this.hovering)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.GetPartyMaterial(num, 3);
				}
				else if (this.centerOfAttention)
				{
					this.circleRenderers[i].sharedMaterial = Links.x.GetPartyMaterial(num, 3);
				}
				else
				{
					this.circleRenderers[i].sharedMaterial = Links.x.GetPartyMaterial(num, 2);
				}
			}
			else if (this.hovering)
			{
				this.circleRenderers[i].sharedMaterial = Links.x.GetPartyMaterial(num, 3);
			}
			else if (this.centerOfAttention)
			{
				this.circleRenderers[i].sharedMaterial = Links.x.GetPartyMaterial(num, 1);
			}
			else
			{
				this.circleRenderers[i].sharedMaterial = Links.x.GetPartyMaterial(num, 0);
			}
		}
		if (this.circleRenderers.Count > 1)
		{
			if (this.npc && this.hostility < 2 && !this.attackingUntilBribe)
			{
				if (!this.inCombat && !this.hasActions && !this.hovering)
				{
					this.circleRenderers[3].enabled = false;
					return;
				}
			}
			else
			{
				this.circleRenderers[3].material.SetFloat("opacity", 0.05f);
				this.circleRenderers[3].enabled = true;
				this.circleRenderers[3].material.SetColor("_Color", this.circleRenderers[2].sharedMaterial.GetColor("_Color"));
			}
		}
	}

	// Token: 0x06000324 RID: 804 RVA: 0x00045F78 File Offset: 0x00044178
	public void PlaySoundFX(int fxID, int clipNum)
	{
		if (clipNum <= 2 && (this.inactive || this.visible == 0))
		{
			return;
		}
		float soundVolume = Links.x.options.soundVolume;
		if (fxID > 0)
		{
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(fxID);
			if (pooledGameObject)
			{
				pooledGameObject.transform.position = this.body.GetFootLower().position - new Vector3(0f, 0.7f, 0f);
				if (!pooledGameObject.activeSelf)
				{
					pooledGameObject.SetActive(true);
				}
			}
		}
		if (clipNum < 2 && !this.mainSelected && Time.timeSinceLevelLoad < this.soundTime + 0.25f)
		{
			clipNum = -1;
		}
		if (!this.audioSource)
		{
			return;
		}
		if (!this.party && (this.visible == 0 || this.inactive))
		{
			return;
		}
		if (clipNum > -1)
		{
			this.soundTime = Time.timeSinceLevelLoad;
			string text = "Human";
			if (this.stats.animal)
			{
				text = "Animal";
			}
			if (clipNum == 7)
			{
				this.audioSource.clip = Links.x.allSounds.PlaySound(text, this.stats.soundID, clipNum, "");
			}
			if (clipNum >= 10)
			{
				if (text == "Human")
				{
					this.audioSource.clip = Links.x.allSounds.PlaySound("Talking", this.stats.characterRow._VoiceID, clipNum, "");
				}
				else
				{
					this.audioSource.clip = Links.x.allSounds.PlaySound(text, this.stats.soundID, 7, "");
				}
			}
			else
			{
				string text2 = "";
				if (clipNum == 0)
				{
					text2 = this.terrain;
				}
				this.audioSource.clip = Links.x.allSounds.PlaySound(text, this.stats.soundID, clipNum, text2);
			}
			if (this.audioSource.clip != null)
			{
				if (clipNum >= 2)
				{
					if (!this.npc || clipNum >= 10)
					{
						this.audioSource.priority = 1;
					}
					else
					{
						this.audioSource.priority = 100;
					}
					if (this.summoned)
					{
						this.audioSource.volume = Links.x.options.soundVolume / 2f;
					}
					else if (this.stats.xmlName.Contains("Bakka") || this.stats.xmlName.Contains("Shroomer"))
					{
						this.audioSource.volume = Links.x.options.soundVolume * 1.5f;
					}
					else
					{
						this.audioSource.volume = Links.x.options.soundVolume;
					}
				}
				else
				{
					if (this.mainSelected)
					{
						this.audioSource.priority = 1;
					}
					else
					{
						this.audioSource.priority = 200;
					}
					float num = 0.18f;
					if (this.party && this.terrain == "Rocks")
					{
						num = 0.4f;
					}
					if (this.npc)
					{
						num *= 1.5f;
					}
					if (this.stats.Silent() > 0)
					{
						this.audioSource.volume = Links.x.options.soundVolume * (num / 3f);
					}
					else
					{
						this.audioSource.volume = Links.x.options.soundVolume * num;
					}
				}
				if (this.audioSource.enabled && base.gameObject.activeSelf)
				{
					this.audioSource.Play();
				}
			}
		}
	}

	// Token: 0x06000325 RID: 805 RVA: 0x00046310 File Offset: 0x00044510
	private bool HasPartyAsEnemy()
	{
		using (List<Character>.Enumerator enumerator = this.lkPlayer.GetEnumerator())
		{
			while (enumerator.MoveNext())
			{
				if (enumerator.Current.party)
				{
					return true;
				}
			}
		}
		return false;
	}

	// Token: 0x06000326 RID: 806 RVA: 0x0004636C File Offset: 0x0004456C
	public void SetHealthBarMaterial(bool isKiting)
	{
		if (!this.healthBar)
		{
			return;
		}
		bool flag = this.npc;
	}

	// Token: 0x06000327 RID: 807 RVA: 0x00046384 File Offset: 0x00044584
	public void GetStaminaBar()
	{
		if (this.npc)
		{
			bool flag = false;
			if (!this.staminaBar && flag)
			{
				this.staminaBar = Links.x.cellar.GetPooledGameObject(122);
				this.staminaBar.SetActive(true);
				this.staminaBarTr = this.staminaBar.transform.GetChild(1);
				this.staminaBar.transform.localScale = new Vector3(0.4f, 0.4f, 0.4f);
				this.staminaBarScale = this.staminaBarTr.localScale;
				this.staminaBarScale.z = 0.34f;
				this.staminaBarTr.localScale = this.staminaBarScale;
				this.staminaBar.transform.GetChild(0).gameObject.SetActive(true);
				this.staminaBar.transform.GetChild(1).gameObject.SetActive(true);
				this.SetStaminaBarPosition();
				this.GetHealthBar();
				return;
			}
			this.CreateStamina();
		}
	}

	// Token: 0x06000328 RID: 808 RVA: 0x00046490 File Offset: 0x00044690
	public void GetHealthBar()
	{
		bool flag = false;
		if (this.npc && flag && !this.healthBar)
		{
			this.healthBar = Links.x.cellar.GetPooledGameObject(65);
			this.healthBar.SetActive(true);
			this.healthBarTr = this.healthBar.transform.GetChild(1);
			this.healthBar.transform.localScale = new Vector3(0.4f, 0.4f, 0.4f);
			this.SetHealthBarMaterial(this.fleeing);
			this.healthBarScale = this.healthBarTr.localScale;
			this.healthBarScale.z = 0.34f;
			this.healthBarTr.localScale = this.healthBarScale;
			this.healthBar.transform.GetChild(0).gameObject.SetActive(true);
			this.healthBar.transform.GetChild(1).gameObject.SetActive(true);
			this.SetHealthBarPosition();
		}
	}

	// Token: 0x06000329 RID: 809 RVA: 0x00046598 File Offset: 0x00044798
	private void SetDazedPosition()
	{
		if (!this.dazed)
		{
			return;
		}
		if (this.neck == this.body.tr)
		{
			this.dazed.transform.parent.gameObject.transform.position = this.neck.position + new Vector3(0f, 1.1f, 0f);
		}
		else
		{
			this.dazed.transform.parent.gameObject.transform.position = this.neck.position + new Vector3(0f, 1.1f, 0f);
		}
		if (!this.dazed.transform.parent.gameObject.activeSelf)
		{
			this.dazed.transform.parent.gameObject.SetActive(true);
		}
	}

	// Token: 0x0600032A RID: 810 RVA: 0x0004668C File Offset: 0x0004488C
	private void SetHealthBarPosition()
	{
		if (!this.healthBar)
		{
			return;
		}
		float num = 1.35f;
		if (this.neck == this.body.tr)
		{
			this.healthBar.transform.position = this.body.headBone.position + new Vector3(0f, num, 0f);
			return;
		}
		this.healthBar.transform.position = this.neck.position + new Vector3(0f, num, 0f);
	}

	// Token: 0x0600032B RID: 811 RVA: 0x0004672C File Offset: 0x0004492C
	private void SetRevivalGemPosition()
	{
		Transform transform = this.revivalGem.gameObject.transform;
		transform.position = this.body.headBone.position + new Vector3(0f, 1.5f, 0f);
		RaycastHit raycastHit;
		if (Physics.Raycast(transform.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 12f, Links.x.floor) && raycastHit.point.y > transform.position.y - 1f)
		{
			Vector3 position = transform.position;
			position.y = raycastHit.point.y + 1.5f;
			transform.position = position;
		}
	}

	// Token: 0x0600032C RID: 812 RVA: 0x0004680C File Offset: 0x00044A0C
	private void SetSeenPosition()
	{
		if (this.neck == this.body.tr)
		{
			this.seen.transform.position = this.body.HeadPosition(0f);
			return;
		}
		this.seen.transform.position = this.neck.position;
	}

	// Token: 0x0600032D RID: 813 RVA: 0x00046870 File Offset: 0x00044A70
	private void SetHeardPosition()
	{
		if (this.neck == this.body.tr)
		{
			this.heard.transform.position = this.body.HeadPosition(0f);
			return;
		}
		this.heard.transform.position = this.neck.position;
	}

	// Token: 0x0600032E RID: 814 RVA: 0x000468D4 File Offset: 0x00044AD4
	private void SetStaminaBarPosition()
	{
		if (!this.staminaBar)
		{
			return;
		}
		float num = 1.24f;
		if (this.neck == this.body.tr)
		{
			this.staminaBar.transform.position = this.body.headBone.position + new Vector3(0f, num, 0f);
		}
		else
		{
			this.staminaBar.transform.position = this.neck.position + new Vector3(0f, num, 0f);
		}
		this.SetHealthBarPosition();
	}

	// Token: 0x0600032F RID: 815 RVA: 0x0004697C File Offset: 0x00044B7C
	private void SetHeartPosition()
	{
		if (!this.heart)
		{
			return;
		}
		if (this.neck == this.body.tr)
		{
			this.heart.transform.position = this.body.headBone.position + new Vector3(0f, 1.75f, 0f);
			return;
		}
		this.heart.transform.position = this.neck.position + new Vector3(0f, 1.75f, 0f);
	}

	// Token: 0x06000330 RID: 816 RVA: 0x00046A20 File Offset: 0x00044C20
	private void SetSelectedPosition()
	{
		if (!this.bracket)
		{
			return;
		}
		if (!this.usingCircles)
		{
			this.bracket.transform.position = this.tr.position + new Vector3(0f, 0.2f, 0f);
			RaycastHit raycastHit;
			if (Physics.Raycast(this.tr.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 10f, 4194449))
			{
				Vector3 normal = raycastHit.normal;
				normal.y = Mathf.Clamp(normal.y, 0.97f, 1f);
				Quaternion quaternion = Quaternion.FromToRotation(Vector3.up, normal);
				this.bracket.transform.rotation = Quaternion.Slerp(this.bracket.transform.rotation, quaternion, Time.deltaTime * 10f);
				return;
			}
		}
		else
		{
			if (this.neck == this.body.tr)
			{
				this.bracket.transform.position = this.body.HeadPosition(0f) + new Vector3(0f, 1.35f, 0f);
			}
			else
			{
				this.bracket.transform.position = this.neck.position + new Vector3(0f, 1.35f, 0f);
			}
			if (this.selected && !this.bracket.activeSelf)
			{
				this.bracket.SetActive(true);
			}
		}
	}

	// Token: 0x06000331 RID: 817 RVA: 0x00046BD0 File Offset: 0x00044DD0
	public void UpdateHealth()
	{
		if (this.healthBar)
		{
			float num = (float)this.stats.HealthCurrent() / (float)this.stats.HealthMax();
			this.healthBarTr.localScale = new Vector3(this.healthBarScale.x, this.healthBarScale.y, this.healthBarScale.z * num);
			float num2 = 0f;
			if (this.healthBarTr.localScale.z > 0f)
			{
				num2 = (this.healthBarTr.localScale.z - this.healthBarScale.x) / 2f * 3.4f;
			}
			this.healthBarTr.localPosition = new Vector3(num2, this.healthBarTr.localPosition.y, this.healthBarTr.localPosition.z);
		}
	}

	// Token: 0x06000332 RID: 818 RVA: 0x00046CB4 File Offset: 0x00044EB4
	public void UpdateStamina()
	{
		if (this.stamina)
		{
			this.stamina.UpdateStamina();
		}
		if (this.staminaBar)
		{
			float num = this.stats.stamina / this.stats.maxStamina;
			this.staminaBarTr.localScale = new Vector3(this.staminaBarScale.x, this.staminaBarScale.y, this.staminaBarScale.z * num);
			float num2 = 0f;
			if (this.staminaBarTr.localScale.z > 0f)
			{
				num2 = (this.staminaBarTr.localScale.z - this.staminaBarScale.x) / 2f * 3.4f;
			}
			this.staminaBarTr.localPosition = new Vector3(num2, this.staminaBarTr.localPosition.y, this.staminaBarTr.localPosition.z);
		}
	}

	// Token: 0x06000333 RID: 819 RVA: 0x00046DAD File Offset: 0x00044FAD
	public void ReturnHealthBar()
	{
		if (this.healthBar)
		{
			this.healthBar.SetActive(false);
			Links.x.cellar.ReturnPooledGameObject(65, this.healthBar);
			this.healthBar = null;
		}
	}

	// Token: 0x06000334 RID: 820 RVA: 0x00046DE8 File Offset: 0x00044FE8
	public void ReturnStaminaBar()
	{
		if (this.staminaBar)
		{
			this.staminaBar.SetActive(false);
			Links.x.cellar.ReturnPooledGameObject(122, this.staminaBar);
			this.staminaBar = null;
		}
		if (this.stamina)
		{
			this.stamina.End();
			this.stamina = null;
		}
	}

	// Token: 0x06000335 RID: 821 RVA: 0x00046E4C File Offset: 0x0004504C
	public void StartCombat(Character lookAtTarget, bool midAction)
	{
		this.actionPicked = false;
		if (Records.x.turnBased && !midAction)
		{
			this.ClearMoveTargets();
		}
		bool flag = false;
		if (lookAtTarget)
		{
			if (lookAtTarget.npc && this.party)
			{
				flag = true;
			}
			if (!lookAtTarget.npc && this.npc)
			{
				flag = true;
			}
		}
		if (Records.x.InCombat(false) && (flag || Links.x.combat.GetNPCCountHostile() > 0) && this.party)
		{
			if (!Records.x.pocketPause && this.mainSelected && (!Records.x.banquetIsle || (Records.x.banquetIsle && this.stats.partyID > 0)))
			{
				this.ZeroAttackTime(this.stats.Initiative());
			}
			else if (!this.mainSelected)
			{
				this.ZeroAttackTime(this.stats.Initiative());
			}
		}
		if (this.npc)
		{
			if (this.stats.isLeader && this.creatures)
			{
				this.creatures.SparkleFriends(this);
			}
			if (this.bag[18] > 1 && this.stamina && !this.stamina.hasArmor)
			{
				Library.Inventory invRow = Links.x.library.GetInvRow(this.bag[18]);
				this.stamina.SetupArmor(this, Mathf.RoundToInt((float)invRow._DurabilityMax), (int)this.durability[9].x);
			}
		}
		this.walkUsed = 0;
		this.overlapping = false;
		if (this.hostility < 2 && this.hostility > -1 && this.HasPartyAsEnemy() && !this.attackingUntilBribe && !this.vipFollow)
		{
			if (this.stats.isGuard && !this.attackingUntilBribe)
			{
				this.GuardQuip();
			}
			if (this.stats.animal)
			{
				this.hostility = 2;
			}
			else if (!Links.x.sensory.CheckProof(this))
			{
				this.attackingUntilBribe = true;
			}
			else
			{
				this.hostility = 2;
			}
		}
		this.CircleColor(false);
		if (lookAtTarget != this)
		{
			this.lookTarget = lookAtTarget;
		}
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Angry);
		this.doingAction = false;
		if (this.creatures && this.creatures.creatures.mobility == Creatures.mobilityState.IdlesOffGridUntilAttacked)
		{
			this.stuckInPlace = false;
		}
		if (this.portrait && this.portrait.skillBag)
		{
			this.portrait.skillBag.SetSelectedState();
		}
		if (!this.outsideDome)
		{
			this.actionNumber = 1f;
		}
		else
		{
			this.actionNumber = 0f;
		}
		if (!this.searching)
		{
			this.CircleAnimation("");
		}
		if (!this.searching && Records.x.turnBased)
		{
			this.StopMoveToRoutine();
		}
	}

	// Token: 0x06000336 RID: 822 RVA: 0x00047130 File Offset: 0x00045330
	public void GuardQuip()
	{
		int num = Random.Range(0, 6);
		if (num == 0)
		{
			this.StartQuip("Lawbreaker!");
		}
		if (num == 1)
		{
			this.StartQuip("Knave!");
		}
		if (num == 2)
		{
			this.StartQuip("Scoundrel!");
		}
		if (num == 3)
		{
			this.StartQuip("Get out!");
		}
		if (num == 4)
		{
			this.StartQuip("You're not wanted here!");
		}
		if (num == 5)
		{
			this.StartQuip("Felon!");
		}
	}

	// Token: 0x06000337 RID: 823 RVA: 0x0004719C File Offset: 0x0004539C
	public void HostileQuip()
	{
		int num = Random.Range(0, 6);
		if (num == 0)
		{
			this.StartQuip("You'll regret that!");
		}
		if (num == 1)
		{
			this.StartQuip("I'll teach you a lesson!");
		}
		if (num == 2)
		{
			this.StartQuip("You've a bold face!");
		}
		if (num == 3)
		{
			this.StartQuip("What is this?");
		}
		if (num == 4)
		{
			this.StartQuip("An outrage!");
		}
		if (num == 5)
		{
			this.StartQuip("Unbelievable!");
		}
	}

	// Token: 0x06000338 RID: 824 RVA: 0x00047208 File Offset: 0x00045408
	public void GuiltyQuip()
	{
		int num = Random.Range(0, 2);
		if (num == 0)
		{
			this.StartQuip("Mercy!");
		}
		if (num == 1)
		{
			this.StartQuip("I meant no harm!");
		}
	}

	// Token: 0x06000339 RID: 825 RVA: 0x0004722D File Offset: 0x0004542D
	public void EndTurn()
	{
		this.body.lookAtController.EndLook();
		this.actionPicked = false;
		this.CircleAnimation("");
		this.StopMoveToRoutine();
		this.doingAction = false;
		this.walkUsed = 0;
		this.SetNodeID(true, false);
	}

	// Token: 0x0600033A RID: 826 RVA: 0x00047270 File Offset: 0x00045470
	public void StartTurn()
	{
		this.StopMoveToRoutine();
		this.walkUsed = 0;
		this.actionPicked = false;
		this.CheckInTile();
		if (Records.x.turnBased)
		{
			this.outsideDome = false;
		}
		if (!this.outsideDome)
		{
			this.actionNumber = 1f;
		}
		else
		{
			this.actionNumber = 0f;
		}
		this.CircleAnimation("");
	}

	// Token: 0x0600033B RID: 827 RVA: 0x000472D5 File Offset: 0x000454D5
	public void SetMoveBack(Character c)
	{
		if (this.mainSelected)
		{
			return;
		}
		this.moveBackTarget = c;
		this.moveBackward = true;
		this.animator.SetBool("Backward", true);
	}

	// Token: 0x0600033C RID: 828 RVA: 0x000472FF File Offset: 0x000454FF
	public void MoveBackEmpty()
	{
		this.moveBackTarget = null;
		this.animator.SetBool("Backward", false);
		this.moveBackward = false;
	}

	// Token: 0x0600033D RID: 829 RVA: 0x00047320 File Offset: 0x00045520
	public void StopEvading()
	{
		this.evading = false;
		if (this.mainSelected)
		{
			this.ForceEndJump();
		}
	}

	// Token: 0x0600033E RID: 830 RVA: 0x00047338 File Offset: 0x00045538
	public bool InSpecialAttack()
	{
		bool flag = false;
		if (!this.stats)
		{
			return false;
		}
		if (this.stats.hasCustomAI && this.hasActions)
		{
			if (!this.ambushing && this.npc && this.actions && this.actions.ai.jumping)
			{
				flag = true;
			}
			if (this.actions && this.actions.chargeUpFX && this.IsCasting(this.body.currentHash))
			{
				flag = true;
			}
			if (this.body.currentHash == this.body.special1Hash || this.body.currentHash == this.body.special2Hash)
			{
				flag = true;
			}
		}
		return flag;
	}

	// Token: 0x0600033F RID: 831 RVA: 0x0004740C File Offset: 0x0004560C
	public bool SpecialAttackTypeNearby(out Vector3 attackNode, Character potentialTarget, out bool dodgeSideways)
	{
		attackNode = Vector3.zero;
		dodgeSideways = false;
		if (this.actions.ai.jumping)
		{
			if (this.actions.ai.jumpNode != null)
			{
				if (this.actions.chargeUpFX || this.charging)
				{
					Vector3 closestPointOnFiniteLine = this.actions.ai.GetClosestPointOnFiniteLine(potentialTarget.currentPosition, this.currentPosition, (Vector3)this.actions.ai.jumpNode.position);
					if ((closestPointOnFiniteLine - potentialTarget.currentPosition).sqrMagnitude < (this.attackRadius + potentialTarget.attackRadius) * 0.9f * ((this.attackRadius + potentialTarget.attackRadius) * 0.9f))
					{
						attackNode = closestPointOnFiniteLine;
						return true;
					}
				}
				else if (potentialTarget.mainSelected)
				{
					if (((Vector3)this.actions.ai.jumpNode.position - potentialTarget.currentPosition).sqrMagnitude < 16f)
					{
						attackNode = (Vector3)this.actions.ai.jumpNode.position;
						return true;
					}
				}
				else if (((Vector3)this.actions.ai.jumpNode.position - (Vector3)potentialTarget.node.position).sqrMagnitude < 16f)
				{
					attackNode = (Vector3)this.actions.ai.jumpNode.position;
					return true;
				}
			}
			return false;
		}
		if (this.actions.chargeUpFX && this.IsCasting(this.body.currentHash) && this.actions.spell != null && this.actions.spell._Name.Contains("Beam"))
		{
			float num = 9f;
			if (this.actions.spell._Name.Contains("FishPoison"))
			{
				num = 6f;
			}
			if ((this.currentPosition - potentialTarget.currentPosition).sqrMagnitude < num * Records.x.nodeSize + num * Records.x.nodeSize)
			{
				Vector3 forward = this.tr.forward;
				float num2 = Vector3.Angle(potentialTarget.currentPosition - this.currentPosition, forward);
				float num3 = 15f;
				if (this.actions.spell._Name.Contains("FishPoison"))
				{
					num3 = 20f;
				}
				if (num2 <= num3 && num2 >= num3 * -1f)
				{
					attackNode = (Vector3)this.node.position;
					dodgeSideways = true;
					return true;
				}
			}
		}
		if ((this.stats.animal || this.npc) && (this.body.currentHash == this.body.special1Hash || this.body.currentHash == this.body.special2Hash))
		{
			Character target = this.actions.GetTarget();
			GraphNode graphNode = null;
			if (this.actions.ProjectileCount() == 0 && target)
			{
				graphNode = target.node;
			}
			else
			{
				Projectile firstProjectile = this.actions.GetFirstProjectile();
				if (firstProjectile)
				{
					graphNode = firstProjectile.targetNode;
				}
			}
			if (this.invRow1._MeleeRangeEnd >= 5f && graphNode != null)
			{
				int ammoIndex = this.GetAmmoIndex(this.invRow1);
				if (ammoIndex > -1)
				{
					Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.GetInvNum(ammoIndex));
					if (invRowByIndex._DmgMax <= 0 && invRowByIndex._Effect != "")
					{
						float num4 = 2f;
						if (invRowByIndex._Effect == "FishPoison")
						{
							num4 = 2f;
						}
						if (((Vector3)graphNode.position - potentialTarget.currentPosition).sqrMagnitude < num4 * Records.x.nodeSize + num4 * Records.x.nodeSize)
						{
							attackNode = (Vector3)graphNode.position;
							return true;
						}
					}
				}
			}
		}
		return false;
	}

	// Token: 0x06000340 RID: 832 RVA: 0x0004785C File Offset: 0x00045A5C
	public void EndCombat()
	{
		this.actionPicked = false;
		this.MoveBackEmpty();
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Smile);
		this.body.Dodge(false);
		if (this.animID != 50)
		{
			this.stats.pinned = false;
			this.stats.pinning = false;
		}
		this.SetStagger(0);
		if (this.party)
		{
			this.stats.ClearSynergies();
		}
		if (this.raycastModifier)
		{
			Links.x.gameplay.RemoveAbilityInfo();
		}
		if (this.creatures)
		{
			this.creatures.ReturnFromCombat();
		}
		this.walkUsed = 0;
		if (this.npc)
		{
			this.animator.SetBool("Combat", false);
		}
		this.animator.SetFloat("Combat Variation", 1f);
		this.outsideDome = false;
		this.inQueuedAbility = false;
		this.moveOnTiles = false;
		this.overlapping = false;
		this.doingAction = false;
		this.inAction = false;
		this.inRecovery = false;
		this.centerOfAttention = false;
		this.CircleAnimation("");
		this.waitingToJoinDome = false;
		this.ReturnStaminaBar();
		this.stats.attackCount = 0;
		if (this.party)
		{
			this.stats.ClearSynergies();
		}
		if (this.portrait && this.portrait.skillBag)
		{
			this.portrait.skillBag.SetSelectedState();
		}
		if (this.dodging)
		{
			this.EndDodge();
		}
		if (this.stats.pinning)
		{
			this.stats.HealEffect("Pinning");
			this.stats.pinning = false;
		}
		if (this.party && this.portrait)
		{
			this.portrait.skillBag.SetTrinketGrid(false);
		}
	}

	// Token: 0x06000341 RID: 833 RVA: 0x00047A2C File Offset: 0x00045C2C
	public void HoverIn()
	{
		if (!this.hovering)
		{
			if (this.dead || (this.party && this.stunned))
			{
				return;
			}
			this.hovering = true;
			this.CircleAnimation("");
			Links.x.GetCharacterTextColor(this);
			if (!Links.x.fellowship.drawingSquare)
			{
				Links.x.tooltip.character = this;
			}
			if (this.timelineIcon)
			{
				this.timelineIcon.Hover(true);
			}
			if (this.portrait)
			{
				this.portrait.HoverFromCharacter(true);
			}
		}
	}

	// Token: 0x06000342 RID: 834 RVA: 0x00047AD0 File Offset: 0x00045CD0
	public void HoverOut(bool useDelay)
	{
		this.hovering = false;
		this.CircleAnimation("");
		if (this.portrait)
		{
			this.portrait.HoverFromCharacter(false);
		}
		if (this.timelineIcon)
		{
			this.timelineIcon.Hover(false);
		}
	}

	// Token: 0x06000343 RID: 835 RVA: 0x00047B24 File Offset: 0x00045D24
	public void OutOfAmmoMessage()
	{
		if (Time.timeSinceLevelLoad > this.ammoMessageTime + 30f)
		{
			this.ammoMessageTime = Time.timeSinceLevelLoad;
			string ammo = this.invRow1._Ammo1;
			string text = "";
			this.str.Clear();
			if (ammo.Contains("Arrow"))
			{
				text = "arrows";
			}
			else if (ammo.Contains("Dart"))
			{
				text = "stones";
			}
			else if (ammo.Contains("Vial"))
			{
				text = "elyxirs";
			}
			if (text.Contains("dart"))
			{
				text = "stones";
			}
			if (text != "")
			{
				this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
				this.str.Append(this.stats.GetName());
				this.str.Append("</color>");
				this.str.Append(" is ");
				this.str.Append(" out of ");
				this.str.Append(text);
				this.StartQuip("Out of " + text + "!");
			}
		}
	}

	// Token: 0x06000344 RID: 836 RVA: 0x00047C59 File Offset: 0x00045E59
	public void EndQuip()
	{
		if (!this.quip)
		{
			return;
		}
		this.quip.End();
		this.quip = null;
		this.quipStartTime = -1f;
	}

	// Token: 0x06000345 RID: 837 RVA: 0x00047C86 File Offset: 0x00045E86
	public void StartQuipAlways(string text)
	{
		this.Quip(text);
	}

	// Token: 0x06000346 RID: 838 RVA: 0x00047C90 File Offset: 0x00045E90
	public void StartQuip(string text)
	{
		if (Records.x.paused || (Records.x.pocketPause && !this.mainSelected) || !Links.x.hasMain)
		{
			return;
		}
		if (Links.x.rtsCamera.currentBoundsName != "" && this.indoorID != Links.x.rtsCamera.currentBoundsName)
		{
			return;
		}
		if (text == "" || this.sleeping || this.inactive || (!this.ignoreRemoveControls && Links.x.gaia.loadingCharacterCreation) || (!this.mainSelected && this.indoorID != Links.x.main.indoorID))
		{
			return;
		}
		if (!this.setupComplete)
		{
			return;
		}
		if (!this.IsSentient())
		{
			return;
		}
		this.Quip(text);
	}

	// Token: 0x06000347 RID: 839 RVA: 0x00047D78 File Offset: 0x00045F78
	private void Quip(string text)
	{
		if (text == "NPC Heard")
		{
			if (!Links.x.AllDead() && !Records.x.miniGame && !this.seen && (!Records.x.combat || (Records.x.combat && !Links.x.combat.npcOnlyCombat)))
			{
				if (!this.heard)
				{
					this.heard = Links.x.cellar.GetPooledGameObject(22);
					this.heard.SetActive(true);
					this.SetHeardPosition();
					this.RotateEffects();
				}
				if (Time.timeSinceLevelLoad < this.timeSinceHeardTime + 10f && this.timeSinceHeardTime > 0f)
				{
					return;
				}
				this.PlaySoundFX(0, 7);
				this.timeSinceHeardTime = Time.timeSinceLevelLoad;
				text = Links.x.quips.GetQuip("Heard", this.quipIndex);
			}
			return;
		}
		if (text == "NPC Seen")
		{
			if (!this.seen && !Records.x.miniGame && (!Records.x.combat || (Records.x.combat && !Links.x.combat.npcOnlyCombat)) && !Links.x.AllDead())
			{
				this.seen = Links.x.cellar.GetPooledGameObject(23);
				this.seen.SetActive(true);
				this.SetSeenPosition();
				this.seenTime = Time.timeSinceLevelLoad;
				this.RotateEffects();
			}
			if (Time.timeSinceLevelLoad < this.timeSinceSeenTime + 10f && this.timeSinceSeenTime > 0f)
			{
				return;
			}
			if (!Records.x.miniGame)
			{
				if (this.heard)
				{
					Links.x.cellar.ReturnPooledGameObject(22, this.heard);
					this.heard.SetActive(false);
					this.heard = null;
				}
				this.PlaySoundFX(0, 7);
				this.timeSinceSeenTime = Time.timeSinceLevelLoad;
				text = Links.x.quips.GetQuip("Seen", this.quipIndex);
			}
			return;
		}
		else
		{
			if (this.ghost || this.stats.animal)
			{
				return;
			}
			if (text == "Scared")
			{
				text = Links.x.quips.GetQuip("Scared", this.quipIndex);
				if (text == "")
				{
					this.PlaySoundFX(0, 7);
					return;
				}
			}
			if (text == "Found Item")
			{
				text = Links.x.quips.GetQuip("Found Item", this.quipIndex);
				if (text == "")
				{
					this.PlaySoundFX(0, 7);
					return;
				}
			}
			if (this.quip)
			{
				this.quip.gameObject.SetActive(false);
				this.quip.End();
				this.quip = null;
				this.quipStartTime = -1f;
			}
			this.quip = Links.x.cellar.GetQuip();
			if (!this.quip)
			{
				return;
			}
			if (text == "")
			{
				return;
			}
			if (this.quip)
			{
				this.quip.menu = false;
				TextMeshProUGUI component = this.quip.gameObject.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>();
				component.text = "";
				Vector3 localPosition = this.quip.transform.transform.localPosition;
				int length = text.Length;
				component.text = text;
				string text2 = "";
				int num = 0;
				int length2 = text.Length;
				int num2 = 24;
				foreach (char c in text)
				{
					if (num > num2 && c.ToString() == " ")
					{
						num = 0;
						text2 += "\n";
					}
					num++;
					text2 += c.ToString();
				}
				component.text = text2;
				if (this.quipSound == -1)
				{
					this.quipSound = 11;
				}
				Links.x.sensory.LookAtObject(this.body.headBone, 15f, false, this, 3f, 1f, null, 0);
				component.enabled = true;
				if (Records.x.removeControls || (Records.x.dialogue && this.party) || (Records.x.miniGame && this.party) || this.party)
				{
					if (this.quip.transform.parent != Links.x.hudControl.quipHolderCinematic)
					{
						this.quip.transform.SetParent(Links.x.hudControl.quipHolderCinematic, true);
					}
				}
				else if (this.quip.transform.parent != Links.x.hudControl.miscFolderQuipsTransform)
				{
					this.quip.transform.SetParent(Links.x.hudControl.miscFolderQuipsTransform, true);
				}
				this.quip.emphasize = this.emphasizeQuip;
				this.quip.Setup(this.body);
				component.text = text2;
				this.quipStartTime = Time.time;
				TextMeshProTypewriterEffect textMeshProTypewriterEffect = this.quip.transform.GetChild(0).gameObject.GetComponent<TextMeshProTypewriterEffect>();
				if (!textMeshProTypewriterEffect)
				{
					textMeshProTypewriterEffect = this.quip.transform.GetChild(0).gameObject.AddComponent<TextMeshProTypewriterEffect>();
				}
				if (textMeshProTypewriterEffect)
				{
					this.quip.typewriter = textMeshProTypewriterEffect;
					textMeshProTypewriterEffect.headAnimator = this.body.headAnim;
					if (this.body.lookAtController.thisTarget)
					{
						textMeshProTypewriterEffect.lookAt = this.body.lookAtController.thisTarget.gameObject;
					}
					textMeshProTypewriterEffect.soundVolume = Links.x.options.soundVolume;
					if (Records.x.removeControls)
					{
						textMeshProTypewriterEffect.soundVolume *= 2f;
					}
					textMeshProTypewriterEffect.audioIndex = this.stats.voiceID;
				}
				this.quip.gameObject.SetActive(true);
				this.quip.textSize = new Vector2(component.preferredWidth, component.preferredHeight);
				if (this.party)
				{
					this.str.Clear();
					this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
					this.str.Append(this.stats.GetName());
					this.str.Append("</color>");
					this.str.Append(": '");
					this.str.Append(text);
					this.str.Append("'");
					Links.x.gameFeed.AddFeed(this.str.ToString());
				}
				this.emphasizeQuip = false;
			}
			return;
		}
	}

	// Token: 0x06000348 RID: 840 RVA: 0x00048494 File Offset: 0x00046694
	public bool DoPatrolRotate()
	{
		return !this.vipFollow && !this.sailing && !Records.x.miniGame && !this.summoned && this.npc && this.nodePath.Count == 0 && !this.moving && !this.isHit && !this.downed && !this.resting && !this.dead && !this.turning && !this.stunned && !this.sleeping && !this.missing && this.CheckControls() && ((Records.x.turnBased && !this.doingAction) || !Records.x.turnBased) && !Records.x.dialogue && !this.inCombat && !Records.x.dialogue && !Links.x.gaia.loadingCharacterCreation && (!Records.x.removeControls || (Records.x.removeControls && this.ignoreRemoveControls)) && (!this.creatures || !this.creatures.creatures.neverRotate);
	}

	// Token: 0x06000349 RID: 841 RVA: 0x000485F0 File Offset: 0x000467F0
	public void PatrolRotate()
	{
		this.justMoved = false;
		if (this.stats.merchant && !Links.x.main.body.sneaking)
		{
			this.SetRotation(Quaternion.LookRotation(Links.x.main.currentPosition - this.tr.position), false, false);
		}
		else if (this.rotLeft)
		{
			this.rotLeft = false;
			Quaternion quaternion = Quaternion.LookRotation(this.tr.position + this.tr.right * -3f - this.tr.position);
			Quaternion quaternion2 = Quaternion.LookRotation(this.tr.position + this.tr.forward * 3f - this.tr.position);
			Quaternion.Slerp(quaternion, quaternion2, 0.3f);
			Random.Range(0, 2);
			if (this.alwaysLookAtParty)
			{
				Quaternion quaternion3 = Quaternion.LookRotation(Links.x.main.tr.position - this.tr.position);
				this.SetRotation(quaternion3, true, false);
			}
			else
			{
				this.SetRotation(Quaternion.LookRotation(this.tr.position + this.tr.right * -3f - this.tr.position), false, false);
			}
		}
		else
		{
			this.rotLeft = true;
			Quaternion quaternion4 = Quaternion.Euler(this.tr.right);
			Quaternion quaternion5 = Quaternion.Euler(this.tr.forward);
			Quaternion.Slerp(quaternion4, quaternion5, 0.25f);
			Random.Range(0, 2);
			if (this.alwaysLookAtParty)
			{
				Quaternion quaternion6 = Quaternion.LookRotation(Links.x.main.tr.position - this.tr.position);
				this.SetRotation(quaternion6, true, false);
			}
			else
			{
				this.SetRotation(Quaternion.LookRotation(this.tr.position + this.tr.right * 3f - this.tr.position), false, false);
			}
		}
		this.patrolSpeed = Random.Range(0.5f, 0.8f);
		this.GetPatrolHoldTime(false);
	}

	// Token: 0x0600034A RID: 842 RVA: 0x0004885C File Offset: 0x00046A5C
	public bool Knockback(Vector3 attackPosition, int tileDistance, bool predictOnly, bool fromHit, bool flyback)
	{
		if (this.sailing)
		{
			return false;
		}
		if (this.node == null || this.dead || this.stunned || this.slideNode != null)
		{
			return true;
		}
		if (this.jumping || this.isHit)
		{
			return false;
		}
		Vector3 vector = this.tr.position + Quaternion.LookRotation(this.tr.position - attackPosition) * Vector3.forward * 2.5f * 1f;
		this.nodeConstraint.checkConnections = this.ConnectionNumber();
		bool flag = false;
		if (this.ghost)
		{
			this.nodeConstraint.constrainToEnvironment = 0;
			tileDistance = 6;
			flag = true;
		}
		bool flag2 = true;
		if (this.ignoreNodeIDs)
		{
			flag2 = false;
		}
		GraphNode graphNode = this.GetSlideNode(vector, this.node, flag2, this.CheckCircleID(), 0);
		if (graphNode != null && tileDistance > 1)
		{
			Vector3 vector2 = Quaternion.LookRotation(this.tr.position - attackPosition) * Vector3.forward;
			vector = (Vector3)graphNode.position + vector2 * 2.5f * 2f;
			GraphNode graphNode2 = this.GetSlideNode(vector, graphNode, flag2, this.CheckCircleID(), 0);
			if (graphNode2 != null && !flag)
			{
				graphNode = graphNode2;
				if (tileDistance > 2 && !flag)
				{
					vector = this.tr.position + vector2 * 2.5f * 3f;
					GraphNode graphNode3 = this.GetSlideNode(vector, graphNode2, flag2, this.CheckCircleID(), 0);
					if (graphNode3 != null)
					{
						graphNode = graphNode3;
						if (tileDistance > 3 && !flag)
						{
							vector = this.tr.position + vector2 * 2.5f * 4f;
							GraphNode graphNode4 = this.GetSlideNode(vector, graphNode3, flag2, this.CheckCircleID(), 0);
							if (graphNode4 != null)
							{
								graphNode = graphNode4;
								if (tileDistance > 4 && !flag)
								{
									vector = this.tr.position + vector2 * 2.5f * 5f;
									GraphNode graphNode5 = this.GetSlideNode(vector, graphNode4, flag2, this.CheckCircleID(), 0);
									if (graphNode5 != null)
									{
										graphNode = graphNode5;
										if (tileDistance > 5 && !flag)
										{
											vector = this.tr.position + vector2 * 2.5f * 6f;
											GraphNode graphNode6 = this.GetSlideNode(vector, graphNode5, flag2, this.CheckCircleID(), 0);
											if (graphNode6 != null)
											{
												graphNode = graphNode6;
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		if (graphNode == null || this.stats.Stuck() != 0 || this.jumping || this.stats.pinning || this.stats.pinning || (((Vector3)graphNode.position - this.tr.position).sqrMagnitude >= 25f && tileDistance <= 1) || !PathUtilities.IsPathPossible(graphNode, this.node))
		{
			return false;
		}
		if (predictOnly)
		{
			return true;
		}
		this.randomRot = Vector3.zero;
		this.randomRot.x = Random.Range(5f, 6f);
		if (Random.Range(0, 2) == 0)
		{
			this.randomRot.x = this.randomRot.x * -1f;
		}
		this.randomRot.y = Random.Range(5f, 6f);
		if (Random.Range(0, 2) == 0)
		{
			this.randomRot.y = this.randomRot.y * -1f;
		}
		this.randomRot.z = Random.Range(5f, 6f);
		if (Random.Range(0, 2) == 0)
		{
			this.randomRot.z = this.randomRot.z * -1f;
		}
		this.slideNode = graphNode;
		if (Records.x.editor)
		{
			Debug.Log(((this != null) ? this.ToString() : null) + " sliding " + ((Vector3)this.slideNode.position).ToString());
		}
		this.slideNodePosition = (Vector3)this.slideNode.position;
		this.ttime = 0f;
		this.prevPoint = this.tr.position;
		this.prevNodePosition = this.tr.position;
		this.sphere.transform.position = (Vector3)this.slideNode.position;
		this.ClearNodePath();
		this.ClaimNode(graphNode, (Vector3)graphNode.position, false);
		if (fromHit)
		{
			Vector3 vector3 = (Vector3)graphNode.position;
			if (this.tr.position != (Vector3)graphNode.position)
			{
				this.SetRotation(Quaternion.LookRotation(this.tr.position - new Vector3(vector3.x, this.tr.position.y, vector3.z)), true, false);
			}
			this.PlayAnimation("Hit", 0f);
			this.SetAnimatorSpeed(1f);
		}
		else
		{
			if (!this.isHit)
			{
				this.PlayAnimation("Stop", 0f);
			}
			this.SetAnimatorSpeed(1f);
		}
		return true;
	}

	// Token: 0x0600034B RID: 843 RVA: 0x00048DA4 File Offset: 0x00046FA4
	public void Sleep(Quaternion sleepRotation)
	{
		if (this.NodesCount() > 0)
		{
			this.TargetReached();
		}
		this.sleeping = true;
		if (this.turning)
		{
			this.EndTurning(false);
		}
		this.AddEffect(40, "");
		this.PlayAnimation("Hit Down", 0f);
		this.updateCount = 10;
		this.SetRotation(sleepRotation, false, true);
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Sleep);
	}

	// Token: 0x0600034C RID: 844 RVA: 0x00048E10 File Offset: 0x00047010
	public void WakeUp()
	{
		this.sleeping = false;
		if (this.body.currentHash == this.body.hitDownHash || this.animator.GetCurrentAnimatorStateInfo(0).IsName("Hit_down_start"))
		{
			this.PlayAnimation("GetUp", 0f);
		}
		this.PlaySoundFX(1, 0);
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Blink);
		this.RemoveEffect(40, "", true);
	}

	// Token: 0x0600034D RID: 845 RVA: 0x00048E84 File Offset: 0x00047084
	public void Fall(int totalFallTime)
	{
		this.downed = true;
		if (this.turning)
		{
			this.EndTurning(false);
		}
		if (!this.jumping)
		{
			this.PlayAnimation("Hit Down", 0f);
		}
		if (!this.stats.animal)
		{
			this.PlaySoundFX(1, 4);
		}
		else
		{
			this.PlaySoundFX(1, 8);
		}
		if (!this.stunGauge && !this.dead)
		{
			if ((float)totalFallTime > 50f)
			{
				this.stunGauge = Links.x.cellar.GetGauge();
				if (this.stunGauge)
				{
					this.stunGauge.Setup("Stun", this, (float)totalFallTime);
				}
			}
		}
		else if (this.stunGauge)
		{
			this.stunGauge.UpdateTime((float)totalFallTime);
		}
		if (this.quip)
		{
			this.quip.EndFinal();
			this.quip = null;
		}
		if (this.actions)
		{
			this.actions.Interrupt();
		}
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Sleep);
		if (!this.dead)
		{
			bool flag = this.stunned;
		}
		if (this.moving)
		{
			this.TargetReached();
		}
	}

	// Token: 0x0600034E RID: 846 RVA: 0x00048FAC File Offset: 0x000471AC
	public void GetUp()
	{
		this.downed = false;
		if (this.animID == 8 || this.body.currentHash == this.body.downHash || this.body.currentHash == this.body.downStartHash)
		{
			this.PlayAnimation("GetUp", 0f);
		}
		this.PlaySoundFX(1, 0);
		this.RemoveStun();
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Blink);
		if (this.hasActions)
		{
			this.actions.EndTurn(true);
		}
	}

	// Token: 0x0600034F RID: 847 RVA: 0x00049034 File Offset: 0x00047234
	public void SetStagger(int t)
	{
		if (t > 0)
		{
			if (!this.dead)
			{
				if (!this.dazedGauge)
				{
					this.dazedGauge = Links.x.cellar.GetGauge();
					this.dazedGauge.Setup("Dazed", this, (float)t);
					return;
				}
				this.dazedGauge.UpdateTime((float)t);
				return;
			}
		}
		else if (this.dazedGauge)
		{
			this.EndGauge("Dazed");
		}
	}

	// Token: 0x06000350 RID: 848 RVA: 0x000490AC File Offset: 0x000472AC
	public void RemoveStun()
	{
		if (this.stunGauge)
		{
			Links.x.cellar.ReturnGauge(this.stunGauge);
			this.stunGauge = null;
		}
		if (this.party && this.portrait)
		{
			this.portrait.skillBag.SetTrinketGrid(false);
		}
	}

	// Token: 0x06000351 RID: 849 RVA: 0x00049108 File Offset: 0x00047308
	public void SetupSneakGauge(int duration)
	{
		if (!this.sneakGauge && !this.dead && !this.stunned)
		{
			this.sneakGauge = Links.x.cellar.GetGauge();
			this.sneakGauge.Setup("Sneak", this, (float)duration);
		}
	}

	// Token: 0x06000352 RID: 850 RVA: 0x0004915A File Offset: 0x0004735A
	public bool CheckLights(bool checkOnly)
	{
		return false;
	}

	// Token: 0x06000353 RID: 851 RVA: 0x00049160 File Offset: 0x00047360
	public void EndSneak(bool showMessage, bool fromLight)
	{
		this.EndGauge("Sneak");
		if (showMessage)
		{
			this.str.Clear();
			if (!this.npc)
			{
				this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
			}
			this.str.Append(this.stats.GetName());
			if (!this.npc)
			{
				this.str.Append("</color>");
			}
			if (fromLight)
			{
				this.str.Append(" revealed by light");
			}
			else
			{
				this.str.Append(" revealed");
			}
			Links.x.gameFeed.AddFeed(this.str.ToString());
			Animator animatedText = Links.x.cellar.GetAnimatedText("", "Revealed", false);
			animatedText.gameObject.transform.position = this.body.headBone.position + new Vector3(Random.Range(0f, 2f), Random.Range(0f, 2f), 0f);
			animatedText.gameObject.SetActive(true);
		}
	}

	// Token: 0x06000354 RID: 852 RVA: 0x00049294 File Offset: 0x00047494
	public void EndGauge(string gaugeType)
	{
		if (gaugeType == "Stun")
		{
			if (this.stunGauge)
			{
				Links.x.cellar.ReturnGauge(this.stunGauge);
				this.stunGauge = null;
				return;
			}
		}
		else
		{
			if (gaugeType == "Dazed")
			{
				Links.x.cellar.ReturnGauge(this.dazedGauge);
				this.dazedGauge = null;
				return;
			}
			if (gaugeType == "Item")
			{
				Links.x.cellar.ReturnGauge(this.itemGauge);
				this.itemGauge = null;
				if (this.hasActions)
				{
					this.actions.cannotInterrupt = false;
					if (Records.x.ai == 1)
					{
						Links.x.combat.GetNextAction(this);
					}
				}
				this.inventoryTime = 0f;
				return;
			}
			Links.x.cellar.ReturnGauge(this.sneakGauge);
			this.sneakGauge = null;
			this.body.Sneaking(false);
		}
	}

	// Token: 0x06000355 RID: 853 RVA: 0x00049394 File Offset: 0x00047594
	public void PartyResurrect(int healing)
	{
		this.dead = false;
		this.stunned = false;
		this.body.dead = false;
		this.body.SetLayer(6);
		this.thisCollider.enabled = true;
		this.CreateObjects();
		Links.x.ChangeDeadList(this, false);
		base.gameObject.layer = 6;
		base.enabled = true;
		if (healing == -1)
		{
			healing = Random.Range(Mathf.RoundToInt((float)this.stats.HealthMax() / 20f), Mathf.RoundToInt((float)this.stats.HealthMax() / 10f));
		}
		this.stats.SetHealth(healing, true);
		this.PlayAnimation("GetUp", 0f);
		if ((Links.x.main.tr.position - this.tr.position).sqrMagnitude > 900f)
		{
			Links.x.fellowship.JumpPosition(Links.x.main, Links.x.GetPartyID(this), this);
		}
		else
		{
			GraphNode graphNode = this.NearNode(this.tr.position, true, 0, -1, 0);
			this.FirstPosition(graphNode);
		}
		this.inAction = false;
		this.inRecovery = false;
		this.inQueuedAbility = false;
		this.portrait.SetHealthColor();
		this.CircleAnimation("");
		this.RemoveEffect(9, "", true);
		if (this.party)
		{
			this.portrait.skillBag.SetTrinketGrid(false);
		}
		if (this.revivalGem)
		{
			Links.x.cellar.ReturnPooledGameObject(123, this.revivalGem.gameObject);
			this.revivalGem = null;
		}
		if (Records.x.combat)
		{
			Links.x.combat.GivePartyActions(this, false);
		}
	}

	// Token: 0x06000356 RID: 854 RVA: 0x00049564 File Offset: 0x00047764
	public void DropEverything()
	{
		int count = this.bag.Count;
		for (int i = 0; i < count; i++)
		{
			if (i % 2 == 0 && this.bag[i] > 1 && Links.x.library.GetInvRow(this.bag[i])._ArmorID != -1)
			{
				int num = -1;
				if (this.node != null)
				{
					num = (int)this.node.Area;
				}
				global::Item item = Links.x.inventory.groundBag.DropLoot(this.bag[i], this.bag[i + 1], this.sockets[i], this.sockets[i + 1], this.durability[i / 2], this, this.tr.position + new Vector3(Random.Range(-4f, 4f), 0f, Random.Range(-4f, 4f)), true, false, num);
				if (item)
				{
					Vector3 vector = this.tr.position + new Vector3(Random.Range(-4f, 4f), 0f, Random.Range(-4f, 4f));
					RaycastHit raycastHit;
					if (Physics.Linecast(vector + new Vector3(0f, 10f, 0f), vector - new Vector3(0f, 20f, 0f), out raycastHit, 4194305))
					{
						item.tr.position = raycastHit.point;
					}
					else
					{
						item.tr.position = new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f));
					}
				}
			}
		}
		this.inventoryBag.EmptyItems();
	}

	// Token: 0x06000357 RID: 855 RVA: 0x00049754 File Offset: 0x00047954
	private void DropLoot()
	{
		if (this.ghost || this.droppedItems)
		{
			if (this.stats.animal)
			{
				return;
			}
			if (!this.stats.xmlName.Contains("RobberBaron"))
			{
				return;
			}
		}
		if (this.movesOnWater)
		{
			return;
		}
		this.droppedItems = true;
		for (int i = 0; i < 18; i++)
		{
			if (this.equippedItems[i])
			{
				Object.Destroy(this.equippedItems[i]);
				this.equippedItems[i] = null;
			}
		}
		CreatureActions creatureActions = null;
		if (this.sailing && this.npc && this.creatures.creatureBoat && this.creatures.creatureBoat.leadCreature)
		{
			creatureActions = this.creatures.creatureBoat.leadCreature.gameObject.GetComponent<CreatureActions>();
		}
		int count = this.bag.Count;
		for (int j = 0; j < count; j++)
		{
			if (j % 2 == 0 && this.bag[j] > 1 && this.durability[j / 2].x >= 0f)
			{
				Library.Inventory invRow = Links.x.library.GetInvRow(this.bag[j]);
				if (invRow._ArmorID != -1)
				{
					bool flag = this.IsSpecialItem(invRow, j);
					if (this.bag[j] == 2)
					{
						flag = true;
					}
					bool flag2 = true;
					int num = 3;
					if (this.stats.animal)
					{
						num = 7;
					}
					if (Random.Range(0, num) != 0)
					{
						flag2 = false;
					}
					if (flag)
					{
						flag2 = true;
					}
					if (invRow._DisplayName == "Severed Head")
					{
						flag2 = this.dead;
					}
					if (flag2)
					{
						if ((float)this.bag[j + 1] > 5f && this.npc)
						{
							int num2 = this.bag[j + 1];
							this.bag[j + 1] = 5 + (int)Mathf.Round((float)num2 / 20f);
						}
						int num3 = this.bag[j + 1];
						if (j == 8 || j == 10 || j == 12 || j == 14 || j == 26 || j == 28)
						{
							num3 = Random.Range(1, invRow._MaxStackSize / 4);
						}
						if (this.sailing && this.npc)
						{
							creatureActions.AddDroppedItemToList(this.bag[j], num3, (int)this.sockets[j].x, (int)this.sockets[j].y, (int)this.sockets[j].z, (int)this.sockets[j + 1].x, (int)this.sockets[j + 1].y, (int)this.sockets[j + 1].z, (int)this.durability[j / 2].x, (int)this.durability[j / 2].y);
						}
						else
						{
							Vector4 vector = this.durability[j / 2];
							if (j == 18)
							{
								vector.x *= 2f;
							}
							int num4 = -1;
							if (this.node != null)
							{
								num4 = (int)this.node.Area;
							}
							global::Item item = Links.x.inventory.groundBag.DropLoot(this.bag[j], num3, this.sockets[j], this.sockets[j + 1], vector, this, this.tr.position + new Vector3(Random.Range(-4f, 4f), 0f, Random.Range(-4f, 4f)), true, false, num4);
							if (item)
							{
								Vector3 vector2 = this.tr.position + new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f));
								RaycastHit raycastHit;
								if (Physics.Linecast(vector2 + new Vector3(0f, 10f, 0f), vector2 - new Vector3(0f, 20f, 0f), out raycastHit, 4194305))
								{
									item.tr.position = raycastHit.point;
								}
								else
								{
									item.tr.position += new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f));
								}
							}
						}
						this.bag[j] = 0;
						this.bag[j + 1] = 0;
						this.sockets[j] = Vector3.zero;
						this.sockets[j + 1] = Vector3.zero;
						this.durability[j / 2] = Vector4.zero;
					}
				}
			}
		}
	}

	// Token: 0x06000358 RID: 856 RVA: 0x00049C58 File Offset: 0x00047E58
	private bool IsSpecialItem(Library.Inventory row, int rowNum)
	{
		bool flag = true;
		if (row._Tag.Contains("Component"))
		{
			flag = false;
		}
		return flag;
	}

	// Token: 0x06000359 RID: 857 RVA: 0x00049C7C File Offset: 0x00047E7C
	public int SellPriceOfDrops()
	{
		int count = this.bag.Count;
		int num = 0;
		for (int i = 0; i < count; i++)
		{
			if (i % 2 == 0 && this.bag[i] > 1 && this.durability[i / 2].x >= 0f)
			{
				Library.Inventory invRow = Links.x.library.GetInvRow(this.bag[i]);
				if (invRow._ArmorID != -1 && (this.IsSpecialItem(invRow, i) || Random.Range(0, 3) == 0))
				{
					int num2 = this.bag[i + 1];
					if (num2 == 0)
					{
						num2 = 1;
					}
					if (i == 8 || i == 10 || i == 12 || i == 14 || i == 26 || i == 28)
					{
						num2 = Random.Range(1, invRow._MaxStackSize / 4);
					}
					if (!invRow._Stackable)
					{
						num2 = 1;
					}
					if (invRow._NeedFullStack)
					{
						num2 = 0;
					}
					int num3 = invRow._SellPrice * num2;
					num += num3;
					Debug.Log(string.Concat(new string[]
					{
						(this != null) ? this.ToString() : null,
						" sell ",
						invRow._Name,
						" amount ",
						num2.ToString(),
						" for ",
						num3.ToString()
					}));
				}
			}
		}
		return num;
	}

	// Token: 0x0600035A RID: 858 RVA: 0x00049DE0 File Offset: 0x00047FE0
	public void EndStun()
	{
		this.stunned = false;
		this.ignoreNodeIDs = false;
		if (!this.tr)
		{
			this.tr = base.transform;
		}
		if (this.sailing && this.npc)
		{
			Debug.Log(this.boat);
			if (this.boat && !this.boat.navigator)
			{
				this.boat.SetBoatNavigator(this, false);
			}
		}
		this.FirstPosition(null);
		this.PlayAnimation("GetUp", 0f);
		this.stats.state = "NormalDazed";
		this.PlaySoundFX(0, 0);
		this.stats.SetHealth(this.stats.HealthMax(), false);
		if (this.creatures)
		{
			this.creatures.UpdateCharacter(this);
		}
		this.CircleAnimation("Idle");
		this.wasStunned = true;
		if (this.thisCollider)
		{
			this.thisCollider.enabled = true;
		}
		if (this.party)
		{
			this.stats.SetHealth((int)((float)this.stats.HealthMax() / 2f), false);
		}
		if (this.npc)
		{
			if (this.creatures)
			{
				this.creatures.CheckQuestSwap();
			}
			this.EndStunLoot();
			this.SetupNPCAfterLoadedVariables();
			Links.x.diorama.HasForSaleGroundItems(this.creatures.creatures);
		}
		this.droppedItems = false;
	}

	// Token: 0x0600035B RID: 859 RVA: 0x00049F5C File Offset: 0x0004815C
	public void EndStunLoot()
	{
		if (this.ghost)
		{
			return;
		}
		if (this.sailing)
		{
			return;
		}
		List<int> savedBag = this.stats.savedBag;
		List<Vector4> savedDur = this.stats.savedDur;
		for (int i = 0; i < savedBag.Count; i++)
		{
			if (i % 2 == 0 && savedBag[i] > 1 && savedDur[i / 2].x >= 0f && !this.sailing)
			{
				int num = savedBag[i];
				global::Item item = Links.x.diorama.CheckGroundForItem(this.creatures.creatures, this.creatures.GetCharacterIndex(this), num, this.tr.position, this, i);
				if (item)
				{
					this.bag[i] = item.ID;
					this.bag[i + 1] = item.stackSize;
					this.durability[i / 2] = item.durability;
					this.sockets[i] = item.socketA;
					this.sockets[i + 1] = item.socketB;
					item.DestroyItem(false, false);
				}
				else
				{
					if (i == 0 || i == 32)
					{
						this.bag[i] = 1;
						this.durability[i / 2] = new Vector4(100f, 0f, 0f, 0f);
					}
					else
					{
						this.bag[i] = 0;
						this.durability[i / 2] = Vector4.zero;
					}
					this.sockets[i] = Vector3.zero;
					this.sockets[i + 1] = Vector3.zero;
					this.bag[i + 1] = 0;
				}
			}
		}
	}

	// Token: 0x0600035C RID: 860 RVA: 0x0004A130 File Offset: 0x00048330
	public void Stunned(bool fromSave)
	{
		this.stunned = true;
		if (this.hasActions)
		{
			this.EndCombat();
			this.actions.EndActions();
		}
		if (this.moving)
		{
			this.TargetReached();
		}
		if (this.turning)
		{
			this.EndTurning(false);
		}
		this.ignoreNodeIDs = false;
		if (this.party)
		{
			if (this.selected)
			{
				this.RemoveFromSelected(false);
			}
			if (Links.x.AllStunned() && Links.x.gaia.sceneLoaded)
			{
				Links.x.fellowship.StartDeathSequence();
			}
		}
		if (this.dodgeFX)
		{
			this.dodging = false;
			Links.x.cellar.ReturnPooledGameObject(91, this.dodgeFX);
			this.dodgeFX = null;
		}
		if (this.waypoint)
		{
			this.waypoint.transform.position = Links.x.gameplay.farPosition;
			if (this.waypointAnimator.enabled)
			{
				this.waypointAnimator.enabled = false;
			}
		}
		this.moving = false;
		if (this.sleeping)
		{
			this.RemoveEffect(40, "", true);
		}
		this.sleeping = false;
		this.stats.SetHealth(0, false);
		this.doingHit = false;
		this.centerOfAttention = false;
		this.overlapping = false;
		this.body.EndBlink();
		this.orbitTarget = null;
		if (this.isHit)
		{
			this.hitTime += 50f;
		}
		this.stats.state = "Stunned";
		bool flag = Links.x.sensory.CheckProof(this);
		if (!fromSave)
		{
			this.numberOfTimesKilled += 1f;
		}
		if (flag && this.npc)
		{
			this.stats.state = "StunnedExile";
			if (!fromSave)
			{
				QuestLog.SetQuestState(this.stats.characterRow._Quest, QuestState.WaitingForExileIsland);
				Records.x.AddStunned(this, false);
				if (Records.x.CanTurnInExile(this.stats.characterRow._Quest, this.stats.xmlName))
				{
					Links.x.combat.exileCharacter = this;
				}
			}
		}
		Records.x.CheckStunnedStates();
		this.PlayFaceAnimation("Sleep");
		if (!fromSave)
		{
			int num = 24;
			if (this.creatures)
			{
				this.creatures.AddTimeOfDeath(Mathf.Floor((float)Links.x.gameplay.GetCurrentGameTimeHours()) + (float)num, this);
			}
			else
			{
				this.timeOfDeath = Mathf.Floor((float)Links.x.gameplay.GetCurrentGameTimeHours()) + (float)num;
			}
			if (this.sailing && this.boatNavigator)
			{
				this.boat.SetBoatNavigator(null, false);
			}
			if (this.creatures && this.creatures.creatures.pickOneLeader && !this.stats.defendMainInCombat)
			{
				this.creatures.LeaderDied(this);
			}
		}
		if (this.thisCollider)
		{
			this.thisCollider.enabled = false;
		}
		if (!fromSave)
		{
			this.PlaySoundFX(0, 3);
		}
		this.hovering = false;
		if (this.hovering)
		{
			this.HoverOut(false);
		}
		this.body.Hover(false, false);
		if (this.creatures && !fromSave)
		{
			this.creatures.UpdateCharacter(this);
		}
		if (!fromSave)
		{
			this.PlayFaceAnimation(FaceAnimations.AnimationNames.Sleep);
		}
		if (!this.isHit)
		{
			this.PlayAnimation("Hit Down", 0f);
		}
		if (Links.x.gaia.sceneLoaded && Links.x.gameCard.hoverCharacter == this)
		{
			Links.x.gameCard.EndHover(this, false);
		}
		if (this.inCircle && this.npc)
		{
			this.group.LeaveCircle(this);
		}
		bool flag2 = true;
		if (this.sailing && this.npc)
		{
			if (this.creatures.creatureBoat)
			{
				if (this.creatures.creatureBoat.leadCreature)
				{
					this.creatures.creatureBoat.leadCreature.gameObject.GetComponent<CreatureActions>();
				}
				else
				{
					flag2 = false;
				}
			}
			else
			{
				flag2 = false;
			}
		}
		if (this.party)
		{
			flag2 = false;
		}
		if (this.sailing)
		{
			flag2 = false;
		}
		if (flag2 && !fromSave)
		{
			this.DropLoot();
		}
		else if (flag2)
		{
			int count = this.bag.Count;
			for (int i = 0; i < count; i++)
			{
				if (i % 2 == 0 && this.bag[i] > 1 && this.durability[i / 2].x >= 0f)
				{
					this.bag[i] = 0;
					this.bag[i + 1] = 0;
					this.sockets[i] = Vector3.zero;
					this.sockets[i + 1] = Vector3.zero;
					this.durability[i / 2] = Vector4.zero;
				}
			}
		}
		if (this.party)
		{
			Effects effects = base.gameObject.AddComponent<Effects>();
			Links.x.cellar.AddEffects(effects);
			effects.source = this;
			effects.target = this;
			effects.fromLoad = false;
			effects.effectName = "Stunned";
			effects.sourceLevel = 0f;
			effects.Inflicted(false);
			this.node.ID = this.nodeStationaryID;
			this.stats.SetHealth(0, false);
			this.portrait.SetHealthColor();
			if (this.portrait)
			{
				this.portrait.skillBag.SetTrinketGrid(false);
			}
		}
		else
		{
			if (this.stats.xmlName == "RenazinSpy")
			{
				Records.x.AddQuestToTimer("D6_RenazinInformant", 28f, "any", "activePart2", false);
			}
			if (this.stats.xmlName == "RozafirStoreKeep")
			{
				Links.x.dialogue.HealRozafirFarmers();
			}
			if (this.circle)
			{
				this.circle.SetActive(false);
			}
			this.RemoveLastNode(false);
			this.lastNode = null;
			List<Effects> list = new List<Effects>();
			foreach (Effects effects2 in this.stats.effects)
			{
				list.Add(effects2);
			}
			for (int j = 0; j < list.Count; j++)
			{
				list[j].Healed(true, false);
			}
			this.stats.ClearAilments();
			Links.x.diorama.CheckLinkedCharacters(this);
		}
		this.droppedItems = true;
	}

	// Token: 0x0600035D RID: 861 RVA: 0x0004A7F8 File Offset: 0x000489F8
	public void AddDead()
	{
		Records.x.AddDead(this);
		this.dead = true;
	}

	// Token: 0x0600035E RID: 862 RVA: 0x0004A80C File Offset: 0x00048A0C
	public void Dead(bool fromSave, bool fromCombat, bool permanent)
	{
		this.dead = true;
		if (this.turning)
		{
			this.EndTurning(false);
		}
		this.moving = false;
		if (this.sleeping)
		{
			this.sleeping = false;
			this.RemoveEffect(40, "", true);
		}
		this.doingHit = false;
		this.centerOfAttention = false;
		this.overlapping = false;
		this.jumpingAreas = false;
		this.meshAlwaysOff = false;
		this.inAction = false;
		this.inRecovery = false;
		this.inQueuedAbility = false;
		if (this.hasActions)
		{
			this.EndCombat();
			this.actions.EndActions();
		}
		if (this.statusRing)
		{
			this.statusRing.End();
			this.statusRing = null;
		}
		if (this.inCircle && this.npc)
		{
			this.group.LeaveCircle(this);
		}
		this.body.EndBlink();
		this.orbitTarget = null;
		bool flag = false;
		if (Records.x.dialogue && Links.x.dialogue.diaFile.Contains("PostingMaster"))
		{
			flag = true;
		}
		if (!this.party || (this.party && flag))
		{
			this.stats.state = "Dead";
			this.RemoveLastNode(false);
			this.lastNode = null;
		}
		else
		{
			this.node.ID = this.nodeStationaryID;
		}
		if (this.isHit)
		{
			this.hitTime += 50f;
		}
		if (this.dodgeFX)
		{
			this.dodging = false;
			Links.x.cellar.ReturnPooledGameObject(91, this.dodgeFX);
			this.dodgeFX = null;
		}
		if (Links.x.gaia.sceneLoaded && Links.x.gameCard.hoverCharacter == this)
		{
			Links.x.gameCard.EndHover(this, false);
		}
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Dead);
		if (!fromSave)
		{
			this.numberOfTimesKilled += 1f;
		}
		if (!fromSave && !this.missing)
		{
			if (this.stats.characterRow._Quest != "")
			{
				bool flag2 = false;
				if (this.stats.characterRow._QuestProofState != "")
				{
					if (Links.x.sensory.CheckProof(this) || Records.x.IsFelon(this.stats.xmlName))
					{
						flag2 = true;
						QuestLog.SetQuestState(this.stats.characterRow._Quest, QuestState.PerpIsDead);
						if (this.stats.xmlName == "RenazinSpy")
						{
							Records.x.AddQuestToTimer("D6_RenazinInformant", 28f, "any", "activePart2", false);
						}
					}
					if (this.stats.xmlName == "RozafirStoreKeep")
					{
						Records.x.AddQuestToTimer("D6_NewStoreKeep", 24f, "unassigned", "active", false);
						Links.x.dialogue.HealRozafirFarmers();
					}
				}
				if (this.stats.characterRow._SetQuestStateOnDeath != "" && !flag2)
				{
					QuestState questState = Records.x.StringToQuestState(this.stats.characterRow._SetQuestStateOnDeath);
					Debug.Log(string.Concat(new string[]
					{
						"Setting death state ",
						this.stats.characterRow._Quest,
						" ",
						questState.ToString(),
						" ",
						this.stats.characterRow._SetQuestStateOnDeath
					}));
					QuestLog.SetQuestState(this.stats.characterRow._Quest, questState);
					if (this.stats.xmlName == "RozafirStoreKeep")
					{
						Records.x.AddQuestToTimer("D6_LicechGuardsLeave", 2f, "unassigned", "active", false);
						Links.x.dialogue.HealRozafirFarmers();
					}
					if (this.stats.xmlName == "RenazinSpy")
					{
						Records.x.AddQuestToTimer("D6_RenazinInformant", 28f, "any", "activePart2", false);
					}
					Links.x.diorama.CheckQuestActivations();
				}
				Records.x.CheckStunnedStates();
				Records.x.KilledStunnedFelon(this.stats.xmlName);
			}
			else if (this.stats.xmlName.Contains("FishMonsterWhite") && Links.x.gameplay.IsDay() && this.node.GraphIndex == 0U)
			{
				if (QuestLog.GetQuestState("Sela_Quest") != QuestState.Unassigned)
				{
					Links.x.main.StartQuip("Sela will be pleased");
				}
				if (QuestLog.GetQuestState("Sela_Quest") != QuestState.Complete)
				{
					Debug.Log("Killed fish monster in sunlight");
					QuestLog.SetQuestState("Sela_Quest", QuestState.Success);
					MasterAudio.PlaySoundAndForget("Feedback", 0.5f, new float?(1f), 0f, "Song Learned", null);
					this.str.Clear();
					this.str.Append("<color=#FFFFFF>Sela is pleased</color>");
					Links.x.gameFeed.AddFeed(this.str.ToString());
				}
			}
			if (!this.summoned)
			{
				Records.x.KilledStunnedVictim(this.stats.xmlName);
			}
			if (this.creatures && this.creatures.creatures.pickOneLeader && !this.stats.defendMainInCombat)
			{
				this.creatures.LeaderDied(this);
			}
			if (this.npc && !this.summoned)
			{
				Links.x.diorama.CheckCampCleared();
				Links.x.diorama.CheckLinkedCharacters(this);
			}
		}
		else if (!fromSave && this.stats.characterRow._Quest != "")
		{
			Records.x.KilledStunnedFelon(this.stats.xmlName);
		}
		if (!this.party)
		{
			if (this.sailing && this.boatNavigator)
			{
				this.boat.SetBoatNavigator(null, false);
			}
			this.ZeroPreviousNode();
			this.lastNode = null;
			if (!this.sailing)
			{
				if (this.node != null && this.radius == 1f && (this.node.ID == this.nodeStationaryID || this.node.ID == this.nodeMovingID))
				{
					this.node.ID = 0;
					this.node.Tag = 0U;
				}
				if (this.radius > 1f && this.node != null)
				{
					this.node.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
					this.node.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
				}
			}
			this.timeOfDeath = float.PositiveInfinity;
			if (this.creatures)
			{
				this.timeOfDeath = Links.x.gameplay.seconds + Random.Range(70f, 90f);
				float num = Random.Range(24f, 48f);
				if (this.creatures.sailing)
				{
					num = 26f;
				}
				this.creatures.AddTimeOfDeath((float)Links.x.gameplay.GetCurrentGameTimeHours() + num, this);
			}
			if (!fromSave)
			{
				float num2 = Random.Range(45f, 80f);
				if (!this.creatures.creatures.hasLeader)
				{
					num2 = Random.Range(45f, 80f) * 7f;
				}
				if (!this.ghost)
				{
					if (this.stats.characterRow._DeathType == "None" || permanent)
					{
						this.stats.state = "Swallowed";
						if (!this.goreObj)
						{
							this.PlayAnimation("Death", 0f);
						}
						Links.x.sensory.AddMP(this);
					}
					else if (this.creatures.temporary)
					{
						this.stats.state = "Gone";
						this.PlayAnimation("Death", 0f);
						Links.x.sensory.AddMP(this);
					}
					else if (Links.x.diorama.InResurrectionFog(this.tr.position) && (this.stats.characterRow._DeathType == "Volling" || this.stats.characterRow._DeathType == "Animal" || this.stats.characterRow._DeathType == "Resurrect"))
					{
						this.stats.state = "Purgatory";
						if (!this.goreObj)
						{
							this.PlayAnimation("Death", 0f);
						}
						this.timeOfDeath = Links.x.gameplay.seconds + num2;
						this.creatures.AddTimeOfDeath(this.timeOfDeath, this);
						if (!this.ghost)
						{
							Links.x.sensory.AddMP(this);
						}
					}
					else
					{
						this.stats.state = "Swallowed";
						if (!this.goreObj)
						{
							this.PlayAnimation("Death", 0f);
						}
						GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(63);
						pooledGameObject.transform.position = this.tr.position;
						pooledGameObject.SetActive(true);
						Links.x.cameraEffects.AddRemoveGhost(pooledGameObject.transform.GetChild(0).gameObject.GetComponent<MeshRenderer>(), true);
						Links.x.sensory.AddMP(this);
					}
					if (this.stats.characterRow._DeathType == "Bat")
					{
						base.StartCoroutine(this.SpawnDeathCreature());
					}
				}
				else
				{
					if (Links.x.diorama.mapCanResurrect)
					{
						this.stats.state = "Purgatory";
					}
					else
					{
						this.stats.state = "Swallowed";
						Links.x.sensory.AddMP(this);
					}
					this.PlayAnimation("Dead", 0f);
					this.timeOfDeath = Links.x.gameplay.seconds + num2;
					this.creatures.AddTimeOfDeath(this.timeOfDeath, this);
				}
			}
			this.gos.Remove(this);
			this.ReturnPooledObjects();
		}
		else if (flag)
		{
			if (Links.x.diorama.InResurrectionFog(this.tr.position))
			{
				this.stats.state = "Purgatory";
			}
			else
			{
				this.stats.state = "Swallowed";
			}
			this.timeOfDeath = Links.x.gameplay.seconds + Random.Range(45f, 80f);
		}
		else if (!this.revivalGem)
		{
			GameObject pooledGameObject2 = Links.x.cellar.GetPooledGameObject(123);
			this.revivalGem = pooledGameObject2.GetComponent<PuzzleActions>();
			pooledGameObject2.transform.SetParent(this.tr, false);
			this.SetRevivalGemPosition();
			pooledGameObject2.SetActive(true);
			this.revivalGem.interactCharacter = this;
			this.revivalGem.LoadPuzzleInfo();
		}
		if (this.body.dodgeTime > 0f)
		{
			this.body.Dodge(false);
		}
		if (this.thisCollider)
		{
			this.thisCollider.enabled = false;
		}
		if (!this.party)
		{
			List<Effects> list = new List<Effects>();
			foreach (Effects effects in this.stats.effects)
			{
				list.Add(effects);
			}
			for (int i = 0; i < list.Count; i++)
			{
				list[i].Healed(true, false);
			}
			this.stats.ClearAilments();
		}
		if (fromCombat)
		{
			this.PlaySoundFX(0, 3);
		}
		this.hovering = false;
		if (!fromCombat)
		{
			this.HoverOut(false);
		}
		if (this.party)
		{
			if (this.portrait)
			{
				this.portrait.skillBag.SetTrinketGrid(false);
			}
			this.PlayAnimation("Death", 0f);
			if (Links.x.AllDead())
			{
				Links.x.fellowship.StartDeathSequence();
			}
			else if (Links.x.main == this)
			{
				base.StartCoroutine(this.WaitToChangeLeader());
			}
			if (flag)
			{
				this.ReturnPartyPooledObjects();
				this.ReturnPooledObjects();
			}
		}
		this.body.Hover(false, false);
		if (!this.missing && (this.npc || (this.party && flag) || (this.summoned && this.charmed) || (this.npc && this.body.goreObj)))
		{
			Links.x.ChangeDeadList(this, true);
		}
		if (fromCombat)
		{
			this.PlayAnimation("Death", 0f);
			this.PlayFaceAnimation("Sleep");
		}
		if (this.missing)
		{
			this.body.SetMeshState(false, true);
			this.visible = 0;
			this.stats.state = "Fled";
		}
		if ((!this.party || (this.party && flag)) && this.gos != null)
		{
			int num3 = this.gos.IndexOf(this);
			if (num3 > -1)
			{
				this.gos.RemoveAt(num3);
			}
		}
		if (this.npc)
		{
			Links.x.ChangeNPCList(this, false);
		}
		else if ((this.party && flag) || !this.party)
		{
			Links.x.ChangePartyList(this, false, this.party);
		}
		this.dead = true;
		if (this.creatures && !fromSave)
		{
			this.creatures.UpdateCharacter(this);
		}
		if (!this.missing)
		{
			if (!fromSave && this.npc)
			{
				Links.x.combat.allDeadCount++;
			}
			bool flag3 = true;
			if (this.sailing && this.npc)
			{
				if (this.creatures.creatureBoat)
				{
					if (this.creatures.creatureBoat.leadCreature)
					{
						this.creatures.creatureBoat.leadCreature.gameObject.GetComponent<CreatureActions>();
					}
					else
					{
						flag3 = false;
					}
				}
				else
				{
					flag3 = false;
				}
			}
			if (flag3 && fromCombat && (this.npc || flag))
			{
				this.DropLoot();
			}
		}
		if (this.party && flag)
		{
			Links.x.inventory.ClearBag(this);
			Links.x.fellowship.CompanionDied();
		}
		base.gameObject.layer = 0;
		if (!this.party && !this.isHit)
		{
			base.enabled = false;
		}
		this.deadInactive = false;
		if (this.summoned)
		{
			if (!this.creatures.GetTileEffect())
			{
				this.creatures.Unsummon(false);
				if (!this.pipeSummons && fromCombat)
				{
					GameObject pooledGameObject3 = Links.x.cellar.GetPooledGameObject(32);
					pooledGameObject3.transform.position = this.tr.position;
					pooledGameObject3.SetActive(true);
				}
			}
			else
			{
				this.creatures.GetTileEffect().RemoveSummons(this.creatures, this.tr.position);
			}
		}
		if (this.party && !fromSave && flag)
		{
			if (Records.x.combat && Links.x.diorama.InResurrectionFog(this.tr.position))
			{
				Records.x.AddTemporaryCreature(this.stats.GetName(), "Ghost", "GhostMap", Links.x.diorama.sceneName, 2, this.tr.position, "Resurrected", this.stats.GetName(), this.stats.HealthMax() / 2, "", 0, 0f, "GhostMap", this.tr.position, false);
			}
			this.stats.SetHealth(0, false);
			this.TurnScriptsOff();
		}
		this.droppedItems = true;
	}

	// Token: 0x0600035F RID: 863 RVA: 0x0004B85C File Offset: 0x00049A5C
	private IEnumerator WaitToChangeLeader()
	{
		yield return new WaitForSeconds(0.5f);
		if (this == Links.x.main && this.dead && (Links.x.creation || (Records.x.InCombat(false) && !Records.x.dialogue && !Records.x.inMenus)))
		{
			Character nearestParty = Links.x.GetNearestParty(this.tr.position);
			if (nearestParty)
			{
				nearestParty.SetAsLeader();
				Links.x.fellowship.SingleSelected(nearestParty);
				nearestParty.AddToSelected(false, true);
				nearestParty.SetAsLeader();
				Links.x.rtsCamera.Follow(nearestParty.tr, nearestParty, false);
			}
		}
		yield break;
	}

	// Token: 0x06000360 RID: 864 RVA: 0x0004B86B File Offset: 0x00049A6B
	private IEnumerator SpawnDeathCreature()
	{
		yield return new WaitForSeconds(0.0001f);
		CreatureActions creatureActions = this.creatures;
		Vector3 position = this.tr.position;
		string text = "SummonBatSpawn";
		Quaternion rotation = this.tr.rotation;
		bool flag = false;
		Character firstCharacter = Links.x.gaia.CreateCreature(position, rotation, text, flag, 0f, 1).GetFirstCharacter();
		firstCharacter.TransferLKP(this);
		firstCharacter.SetPosition(position, null);
		firstCharacter.SetRotation(rotation, false, false);
		firstCharacter.hostility = 2;
		firstCharacter.OverridePocketPause();
		firstCharacter.SetAnimatorSpeed(1f);
		firstCharacter.UpdateLKP(Links.x.main, Links.x.main.node, "Attack", true);
		firstCharacter.jumpingPosition = false;
		if (!Records.x.InCombat(false))
		{
			Links.x.combat.StartCombat(Links.x.main, firstCharacter, false, true);
		}
		Links.x.combat.AddParty(firstCharacter, false, null, true);
		yield break;
	}

	// Token: 0x06000361 RID: 865 RVA: 0x0004B87C File Offset: 0x00049A7C
	public void AddBlood(Character actionTarget)
	{
		GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(5);
		pooledGameObject.gameObject.SetActive(true);
		pooledGameObject.transform.position = actionTarget.body.HeadPosition(0f);
		Quaternion quaternion = this.tr.rotation;
		if (actionTarget != this.tr && this.tr.position != actionTarget.tr.position)
		{
			quaternion = Quaternion.LookRotation(this.tr.position - actionTarget.tr.position);
		}
		pooledGameObject.transform.rotation = quaternion;
		actionTarget.PlayAnimation("Hit", 0f);
	}

	// Token: 0x06000362 RID: 866 RVA: 0x0004B933 File Offset: 0x00049B33
	public void Explode()
	{
		if (!this.exploded)
		{
			this.exploded = true;
			Links.x.diorama.BombBomb(this.currentPosition, this);
		}
	}

	// Token: 0x06000363 RID: 867 RVA: 0x0004B95C File Offset: 0x00049B5C
	public void AddDamage(Character actionTarget, float damage, bool canShowDeath, bool interrupt, bool isMainTarget, string hitType, float hitTimeAdd, float staminaReduction)
	{
		if (actionTarget.isBoro)
		{
			return;
		}
		GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(5);
		pooledGameObject.gameObject.SetActive(true);
		pooledGameObject.transform.position = actionTarget.body.HeadPosition(0f);
		Quaternion quaternion = this.tr.rotation;
		if (actionTarget != this.tr && this.tr.position != actionTarget.tr.position)
		{
			quaternion = Quaternion.LookRotation(this.tr.position - actionTarget.tr.position);
		}
		pooledGameObject.transform.rotation = quaternion;
		actionTarget.PlaySoundFX(0, 2);
		if (!actionTarget.summoned && Records.x.InCombat(false))
		{
			Links.x.cellar.DropPickup(true, this.torsoPosition, actionTarget);
		}
		bool flag = false;
		if (actionTarget.stats.xmlName.Contains("Stack") && actionTarget.body.model.Contains("Stack"))
		{
			flag = true;
		}
		if (isMainTarget)
		{
			MasterAudio.PlaySound3DAtVector3AndForget("Blood Hit", actionTarget.tr.position, 1f, new float?(1f), 0.1f, "", null);
			Animator animator = Links.x.cellar.GetBlood();
			animator.gameObject.SetActive(true);
			animator.transform.position = actionTarget.body.HeadPosition(0f);
			animator.transform.rotation = quaternion;
			int num = Random.Range(0, 5);
			if (num == 1)
			{
				animator.Play("Blood_animation_B");
			}
			if (num == 2)
			{
				animator.Play("Blood_animation_C");
			}
			if (num == 3)
			{
				animator.Play("Blood_animation_D");
			}
			if (num == 4)
			{
				animator.Play("Blood_animation_E");
			}
			animator = Links.x.cellar.GetBlood();
			animator.gameObject.SetActive(true);
			animator.transform.position = actionTarget.body.HeadPosition(0f) - new Vector3(0f, 0.5f, 0f);
			animator.transform.rotation = quaternion;
			int num2 = Random.Range(0, 5);
			if (num2 == 1)
			{
				animator.Play("Blood_animation_B");
			}
			if (num2 == 2)
			{
				animator.Play("Blood_animation_C");
			}
			if (num2 == 3)
			{
				animator.Play("Blood_animation_D");
			}
			if (num2 == 4)
			{
				animator.Play("Blood_animation_E");
			}
		}
		bool flag2 = Records.x.noDamage;
		if (!Records.x.editor)
		{
			flag2 = false;
		}
		if ((!actionTarget.party || (actionTarget.party && !flag2)) && damage != 0f && !Records.x.miniGame && !flag)
		{
			actionTarget.stats.AddHealth((int)Mathf.Ceil(-1f * damage));
		}
		bool flag3 = true;
		bool flag4 = false;
		if (damage != 0f)
		{
			actionTarget.stats.hitCount++;
			if (actionTarget.npc)
			{
				actionTarget.stats.AddStamina(-3f - staminaReduction);
			}
			if (actionTarget.stats.pinning)
			{
				actionTarget.stats.pinHitCount++;
			}
			bool flag5 = true;
			bool flag6 = false;
			bool flag7 = false;
			bool flag8 = false;
			bool flag9 = false;
			if (flag)
			{
				flag5 = false;
				flag9 = true;
				if (actionTarget.body.model.Contains("Stack"))
				{
					flag3 = false;
					actionTarget.stats.SetHealth(actionTarget.stats.HealthMax(), false);
					actionTarget.UpdateModel("CropGoblinGrunt");
					actionTarget.animator.runtimeAnimatorController = Links.x.archives.GetOverrideController("_CropGoblinGrunt_Unarmed");
					CreatureActions creatureActions = actionTarget.creatures;
					Vector3 vector = actionTarget.tr.position + Quaternion.LookRotation(actionTarget.currentPosition - this.currentPosition) * Vector3.forward;
					if (actionTarget.node != null)
					{
						GraphNode graphNode = actionTarget.node.ClosestConnection(actionTarget.node, 0, 0, 25f, vector, 0, 0, actionTarget.nodeConstraint, 0);
						if (graphNode != null)
						{
							vector = (Vector3)graphNode.position;
						}
					}
					string text = "CropGoblin";
					Quaternion rotation = actionTarget.tr.rotation;
					Character firstCharacter = Links.x.gaia.CreateCreature(vector, rotation, text, false, 0f, 1).GetFirstCharacter();
					firstCharacter.TransferLKP(actionTarget);
					firstCharacter.SetPosition(vector, null);
					actionTarget.PlayAnimation("Idle", 0f);
					firstCharacter.SetRotation(rotation, false, false);
					if (this.npc)
					{
						firstCharacter.hostility = 2;
					}
					actionTarget.stats.SetHealth(actionTarget.stats.HealthMax(), false);
					Links.x.combat.AddParty(firstCharacter, false, null, true);
				}
			}
			float num3 = 8f;
			float num4 = 15f;
			if (actionTarget.party)
			{
				num4 = num3;
			}
			if (hitType.Contains("Bounce") && this.stats.Stuck() == 0 && !this.ambushing && !actionTarget.stats.pinned)
			{
				flag4 = true;
				Quaternion quaternion2 = Quaternion.LookRotation(this.currentPosition - actionTarget.currentPosition);
				actionTarget.SetRotation(quaternion2, false, true);
				if ((float)this.stats.weightBase < 20f)
				{
					flag8 = true;
				}
				bool flag10 = false;
				if (actionTarget.hasActions && actionTarget.actions.ai.jumping)
				{
					flag10 = true;
				}
				if (this.party && actionTarget.stats.Level() > this.stats.Level() && !flag10)
				{
					flag9 = true;
				}
				if (actionTarget.mainSelected || Links.x.combat.miniEvent)
				{
					if (Links.x.combat.miniEvent && !Links.x.combat.bubbleEvent && actionTarget.mainSelected)
					{
						flag5 = false;
					}
					if (Links.x.combat.miniEvent && Links.x.combat.bubbleEvent && actionTarget == Links.x.combat.bubbleEventTarget)
					{
						flag5 = false;
					}
					if (actionTarget.mainSelected && Links.x.combat.bubbleEvent)
					{
						flag6 = true;
					}
				}
				if (actionTarget.npc && actionTarget.stats.animal && actionTarget.stamina)
				{
					flag7 = actionTarget.stamina.hasArmor;
				}
				if (flag10)
				{
					flag6 = true;
				}
				bool flag11 = false;
				if (Links.x.combat.inPocketAttack && this.party)
				{
					if (actionTarget == Links.x.combat.rallyTarget)
					{
						flag11 = true;
					}
					if (Links.x.rallyStage.playing && Links.x.rallyStage.stage == "Bow")
					{
						flag11 = false;
					}
				}
				bool flag12 = false;
				if ((!actionTarget.party || flag6) && actionTarget.stats.characterRow._Height < 4f && actionTarget.animID != 53 && (!flag7 || flag11) && !flag8 && !flag9)
				{
					flag12 = true;
				}
				if (flag12 && (this.sailing || this.movesOnWater))
				{
					flag12 = false;
					flag5 = true;
				}
				if (flag12)
				{
					if (hitType.Contains("Small"))
					{
						actionTarget.Bounce(this, "Small Hit", hitTimeAdd);
					}
					else
					{
						actionTarget.Bounce(this, "Normal Hit", hitTimeAdd);
					}
				}
				else if (flag5 && !flag7 && !flag8 && !flag9)
				{
					actionTarget.isHit = true;
					if (actionTarget.actions)
					{
						actionTarget.actions.Interrupt();
					}
					actionTarget.hitTime = Links.x.gameplay.seconds + num4 + hitTimeAdd;
					actionTarget.hitTimeReal = Time.timeSinceLevelLoad;
					actionTarget.PlayAnimation("Hit Down", 0f);
				}
				else
				{
					flag4 = false;
				}
			}
			else if (!actionTarget.jumping && hitType == "Down" && !this.ambushing && !actionTarget.stats.pinned)
			{
				actionTarget.isHit = true;
				if (actionTarget.actions)
				{
					actionTarget.actions.Interrupt();
				}
				actionTarget.hitTime = Links.x.gameplay.seconds + num4 + hitTimeAdd;
				actionTarget.hitTimeReal = Time.timeSinceLevelLoad;
				actionTarget.PlayAnimation("Hit Down", 0f);
				if (Links.x.combat.inPocketAttack)
				{
					actionTarget.OverridePocketPause();
				}
				flag4 = true;
			}
		}
		if (!flag4)
		{
			if (actionTarget.animID != 53)
			{
				if (!interrupt)
				{
					actionTarget.PlayAnimation("Hit", 0f);
				}
				else
				{
					actionTarget.PlayAnimation("HitInterrupt", 0f);
				}
				if (Links.x.combat.inPocketAttack)
				{
					actionTarget.OverridePocketPause();
				}
			}
		}
		else if (interrupt && this.actions && !this.jumping)
		{
			this.actions.Interrupt();
		}
		if (actionTarget.stats.hasHitAI)
		{
			actionTarget.stats.DoHitAI(this);
		}
		if (damage == 0f)
		{
			return;
		}
		if (actionTarget.stats.HealthCurrent() < 0)
		{
			actionTarget.stats.SetHealth(0, false);
		}
		if (actionTarget.stats.HealthCurrent() <= 0 && !actionTarget.dead && canShowDeath && flag3)
		{
			bool flag13 = this.stats.ShouldStun(actionTarget);
			if (actionTarget.summoned)
			{
				flag13 = false;
			}
			if (actionTarget.ghost)
			{
				flag13 = false;
			}
			if (actionTarget.movesOnWater)
			{
				flag13 = false;
			}
			if (actionTarget.stats.hasEveryAttackAI && actionTarget.stats.xmlName.Contains("Bomb"))
			{
				flag13 = false;
				actionTarget.Explode();
			}
			if (actionTarget.stats.xmlName.Contains("GraveKeeper"))
			{
				if (actionTarget.stats.xmlName.Contains("LocalGraveKeeper") && Links.x.diorama.mapCanResurrect)
				{
					flag13 = true;
				}
				if (!actionTarget.stats.xmlName.Contains("Local"))
				{
					flag13 = false;
				}
			}
			if (this.ghost)
			{
				flag13 = false;
			}
			if (actionTarget.stats.xmlName.Contains("Acorn"))
			{
				flag13 = false;
			}
			if (actionTarget.npc)
			{
				int xp = actionTarget.stats.characterRow._XP;
				Links.x.fellowship.AddXP(xp, actionTarget, false);
			}
			if (this.party)
			{
				this.stats.killCount++;
			}
			if (!flag13 || actionTarget.party)
			{
				this.str.Clear();
				if (!actionTarget.npc)
				{
					this.str.Append(Links.x.gameFeed.GetPartyColorText(actionTarget));
				}
				this.str.Append(actionTarget.stats.GetName());
				if (!actionTarget.npc)
				{
					this.str.Append("</color>");
				}
				if (!actionTarget.party)
				{
					this.str.Append(" is dead");
				}
				else
				{
					this.str.Append(" is knocked out");
				}
				Links.x.gameFeed.AddFeed(this.str.ToString());
				actionTarget.body.lookAtController.EndLook();
				MasterAudio.PlaySound3DAtVector3AndForget("Body Fall", this.tr.position, 1f, new float?(1f), 0.5f, "", null);
				MasterAudio.PlaySound3DAtVector3AndForget("Death", this.tr.position, 1f, new float?(1f), 0f, "", null);
				if (this.party && this.stats.HasSpellbook())
				{
					this.stats.AddSpiritFromKill(3f);
				}
				if (!actionTarget.party)
				{
					GameObject gameObject = Links.x.archives.CheckRecycledDeaths(actionTarget.stats.characterRow._DeathID, "Random");
					if (gameObject == null)
					{
						int num5 = Random.Range(0, 3);
						string text2 = "";
						if (num5 == 0)
						{
							text2 = "Random";
						}
						if (num5 == 1)
						{
							text2 = "Head";
						}
						if (num5 == 2)
						{
							text2 = "Critical";
						}
						gameObject = Links.x.library.GetDeath(actionTarget.stats.characterRow._DeathID, text2);
						if (gameObject)
						{
							GameObject gameObject2 = Object.Instantiate<GameObject>(gameObject, actionTarget.tr.position, actionTarget.tr.rotation, Links.x.cellar.tr);
							gameObject2.SetActive(false);
							gameObject = gameObject2;
							Gore gore = gameObject2.AddComponent<Gore>();
							actionTarget.body.goreScript = gore;
							gore.Setup();
						}
					}
					if (!actionTarget.goreObj)
					{
						actionTarget.goreObj = gameObject;
						actionTarget.goreType = "Random";
						if (gameObject)
						{
							Vector3 position = actionTarget.tr.position;
							position.y -= 1f;
							gameObject.transform.parent = null;
							gameObject.transform.position = actionTarget.tr.position + new Vector3(0f, 0.5f, 0f);
							gameObject.transform.rotation = actionTarget.tr.rotation;
							actionTarget.body.StartDead(position);
							Links.x.combat.preDome = false;
							Gore gore2 = gameObject.GetComponent<Gore>();
							if (gore2)
							{
								actionTarget.body.goreScript = gore2;
								gore2.DoReset();
							}
							else
							{
								gore2 = gameObject.AddComponent<Gore>();
								actionTarget.body.goreScript = gore2;
								gore2.Setup();
							}
							gore2.character = actionTarget;
							gore2.startTime = Links.x.gameplay.seconds;
							gameObject.SetActive(true);
							float num6 = 600f;
							if (actionTarget.stats.xmlName.Contains("Bomb"))
							{
								actionTarget.body.AddExplosionDeadForce();
							}
							else
							{
								actionTarget.body.AddDeadForce(Quaternion.LookRotation(position - this.tr.position) * Vector3.forward, num6);
							}
							if (Links.x.combat.inPocketAttack && Links.x.rallyStage.playing)
							{
								actionTarget.body.PocketGore(false);
							}
						}
						else
						{
							Vector3 position2 = actionTarget.tr.position;
							position2.y -= 1f;
							actionTarget.body.StartDead(position2);
						}
					}
				}
				bool flag14 = false;
				if (!actionTarget.dead)
				{
					actionTarget.Dead(false, true, flag14);
				}
				if (actionTarget.npc)
				{
					Links.x.combat.Enraged();
				}
				if (!actionTarget.summoned && Records.x.InCombat(false) && !actionTarget.ghost)
				{
					Links.x.cellar.DropPickup(false, this.torsoPosition, actionTarget);
					return;
				}
			}
			else
			{
				this.str.Clear();
				if (!actionTarget.npc)
				{
					this.str.Append(Links.x.gameFeed.GetPartyColorText(actionTarget));
				}
				this.str.Append(actionTarget.stats.GetName());
				if (!actionTarget.npc)
				{
					this.str.Append("</color>");
				}
				if (this.stats.xmlName.Contains("LocalGraveKeeper"))
				{
					this.str.Append(" is dormant");
				}
				else
				{
					this.str.Append(" is stunned");
				}
				Links.x.gameFeed.AddFeed(this.str.ToString());
				actionTarget.body.lookAtController.EndLook();
				MasterAudio.PlaySound3DAtVector3AndForget("Body Fall", actionTarget.tr.position, 1f, new float?(1f), 0.5f, "", null);
				actionTarget.Stunned(false);
			}
		}
	}

	// Token: 0x06000364 RID: 868 RVA: 0x0004C97C File Offset: 0x0004AB7C
	public void Bounce(Character attacker, string type, float hitTimeAdd)
	{
		if (this.sailing || this.movesOnWater)
		{
			this.isHit = true;
			if (this.actions)
			{
				this.actions.Interrupt();
			}
			float num = 8f;
			float num2 = 15f;
			if (this.party)
			{
				num2 = num;
			}
			this.hitTime = Links.x.gameplay.seconds + num2 + hitTimeAdd;
			this.hitTimeReal = Time.timeSinceLevelLoad;
			this.PlayAnimation("Hit Down", 0f);
			if (Links.x.combat.inPocketAttack)
			{
				this.OverridePocketPause();
				return;
			}
		}
		else
		{
			this.isHit = true;
			if (this.stats.characterRow._Height > 4f)
			{
				this.isHit = true;
				this.hitTime = Links.x.gameplay.seconds + 10f;
				this.hitTimeReal = Time.timeSinceLevelLoad;
				this.PlayAnimation("Hit", 0f);
				return;
			}
			if (type == "Small Hit")
			{
				this.hitTime = Links.x.gameplay.seconds + 5f;
			}
			this.hitTime = Links.x.gameplay.seconds + 15f;
			this.hitTime += hitTimeAdd;
			if (this.sleeping)
			{
				this.WakeUp();
			}
			this.slideNode = null;
			this.slideNodePosition = Vector3.zero;
			if (!this.bouncer)
			{
				GameObject gameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
				gameObject.transform.localScale = Vector3.one * 1f;
				this.bouncer = gameObject.AddComponent<CollisionListener>();
				this.bouncer.rbody = gameObject.AddComponent<Rigidbody>();
				this.bouncer.rbody.mass = 7f;
				gameObject.GetComponent<BoxCollider>().material = Links.x.bounceFriction;
				gameObject.layer = 20;
				if (Records.x.editor)
				{
					gameObject.transform.SetParent(Links.x.cellar.tr);
				}
				gameObject.GetComponent<MeshRenderer>().enabled = false;
			}
			this.bouncer.gameObject.SetActive(true);
			this.bouncer.c = this;
			this.bouncer.StartLisening("Hit");
			if (this.jumping)
			{
				this.jumping = false;
				this.jumpLanding = false;
				this.ClearNodePath();
			}
			this.EndDodge();
			this.bouncer.gameObject.transform.position = this.tr.position + new Vector3(0f, this.characterHeight / 2f, 0f);
			float num3 = 1300f;
			if (type == "Knockback")
			{
				num3 += 3000f;
			}
			this.savedBounceVel = Vector3.zero;
			Vector3 vector = this.currentPosition;
			if (attacker)
			{
				vector = attacker.currentPosition;
			}
			if (vector == this.currentPosition)
			{
				vector.x += Random.Range(-1f, 1f);
				vector.z += Random.Range(-1f, 1f);
			}
			this.bouncer.rbody.AddForce(Quaternion.LookRotation(this.currentPosition - new Vector3(vector.x, this.currentPosition.y, vector.z)) * Vector3.forward * num3, ForceMode.Force);
			float num4 = 6000f;
			if (type == "Knockback")
			{
				num4 += 4000f;
			}
			if (type == "Small Hit")
			{
				num4 = 1000f;
			}
			this.bouncer.rbody.AddForce(Vector3.up * num4, ForceMode.Force);
			this.animator.SetBool("Bounce Over", false);
			this.PlayAnimation("Hit Bounce", 0f);
			this.hitTimeReal = Time.timeSinceLevelLoad;
			if (type == "Knockback")
			{
				this.hitTime += 25f;
				this.hitTimeReal += 0.5f;
			}
			if (attacker && attacker.mainSelected && !Links.x.rallyStage.playing)
			{
				this.OverridePocketPause();
			}
			this.SetPosition(this.bouncer.rbody.transform.position, null);
		}
	}

	// Token: 0x06000365 RID: 869 RVA: 0x0004CDF8 File Offset: 0x0004AFF8
	public bool CheckForCharm(Character target)
	{
		if (this.npc || this.summoned)
		{
			return false;
		}
		string text = target.stats.characterRow._Race;
		if (text == "Forest" || text == "Fish" || text == "Shroom" || text == "Shroomer")
		{
			int num = this.HasRosary();
			if (num > -1)
			{
				if (text == "Shroom")
				{
					text = "Shroomer";
				}
				text = "Charm" + text;
				Library.Abilities abilityRow = Links.x.library.GetAbilityRow(text);
				bool flag = false;
				float num2 = this.stats.Charming(abilityRow._Name, true);
				string text2 = this.stats.CharmingCalculation(abilityRow._Name);
				if (Records.x.showRuleset)
				{
					string[] array = new string[5];
					array[0] = ((this != null) ? this.ToString() : null);
					array[1] = " charming, charming roll: ";
					array[2] = num2.ToString();
					array[3] = ", charm skill ";
					int num3 = 4;
					Library.Abilities abilities = abilityRow;
					array[num3] = ((abilities != null) ? abilities.ToString() : null);
					Debug.Log(string.Concat(array));
				}
				float num4 = target.stats.CharmResistance(false, (float)target.stats.HealthCurrent());
				float num5 = this.stats.SummonModCharm();
				num4 += this.stats.SummonModCharm();
				string text3 = this.stats.CharmResist(num5, (float)target.stats.HealthCurrent());
				if (num2 >= num4)
				{
					flag = true;
				}
				bool flag2 = false;
				if (num2 - 2f >= num4)
				{
					if (Random.Range(0, 5) == 0)
					{
						flag = true;
						flag2 = true;
					}
					else
					{
						flag = false;
					}
				}
				float num6 = num2 - num4;
				if (flag)
				{
					float num7 = target.stats.GetStatOnly("Sensory") / 5f + target.stats.GetStatOnly("Aura") / 3f;
					if (text.Contains("Fish"))
					{
						this.stats.AddSkillProgress(23, num7, null);
					}
					if (text.Contains("Forest"))
					{
						this.stats.AddSkillProgress(24, num7, null);
					}
					if (text.Contains("Shroom"))
					{
						this.stats.AddSkillProgress(25, num7, null);
					}
					if (this.mainSelected)
					{
						Links.x.cellar.GetAnimatedText("PocketDmg", "Charmed", Records.x.IsTextLeft(this, target)).gameObject.transform.position = target.body.HeadPosition(0f) + new Vector3(Random.Range(0f, 0.5f), Random.Range(-0.5f, 0.5f), 0f);
					}
					MasterAudio.PlaySoundAndForget("Feedback", 0.5f, new float?(1f), 0f, "Song Learned", null);
					if (target.downed)
					{
						target.PlayAnimation("GetUp", 0f);
					}
					else
					{
						target.PlayAnimation("Idle", 0f);
					}
					target.downed = true;
					if (target.actions && target.actions.ai.findingAction)
					{
						target.actions.ai.StopLookingForAction();
						target.actions.EndActions();
					}
					Library.Abilities abilities2 = abilityRow;
					Links.x.library.GetEffectRow(abilities2._Name);
					CreatureActions creatureActions = target.creatures;
					Vector3 position = target.tr.position;
					string xmlName = creatureActions.xmlName;
					Quaternion rotation = target.tr.rotation;
					bool flag3 = true;
					if (this.npc)
					{
						flag3 = false;
					}
					Character firstCharacter = Links.x.gaia.CreateCreature(position, rotation, xmlName, flag3, 0f, 1).GetFirstCharacter();
					firstCharacter.TransferLKP(this);
					firstCharacter.SetPosition(position, null);
					target.PlayAnimation("Idle", 0f);
					firstCharacter.SetRotation(rotation, false, false);
					if (this.npc)
					{
						firstCharacter.hostility = 2;
					}
					target.stats.SetHealth(Mathf.RoundToInt((float)target.stats.HealthCurrent() + (float)target.stats.HealthMax() / 2f), false);
					Links.x.combat.AddParty(firstCharacter, false, null, true);
					creatureActions.Charmed(target);
					target.DestroyCharacter();
					num *= 2;
					int num8 = this.bag[num + 1];
					num8--;
					this.bag[num + 1] = num8;
					if (this.party)
					{
						Links.x.inventory.SetBagAmt(num / 2, num8, this);
						this.portrait.skillBag.SetTrinketGrid(false);
					}
					if (this.bag[num + 1] <= 0)
					{
						if (this.party)
						{
							this.bag[num] = 0;
							this.bag[num + 1] = 0;
							Links.x.inventory.RemoveBagItem(num / 2, this);
							this.portrait.skillBag.SetTrinketGrid(false);
						}
						else
						{
							this.bag[num] = 0;
							this.bag[num + 1] = 0;
						}
					}
					if (this.party)
					{
						this.portrait.skillBag.UpdateAmmoNumbers();
					}
					Links.x.gameFeed.AddFeed(this.str.ToString());
					base.StartCoroutine(this.CharmWait(firstCharacter, target, num4, num2, text2, text3, flag2));
					Effects effects = firstCharacter.gameObject.AddComponent<Effects>();
					Links.x.cellar.AddEffects(effects);
					effects.source = this;
					effects.target = firstCharacter;
					effects.targetInteractive = null;
					effects.fromLoad = false;
					effects.effectName = "CharmPotency";
					effects.sourceLevel = 1f + num6 / 2f;
					effects.Inflicted(true);
					this.stats.AddSpirit(15);
					return true;
				}
				if (this.mainSelected)
				{
					Links.x.cellar.GetAnimatedText("NPCDmg", "Failed", Records.x.IsTextLeft(this, target)).gameObject.transform.position = target.body.HeadPosition(0f) + new Vector3(Random.Range(0f, 0.5f), Random.Range(-0.5f, 0.5f), 0f);
				}
				Library.Effects effectRow = Links.x.library.GetEffectRow(abilityRow._Name);
				GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(57);
				if (pooledGameObject)
				{
					pooledGameObject.transform.position = target.body.HeadPosition(0f) + new Vector3(0f, effectRow._FXOffset, 0f);
					pooledGameObject.SetActive(true);
				}
				this.str.Clear();
				if (!this.npc)
				{
					this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
				}
				this.str.Append(this.stats.GetName());
				if (!this.npc)
				{
					this.str.Append("</color>");
				}
				this.str.Append(" failed to bind ");
				if (!target.npc)
				{
					this.str.Append(Links.x.gameFeed.GetPartyColorText(target));
				}
				this.str.Append(target.stats.GetName());
				if (!target.npc)
				{
					this.str.Append("</color>");
				}
				if (Records.x.showRulesetInfo)
				{
					this.str.Append(" <color #857C6C>... ");
					this.str.Append(text2);
					this.str.Append(" vs. ");
					this.str.Append(text3);
					this.str.Append("</color>");
				}
				Links.x.gameFeed.AddFeed(this.str.ToString());
				MasterAudio.PlaySound3DAtVector3AndForget("Skills", this.tr.position, Random.Range(0.4f, 0.6f), new float?(Random.Range(0.7f, 1f)), 0f, "Fail", null);
			}
		}
		return false;
	}

	// Token: 0x06000366 RID: 870 RVA: 0x0004D648 File Offset: 0x0004B848
	private IEnumerator CharmWait(Character summon, Character target, float difficulty, float charmRoll, string charmRollString, string charmDifficulty, bool didRoll)
	{
		if (summon)
		{
			yield return new WaitForEndOfFrame();
			while (summon.turning)
			{
				yield return null;
			}
			summon.Charmed(this);
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(56);
			if (pooledGameObject)
			{
				pooledGameObject.transform.position = summon.body.HeadPosition(0f) + new Vector3(0f, 1f, 0f);
				pooledGameObject.SetActive(true);
			}
			MasterAudio.PlaySound3DAtVector3AndForget("Skills", this.tr.position, 1f, new float?(1f), 0f, "Charm", null);
			this.str.Clear();
			if (!this.npc)
			{
				this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
			}
			this.str.Append(this.stats.GetName());
			if (!this.npc)
			{
				this.str.Append("</color>");
			}
			if (didRoll)
			{
				this.str.Append(" passed roll and bound ");
			}
			else
			{
				this.str.Append(" bound ");
			}
			if (!target.npc)
			{
				this.str.Append(Links.x.gameFeed.GetPartyColorText(target));
			}
			this.str.Append(target.stats.GetName());
			if (!target.npc)
			{
				this.str.Append("</color>");
			}
			if (Records.x.showRulesetInfo)
			{
				this.str.Append(" <color #857C6C>... ");
				this.str.Append(charmRollString);
				this.str.Append(" vs. ");
				this.str.Append(charmDifficulty);
				this.str.Append("</color>");
			}
			Links.x.gameFeed.AddFeed(this.str.ToString());
		}
		if (this.actions)
		{
			this.actions.EndAttackTime(0f);
			this.actions.EndTurn(true);
		}
		yield break;
	}

	// Token: 0x06000367 RID: 871 RVA: 0x0004D698 File Offset: 0x0004B898
	public void SetMoveNode()
	{
		int num = 1;
		if (this.sailing || this.movesOnWater)
		{
			num = 2;
		}
		if (this.boatNavigator)
		{
			if (this.moveNode.AllConnectionsFreeParty(this.boat.nodeStationaryID, this.boat.nodeMovingID, this.boat.ConnectionNumber(), num) == 0)
			{
				this.boat.ClaimNode(this.moveNode, (Vector3)this.moveNode.position, false);
				return;
			}
		}
		else if (this.moveNode.AllConnectionsFreeParty(this.nodeStationaryID, this.nodeMovingID, this.ConnectionNumber(), num) == 0)
		{
			this.ClaimNode(this.moveNode, (Vector3)this.moveNode.position, false);
		}
	}

	// Token: 0x06000368 RID: 872 RVA: 0x0004D750 File Offset: 0x0004B950
	public void TurnEnter(bool ignoreControls)
	{
		if (this.dead || this.stunned)
		{
			return;
		}
		this.startTurnExit = false;
		if (this.nodePath.Count > 0 && !this.dead && this.setupComplete && !this.downed && Links.x.gaia.sceneLoaded)
		{
			this.stepReady = true;
			this.tempStop = false;
			this.moveTurn = false;
			this.SetMoveFollowPosition(this.tr.position);
			if (this.nodePath.Count <= 0)
			{
				this.TargetReached();
				return;
			}
			if (this.moveIndex == -1)
			{
				if (this.nodePath.Count > 0)
				{
					this.ChangeNodes();
				}
				this.moveIndex = 0;
			}
			if (this.nodePath.Count > 1 && this.animID == 23)
			{
				this.animID = 0;
			}
			this.DoFootsteps();
			if (this.moveNode != this.node && !this.jumping)
			{
				bool flag = this.boatNavigator;
			}
			if (this.moveNode != null && !Records.x.paused && !this.turning)
			{
				this.SetMoveNode();
				return;
			}
		}
		else
		{
			this.justMoved = true;
			this.timeSinceLastMove = Time.timeSinceLevelLoad;
			this.moveNode = null;
			this.moving = false;
			this.movePoint = this.vectorZero;
			this.stepReady = false;
			if (this.isHit && this.IsMoveAnim() && this.downed)
			{
				this.PlayAnimation("Hit Down", 0f);
			}
			if (this.resting && (!this.inCombat || this.inCircle) && this.animID != 8 && !this.IsWalking() && !this.moving && this.waitingForPath == 0 && !this.isHit && !this.dead && !this.stunned && !this.stats.pinned && !this.stats.pinning && !this.inAction && !this.inRecovery && !this.inQueuedAbility)
			{
				if (this.inCircle)
				{
					this.PlayAnimation("Fatigued", 0f);
				}
				else
				{
					this.PlayAnimation("Hit Down", 0f);
				}
			}
			if (!this.dead && this.IsMoveAnim() && !this.boatNavigator && !this.stunned)
			{
				this.SetIdle(true);
			}
			this.TargetReached();
			if ((this.missing || (!this.hasActions && this.fleeing)) && this.nodePath.Count == 0 && !this.moving)
			{
				this.fleeing = true;
				this.CheckFleeEnd();
				if (this.fleeing)
				{
					return;
				}
			}
			if (this.swarm)
			{
				if (this.lkBool.Count == 0 && this.canLeave)
				{
					if (!this.actions && !this.hasActions)
					{
						this.Leave(true);
						return;
					}
				}
				else if (!this.canLeave && this.lkPlayer.Count > 0)
				{
					for (int i = 0; i < this.lkPlayer.Count; i++)
					{
						if (!this.canLeave)
						{
							Character component = this.lkPlayer[i].GetComponent<Character>();
							if (component && component.stats.xmlName != this.stats.xmlName)
							{
								this.canLeave = true;
							}
						}
					}
				}
			}
		}
	}

	// Token: 0x06000369 RID: 873 RVA: 0x0004DAC4 File Offset: 0x0004BCC4
	public void RemoveLastNode(bool setNull)
	{
		this.ZeroPreviousNode();
		this.lastNode = null;
		if (this.node != null)
		{
			this.node.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
			this.node.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
		}
		if (setNull)
		{
			this.node = null;
		}
		if (this.party)
		{
			if (this.mainNode2 != null)
			{
				this.mainNode2.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode2.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
			}
			if (this.mainNode3 != null)
			{
				this.mainNode3.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode3.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
			}
			if (this.mainNode4 != null)
			{
				this.mainNode4.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode4.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
			}
			this.mainNode2 = null;
			this.mainNode3 = null;
			this.mainNode4 = null;
		}
	}

	// Token: 0x0600036A RID: 874 RVA: 0x0004DBE8 File Offset: 0x0004BDE8
	public void ClearNodeIDs()
	{
		if (this.node != null)
		{
			this.node.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
			this.node.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
		}
	}

	// Token: 0x0600036B RID: 875 RVA: 0x0004DC22 File Offset: 0x0004BE22
	public bool IsMoveAnim()
	{
		return this.animID == 1;
	}

	// Token: 0x0600036C RID: 876 RVA: 0x0004DC30 File Offset: 0x0004BE30
	public void ChangeNodes()
	{
		if (this.dead || this.stunned || !this.moveFollow)
		{
			return;
		}
		if (!this.tr)
		{
			return;
		}
		if (this.nodeActions.Count == 0 || !Links.x.gaia.sceneLoaded)
		{
			return;
		}
		if (!this.boatNavigator)
		{
			this.prevNodePosition = this.tr.position;
			this.prevNode = this.node;
		}
		else
		{
			this.prevNodePosition = this.boat.tr.position;
			this.prevNode = this.boat.node;
		}
		this.prevFollowPosition = this.moveFollow.position;
		this.moveNode = null;
		this.movePoint = this.vectorZero;
		this.moveCount = 1;
		this.moveTurns = 1f;
		this.moveTurnSpeed = 1f;
		bool flag = false;
		for (int i = 1; i < this.nodeActions.Count; i++)
		{
			if (!flag)
			{
				if (this.nodeActions[i].Contains("Switch"))
				{
					flag = true;
				}
				else
				{
					this.moveTurns += 1f;
				}
			}
		}
		this.moveTurnSpeed = this.moveTurns;
		if (!this.npc && this.raycastModifier && this.raycastModifier.enabled)
		{
			this.setArea = (int)this.node.Area;
			GraphNode graphNode = this.NearNode(this.vectorPath[0], false, 0, -1, 0);
			if (graphNode != null)
			{
				if (graphNode.Area != this.node.Area)
				{
					this.nodePath[0] = graphNode;
				}
				Vector3 vector = (Vector3)graphNode.position;
				if (Mathf.Abs(vector.y - this.vectorPath[0].y) > 1.5f)
				{
					this.vectorPath[0] = new Vector3(this.vectorPath[0].x, vector.y, this.vectorPath[0].z);
				}
			}
		}
		this.nextNode = this.nodePath[0];
		this.moveNode = this.nextNode;
		this.movePoint = this.vectorPath[0];
		this.totalDist = Vector3.Distance(this.prevNodePosition, this.movePoint);
		this.totalDistNodes = Vector3.Distance(this.moveFollow.position, this.movePoint);
		if (this.node != null)
		{
			Vector3 vector2 = (Vector3)this.node.position;
			Vector3 vector3 = (Vector3)this.moveNode.position;
			vector2.y = vector3.y;
			Vector3.Distance(vector2, vector3);
		}
		this.jumping = false;
		this.jumpLanding = false;
		Vector3 vector4 = (Vector3)this.nextNode.position;
		Vector3 vector5 = this.prevNodePosition;
		bool flag2 = true;
		if (this.node != null && this.moveNode != null && !this.boatNavigator && (((this.node.environment == 0 || this.node.environment == 1) && this.moveNode.environment == 2) || (this.node.environment == 2 && (this.moveNode.environment == 0 || this.moveNode.environment == 1))))
		{
			flag2 = false;
		}
		bool flag3 = false;
		if (this.hasActions && !this.ambushing && this.actions && this.actions.ai.jumping && !this.charging)
		{
			flag3 = true;
		}
		bool flag4 = false;
		if (!flag2 || (this.totalDist > 4f && Records.x.pocketPause && this.party && flag4) || this.evading || this.isHitFlying || this.charging || this.ambushing || flag3 || this.alwaysJump)
		{
			this.jumping = true;
			this.alwaysJump = false;
			this.jumpLanding = false;
			this.jumpTime = Links.x.gameplay.seconds;
			this.currentArcIndex = 0;
			int num = 0;
			if (flag3 && !this.charging && !this.evading)
			{
				if (this.stats.xmlName.Contains("Bakka"))
				{
					num = 15;
				}
				else if (this.stats.xmlName.Contains("Jump"))
				{
					num = 20;
				}
			}
			if (this.isHitFlying)
			{
				num = 5;
			}
			if (this.charging)
			{
				this.chargeTime = Links.x.gameplay.seconds;
				if (this.mainSelected)
				{
					this.setArea = (int)this.node.Area;
					GraphNode graphNode2 = this.NearNode(this.movePoint, false, 0, -1, 0);
					if (graphNode2 == null && this.actions)
					{
						graphNode2 = this.actions.ai.chargeTarget.node;
					}
					if (graphNode2 != null && graphNode2.Area != this.node.Area && this.actions)
					{
						graphNode2 = this.actions.ai.chargeTarget.node;
					}
					if (graphNode2 != null)
					{
						if (((Vector3)graphNode2.position - this.movePoint).sqrMagnitude < 2.25f)
						{
							if (!Physics.Raycast(this.movePoint + new Vector3(0f, 5f, 0f), Vector3.up * -1f, 10f, 1) || Physics.Linecast(this.torsoPosition, this.movePoint + new Vector3(0f, 3f, 0f), 99072))
							{
								this.movePoint = (Vector3)graphNode2.position;
							}
						}
						else
						{
							this.movePoint = (Vector3)graphNode2.position;
						}
					}
				}
			}
			else
			{
				if (this.sailing)
				{
					this.DrawArc(this.movePoint, num);
				}
				else
				{
					this.DrawArc(this.movePoint, num);
					if (!this.InAttack() && !this.downed)
					{
						this.PlayAnimation("JumpStart", 0f);
					}
				}
				if (this.isHitFlying && this.arcPoints.Count >= 4)
				{
					this.currentArcIndex = 3;
				}
				if (this.evading && this.arcPoints.Count >= 2)
				{
					this.currentArcIndex = 1;
				}
			}
			if (!this.evading && !this.isHitFlying)
			{
				this.SetRotation(Quaternion.LookRotation(this.movePoint - this.tr.position), false, false);
			}
			else if (this.evading)
			{
				this.look = Quaternion.LookRotation(this.tr.position - this.movePoint);
				this.SetRotation(this.look, false, false);
			}
			else
			{
				bool flag5 = this.isHitFlying;
			}
		}
		if (this.moveNode != null && !this.moveNode.Walkable)
		{
			this.TargetReached();
			return;
		}
		if (false && this.nodePath.Count > 1)
		{
			this.moveCount = 2;
			this.moveTurns = 1f;
			this.moveTurnSpeed = 1f;
			this.moveNode = this.nodePath[1];
			this.movePoint = this.vectorPath[1];
			this.nextNode = this.moveNode;
		}
		this.turningComplete = false;
		this.moveFollowTime = 0f;
		this.moveAnimID = 1;
		if (this.boatNavigator && this.boat)
		{
			this.boat.NewPoint(this.movePoint, this.savedPathTarget);
		}
		if (this.nextNode != null && this.node != null)
		{
			bool flag6 = false;
			if (this.nextNode.HasLinkNode() && this.node.HasLinkNode() && !this.mainSelected)
			{
				flag6 = true;
			}
			if (this.nextNode.Area != this.node.Area || (this.totalDist > 50f && !this.jumping) || flag6)
			{
				bool flag7 = this.AllTilesFree(this.nextNode, false);
				if (!flag7 && this.collisionCharacter)
				{
					if (Records.x.editor)
					{
						Character character = this.collisionCharacter;
						Debug.Log(((character != null) ? character.ToString() : null) + " blocking " + ((this != null) ? this.ToString() : null) + " day night move");
					}
					if (this.collisionCharacter.visible == 0)
					{
						flag7 = true;
					}
					if (this.collisionCharacter.dayNightVanishing)
					{
						flag7 = true;
					}
				}
				if (!flag7 && (this.ghostVanishing || this.ambushing))
				{
					flag7 = true;
				}
				if (!flag7 && this.dayNightVanishing && this.collisionCharacter && this.collisionCharacter.npc && this.collisionCharacter.dayNightVanishing)
				{
					flag7 = true;
				}
				if (flag7)
				{
					this.body.SetGrounderState(false);
					this.SetPosition((Vector3)this.nextNode.position, this.jumpAreasNode);
					this.moveFollow.position = (Vector3)this.nextNode.position;
					this.tempStop = true;
					if (this.nextNode.GraphIndex == 0U)
					{
						this.indoorID = "";
						this.desiredGraph = 0;
					}
					else
					{
						this.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName((Vector3)this.nextNode.position);
						this.desiredGraph = 1;
					}
					Links.x.sensory.UpdateCharactersIntExt(true);
					this.jumpedAreas = false;
					this.jumpingAreasRotation = this.smoothRot;
					this.jumpingAreas = true;
					this.meshAlwaysOff = false;
					this.body.SetMeshState(false, true);
					this.jumpingAreasTime = Time.timeSinceLevelLoad;
					this.jumpAreasNode = this.nextNode;
				}
				else
				{
					this.TargetReached();
				}
			}
		}
		if (this.NodesCount() > 0 && this.movePoint != this.tr.position && !this.boatNavigator)
		{
			if (!this.evading && !this.isHitFlying)
			{
				this.GetLook(true);
			}
			if ((!this.body.sameNode || !this.usingKeys) && (this.AllTilesFree(this.moveNode, false) || this.jumping || this.charging))
			{
				this.SetRotation(this.look, false, false);
			}
		}
	}

	// Token: 0x0600036D RID: 877 RVA: 0x0004E6B4 File Offset: 0x0004C8B4
	public void GetLook(bool always)
	{
		if (this.tr.position == this.movePoint)
		{
			return;
		}
		if (this.moveBackTarget)
		{
			if (this.rotateToSlope)
			{
				this.look = Quaternion.LookRotation(this.tr.position - new Vector3(this.movePoint.x, this.movePoint.y, this.movePoint.z));
				return;
			}
			this.look = Quaternion.LookRotation(this.tr.position - new Vector3(this.movePoint.x, this.tr.position.y, this.movePoint.z));
			return;
		}
		else
		{
			if (this.rotateToSlope)
			{
				this.look = Quaternion.LookRotation(new Vector3(this.movePoint.x, this.movePoint.y, this.movePoint.z) - this.tr.position);
				return;
			}
			this.look = Quaternion.LookRotation(new Vector3(this.movePoint.x, this.tr.position.y, this.movePoint.z) - this.tr.position);
			return;
		}
	}

	// Token: 0x0600036E RID: 878 RVA: 0x0004E80C File Offset: 0x0004CA0C
	public void TurnExit()
	{
		if (this.dead || this.stunned || !Links.x.gaia.sceneLoaded)
		{
			return;
		}
		bool flag = false;
		this.turningComplete = false;
		if (this.charging)
		{
			this.jumping = false;
			this.charging = false;
		}
		if (this.isHitFlying)
		{
			this.isHitFlying = false;
		}
		if (this.stats.Stuck() > 0 && !this.boatNavigator)
		{
			this.sphere.transform.position = this.tr.position;
			this.TargetReached();
			return;
		}
		if (this.hasActions && (this.followingType == "" || this.followingType.Contains("Attack")))
		{
			bool flag2 = true;
			if (this.sailing && this.boatNavigator && this.boat.turning)
			{
				flag2 = false;
			}
			if (this.fleeing)
			{
				flag2 = false;
			}
			if (flag2 && this.attackTime >= 1f && !this.mainSelected)
			{
				bool flag3 = this.actions.CheckIfMoveComplete();
				if (this.actions && flag3 && !this.actions.castingSpell && !this.actions.cannotInterrupt)
				{
					return;
				}
			}
		}
		bool flag4 = this.CheckEarlyIfInRange();
		if (this.stepReady && !this.dead && !this.stunned && !this.moveTurn && this.setupComplete && !this.downed && this.nodePath.Count > 0 && !flag4)
		{
			this.stepReady = false;
			if (this.usingKeys && this.CheckControls() && this.nodeActions.Count == 1 && this.mainSelected)
			{
				flag = Links.x.fellowship.MakeDirectionalWaypoint(true);
				if (!flag)
				{
					this.SetIdle(true);
				}
			}
			if (!this.moveTurn && !flag)
			{
				this.GetNextNode();
			}
			if (this.nodePath.Count < 1 && this.waypoint)
			{
				this.waypoint.transform.position = Links.x.gameplay.farPosition;
			}
			if (this.nodePath.Count > 0 && !this.boatNavigator)
			{
				Links.x.gameplay.CheckTileEffects(this, this.node, false);
			}
		}
		else
		{
			this.stepReady = false;
		}
		if (this.nodeActions.Count == 0)
		{
			this.justMoved = true;
			this.timeSinceLastMove = Time.timeSinceLevelLoad;
			this.moveNode = null;
			this.movePoint = this.vectorZero;
			this.moving = false;
		}
		if (this.nodeActions.Count <= 1 && !this.npc && !this.inCombat && !this.inCircle && !this.hasActions && !this.mainSelected && !Links.x.combat.inPocketAttack && this.waitingForPath == 0 && Links.x.main)
		{
			if (Links.x.main.physicsMove)
			{
				Links.x.fellowship.GetNewPath(this, Links.x.main.node);
			}
			else if ((Links.x.main.currentPosition - this.currentPosition).sqrMagnitude < 36f)
			{
				this.TargetReached();
				return;
			}
		}
		if (flag4 && !this.jumpingAreas)
		{
			this.TargetReached();
			return;
		}
		if (this.nodeActions.Count > 0 && !flag && !this.jumpingAreas)
		{
			this.TurnEnter(false);
		}
	}

	// Token: 0x0600036F RID: 879 RVA: 0x0004EBB3 File Offset: 0x0004CDB3
	public int GetNodeCount()
	{
		return this.nodePath.Count;
	}

	// Token: 0x06000370 RID: 880 RVA: 0x0004EBC0 File Offset: 0x0004CDC0
	public void GetNextNode()
	{
		if (this.nodeActions.Count == 1)
		{
			if (this.nodePath.Count > 0)
			{
				for (int i = 0; i < this.moveCount; i++)
				{
					if (this.nodePath.Count > 0)
					{
						this.nodePath.RemoveAt(0);
						this.vectorPath.RemoveAt(0);
					}
				}
			}
			this.nodeActions.Clear();
			this.TargetReached();
			return;
		}
		if (this.nodeActions.Count > 1)
		{
			if (this.nodeActions.Count > this.moveCount)
			{
				for (int j = 0; j < this.moveCount; j++)
				{
					this.nodeActions.RemoveAt(0);
				}
			}
			if (this.nodePath.Count > 0 && ((this.nodeActions[0].Contains("TileSwitch") && this.moveTurns == 1f) || (this.nodeActions[0].Contains("TileSwitch") && this.moveTurns == 2f)))
			{
				for (int k = 0; k < this.moveCount; k++)
				{
					if (this.nodePath.Count > 0)
					{
						this.nodePath.RemoveAt(0);
						this.vectorPath.RemoveAt(0);
					}
				}
				this.prevNodePosition = this.tr.position;
				if (this.nodePath.Count > 0)
				{
					this.ChangeNodes();
					return;
				}
				if (this.nodeActions.Count == 0)
				{
					this.TargetReached();
					return;
				}
			}
		}
		else
		{
			this.TargetReached();
		}
	}

	// Token: 0x06000371 RID: 881 RVA: 0x0004ED48 File Offset: 0x0004CF48
	public int NodesCount()
	{
		return this.nodePath.Count;
	}

	// Token: 0x06000372 RID: 882 RVA: 0x0004ED55 File Offset: 0x0004CF55
	public GraphNode LastNode()
	{
		return this.nodePath[this.nodePath.Count - 1];
	}

	// Token: 0x06000373 RID: 883 RVA: 0x0004ED70 File Offset: 0x0004CF70
	public void Collide(Character collidedCharacter, bool hit)
	{
		if (collidedCharacter && this.mainSelected)
		{
			bool flag = true;
			if (collidedCharacter.hasActions)
			{
				flag = false;
			}
			bool flag2 = collidedCharacter.npc;
			if (collidedCharacter.physicsMove)
			{
				flag = false;
			}
			if (collidedCharacter.npc && (collidedCharacter.attackingUntilBribe || collidedCharacter.hostility >= 2))
			{
				flag = false;
			}
			if (Time.timeSinceLevelLoad < collidedCharacter.movingOutOfWayTime + 2f)
			{
				flag = false;
			}
			if (collidedCharacter.stats.Stuck() > 0 || collidedCharacter.jumping)
			{
				flag = false;
			}
			if (collidedCharacter.turning || collidedCharacter.sleeping || collidedCharacter.resting || collidedCharacter.inQueuedAbility)
			{
				flag = false;
			}
			if (collidedCharacter.node == null)
			{
				flag = false;
			}
			if (collidedCharacter.party && Records.x.partyWait && flag)
			{
				flag = false;
				if ((collidedCharacter.tr.position - this.tr.position).sqrMagnitude < 0.25f)
				{
					flag = true;
				}
			}
			if (Links.x.main.body.sneaking)
			{
				flag = false;
			}
			if (flag)
			{
				if (collidedCharacter.party && !this.mainSelected)
				{
					collidedCharacter.lookTarget = Links.x.main;
				}
				Vector3 vector = this.tr.right;
				if (!this.npc && Links.x.GetPartyID(this) % 2 == 0)
				{
					vector *= -1f;
				}
				Vector3 vector2 = collidedCharacter.tr.position + this.tr.forward * 5f + vector * 2f;
				if (hit)
				{
					vector2 = collidedCharacter.tr.position + Quaternion.LookRotation(collidedCharacter.tr.position - Links.x.main.tr.position) * Vector3.forward * 3f;
				}
				collidedCharacter.nodeConstraint.walkable = true;
				collidedCharacter.nodeConstraint.constrainWalkability = true;
				collidedCharacter.nodeConstraint.constrainTags = true;
				if (collidedCharacter.inCircle && this.party)
				{
					collidedCharacter.nodeConstraint.checkCircleID = collidedCharacter.CheckCircleID();
				}
				else
				{
					collidedCharacter.nodeConstraint.checkCircleID = 0;
				}
				collidedCharacter.nodeConstraint.passID = collidedCharacter.nodeStationaryID;
				collidedCharacter.nodeConstraint.passID2 = collidedCharacter.nodeMovingID;
				collidedCharacter.nodeConstraint.checkConnections = collidedCharacter.ConnectionNumber();
				collidedCharacter.nodeConstraint.constrainToArea = (int)collidedCharacter.node.Area;
				int num = 2;
				int num2 = collidedCharacter.CheckCircleID();
				if (collidedCharacter.inCircle && collidedCharacter.hasCircleBuff)
				{
					num = 1;
					num2 = 2;
				}
				GraphNode graphNode = collidedCharacter.GetSlideNode(vector2, collidedCharacter.node, true, num2, num);
				if (graphNode != null)
				{
					collidedCharacter.lookTarget = Links.x.main;
					collidedCharacter.movingOutOfWayTime = Time.timeSinceLevelLoad;
					collidedCharacter.movingOutOfWay = true;
					if (collidedCharacter.turning)
					{
						collidedCharacter.EndTurning(false);
					}
					int num3 = 4;
					if (collidedCharacter.inCircle)
					{
						num3 = 2;
					}
					if (collidedCharacter.party && Records.x.friends)
					{
						num3 = 1;
					}
					if (collidedCharacter.hasCircleBuff)
					{
						collidedCharacter.MakePath(graphNode, 1, false, false, true);
						return;
					}
					collidedCharacter.MakePath(Links.x.main.node, num3, false, true, true);
				}
			}
		}
	}

	// Token: 0x06000374 RID: 884 RVA: 0x0004F0BC File Offset: 0x0004D2BC
	public GraphNode GetSlideNode(Vector3 direction, GraphNode n, bool constrainTags, int circleID, int constrainPenalty)
	{
		this.nodeConstraint.constrainToArea = (int)n.Area;
		this.nodeConstraint.walkable = true;
		this.nodeConstraint.constrainWalkability = true;
		this.nodeConstraint.constrainTags = constrainTags;
		if (constrainTags)
		{
			this.nodeConstraint.passID = this.nodeStationaryID;
			this.nodeConstraint.passID2 = this.nodeMovingID;
			this.nodeConstraint.checkCircleID = circleID;
		}
		else
		{
			this.nodeConstraint.passID = 0;
			this.nodeConstraint.passID2 = 0;
			this.nodeConstraint.checkCircleID = 0;
		}
		if (this.npc)
		{
			this.nodeConstraint.constrainPenalty = 0;
		}
		else
		{
			this.nodeConstraint.constrainPenalty = constrainPenalty;
		}
		this.nodeConstraint.checkConnections = this.ConnectionNumber();
		if (!constrainTags)
		{
			this.nodeConstraint.checkConnections = 0;
		}
		if (this.ghost)
		{
			this.nodeConstraint.constrainToEnvironment = 0;
		}
		if (this.movesOnWater)
		{
			this.nodeConstraint.constrainToEnvironment = 2;
		}
		float num = 49f;
		if (this.hasCircleBuff)
		{
			num = 100f;
		}
		return n.ClosestConnection(n, this.nodeStationaryID, this.nodeMovingID, num, direction, (int)this.radius, this.ConnectionNumber(), this.nodeConstraint, 0);
	}

	// Token: 0x06000375 RID: 885 RVA: 0x0004F200 File Offset: 0x0004D400
	public GraphNode FindSlideNode(Character movingCharacter, Vector3 fromPoint, bool self, bool straightBack)
	{
		Quaternion quaternion = this.tr.rotation;
		if (movingCharacter.tr.position != this.tr.position && !self)
		{
			quaternion = Quaternion.LookRotation(movingCharacter.tr.position - this.tr.position);
		}
		else
		{
			quaternion = Quaternion.LookRotation(fromPoint - this.tr.position);
		}
		float num = 1f;
		Vector3 position = movingCharacter.tr.position;
		if (straightBack)
		{
			num = -0.5f;
		}
		Vector3 vector = position + quaternion * Vector3.forward * num;
		if (!movingCharacter.stunned && !straightBack)
		{
			if (Random.Range(0, 2) == 0)
			{
				vector += quaternion * Vector3.right * 1.5f;
			}
			else
			{
				vector += quaternion * Vector3.right * -1.5f;
			}
		}
		this.nodeConstraint.constrainToArea = (int)movingCharacter.node.Area;
		this.nodeConstraint.walkable = true;
		this.nodeConstraint.constrainWalkability = true;
		this.nodeConstraint.constrainTags = true;
		this.nodeConstraint.checkCircleID = 0;
		this.nodeConstraint.passID = movingCharacter.nodeStationaryID;
		this.nodeConstraint.passID2 = movingCharacter.nodeMovingID;
		if (this.npc)
		{
			this.nodeConstraint.constrainPenalty = 0;
		}
		else
		{
			this.nodeConstraint.constrainPenalty = 2;
		}
		this.nodeConstraint.checkConnections = movingCharacter.ConnectionNumber();
		if (this.movesOnWater)
		{
			this.nodeConstraint.constrainToEnvironment = 2;
		}
		GraphNode graphNode = movingCharacter.node.ClosestConnection(movingCharacter.node, movingCharacter.nodeStationaryID, movingCharacter.nodeMovingID, 25f, vector, (int)this.radius, movingCharacter.ConnectionNumber(), this.nodeConstraint, 0);
		GraphNode graphNode2 = graphNode;
		if (graphNode != null)
		{
			GraphNode graphNode3 = graphNode.ClosestConnection(graphNode, movingCharacter.nodeStationaryID, movingCharacter.nodeMovingID, 25f, vector, (int)this.radius, movingCharacter.ConnectionNumber(), this.nodeConstraint, 0);
			if (graphNode3 != null)
			{
				graphNode2 = graphNode3;
			}
		}
		return graphNode2;
	}

	// Token: 0x06000376 RID: 886 RVA: 0x0004F424 File Offset: 0x0004D624
	public bool NodeBlocked(GraphNode blockedNode, GameObject blockedObj)
	{
		if (!Links.x.gaia.sceneLoaded)
		{
			this.SetAnimatorSpeed(1f);
			return true;
		}
		if (this.jumping)
		{
			return false;
		}
		this.tempStop = true;
		this.stepReady = false;
		this.moveTurn = false;
		if (Records.x.astarDebugging && this.blockedTime == 0f)
		{
			string[] array = new string[13];
			array[0] = ((this != null) ? this.ToString() : null);
			array[1] = " NODE BLOCKED ";
			int num = 2;
			Character character = this.collisionCharacter;
			array[num] = ((character != null) ? character.ToString() : null);
			array[3] = " ";
			array[4] = this.node.ID.ToString();
			array[5] = " ";
			array[6] = this.pushCount.ToString();
			array[7] = " ";
			array[8] = this.blockedTime.ToString();
			array[9] = " ";
			int num2 = 10;
			GraphNode graphNode = this.targetNode;
			array[num2] = ((graphNode != null) ? graphNode.ToString() : null);
			array[11] = " ";
			array[12] = this.pushCount.ToString();
			Debug.Log(string.Concat(array));
		}
		if ((this.isBoro || this.party) && this.ignoreRemoveControls && Records.x.removeControls && this.jumping)
		{
			this.tempStop = false;
			this.stepReady = true;
			this.blockedTime = 0f;
			this.SetAnimatorSpeed(1f);
			return true;
		}
		if (this.ghostVanishing || this.ambushing)
		{
			this.tempStop = false;
			this.stepReady = true;
			this.blockedTime = 0f;
			this.SetAnimatorSpeed(1f);
			return true;
		}
		if (this.inCircle && this.npc && this.collisionCharacter && this.collisionCharacter.group == this.group)
		{
			this.tempStop = false;
			this.stepReady = true;
			this.blockedTime = 0f;
			this.SetAnimatorSpeed(1f);
			return true;
		}
		bool flag = true;
		if (flag && this.pushCount >= Links.x.fellowship.pushCountMax)
		{
			flag = false;
		}
		if (this.isBoro)
		{
			flag = true;
		}
		if (this.party && !this.mainSelected && this.collisionCharacter && !this.collisionCharacter.npc)
		{
			flag = false;
		}
		if (this.boatNavigator || this.inCombat || this.hasActions)
		{
			flag = false;
		}
		if (flag && !this.sailing && this.collisionCharacter)
		{
			if (this.collisionCharacter.movingOutOfWay && (this.ignoreRemoveControls || this.isBoro || this.mainSelected))
			{
				this.tempStop = false;
				this.stepReady = true;
				this.blockedTime = 0f;
				this.SetAnimatorSpeed(1f);
				return true;
			}
			flag = true;
			if (this.collisionCharacter.mainSelected)
			{
				flag = false;
			}
			if (this.collisionCharacter.node == null)
			{
				flag = false;
			}
			if (this.collisionCharacter.resting || this.collisionCharacter.stunned || this.collisionCharacter.sleeping || this.collisionCharacter.downed)
			{
				flag = false;
			}
			if ((this.collisionCharacter.moving || this.collisionCharacter.NodesCount() > 0) && !this.mainSelected)
			{
				flag = false;
			}
			if (this.collisionCharacter.hasActions && this.collisionCharacter.npc)
			{
				flag = false;
			}
			if (this.isBoro && this.collisionCharacter.party)
			{
				flag = true;
			}
			if (this.collisionCharacter.isBoro)
			{
				flag = true;
			}
			if (this.collisionCharacter.sailing)
			{
				flag = false;
			}
			if (Records.x.astarDebugging)
			{
				string[] array2 = new string[9];
				array2[0] = flag.ToString();
				array2[1] = " ";
				int num3 = 2;
				Character character2 = this.collisionCharacter;
				array2[num3] = ((character2 != null) ? character2.ToString() : null);
				array2[3] = " ";
				array2[4] = this.collisionCharacter.waitingForPath.ToString();
				array2[5] = " ";
				int num4 = 6;
				GraphNode graphNode2 = this.collisionCharacter.node;
				array2[num4] = ((graphNode2 != null) ? graphNode2.ToString() : null);
				array2[7] = " ";
				array2[8] = this.collisionCharacter.NodesCount().ToString();
				Debug.Log(string.Concat(array2));
			}
			if (flag)
			{
				if (Records.x.astarDebugging)
				{
					string text = "pushing ";
					Character character3 = this.collisionCharacter;
					Debug.Log(text + ((character3 != null) ? character3.ToString() : null));
				}
				GraphNode graphNode3 = this.FindSlideNode(this.collisionCharacter, this.movePoint, false, false);
				if (graphNode3 != null && graphNode3 != this.collisionCharacter.node && this.collisionCharacter.stats.Stuck() == 0 && ((Vector3)graphNode3.position - this.collisionCharacter.tr.position).sqrMagnitude < 16f && PathUtilities.IsPathPossible(graphNode3, this.collisionCharacter.node))
				{
					if (this.canPush && !this.stats.animal)
					{
						this.pushCount = 0;
					}
					this.tempStop = false;
					if (Records.x.astarDebugging && this.blockedTime == 0f)
					{
						string text2 = ((this != null) ? this.ToString() : null);
						string text3 = " shoving ";
						Character character4 = this.collisionCharacter;
						Debug.Log(text2 + text3 + ((character4 != null) ? character4.ToString() : null));
					}
					if (this.collisionCharacter.returnToPointTime == 0f && this.collisionCharacter.npc)
					{
						this.collisionCharacter.returnToPoint = this.collisionCharacter.node;
					}
					this.collisionCharacter.returnToPointTime = Time.timeSinceLevelLoad;
					this.collisionCharacter.Slide(graphNode3, false);
					this.waitingForNewPath = false;
					this.collisionCharacter.body.lookAtController.SetNewTarget(this.body.headBone, 0f, 0f, false);
					this.blockedTime = 0f;
					this.stepReady = true;
					if (this.collisionCharacter.body.sneaking)
					{
						this.collisionCharacter.EndSneak(true, false);
					}
					if (this.npc && !this.stats.animal && !this.ghost && !this.ghost && !this.summoned && this.collisionCharacter.party && Time.timeSinceLevelLoad > this.lastExcuseTime + 5f)
					{
						this.StartQuip("Excuse me");
						this.lastExcuseTime = Time.timeSinceLevelLoad;
					}
					this.SetAnimatorSpeed(1f);
					return false;
				}
			}
			this.pushCount++;
			this.collisionCharacter = null;
		}
		if (this.blockedTime == 0f)
		{
			if (this.npc || this.summoned)
			{
				this.blockedTime = Time.timeSinceLevelLoad + Random.Range(0.1f, 0.4f);
			}
			else
			{
				int num5 = Links.x.fellowship.CharacterIndex(this);
				this.blockedTime = Time.timeSinceLevelLoad + ((float)num5 * 0.05f + 0.05f);
				if (this.mainSelected || Links.x.fellowship.OnlyOneMoving(this))
				{
					this.blockedTime = Time.timeSinceLevelLoad;
				}
			}
			this.waitingForNewPath = true;
			this.waitingForNewPathTime = Time.timeSinceLevelLoad;
		}
		if (!this.stats.flying)
		{
			this.SetAnimatorSpeed(0.0001f);
		}
		bool flag2 = false;
		if (this.inFriendGroup && !this.isFriendGroupLeader && !this.friendLeader.moving && !this.friendLeader.physicsMove && this.collisionCharacter == this.friendLeader)
		{
			flag2 = true;
			this.TargetReached();
		}
		if (this.blockedTime != 0f && Time.timeSinceLevelLoad > this.blockedTime && !flag2)
		{
			this.nodePath.Clear();
			this.nodeActions.Clear();
			this.vectorPath.Clear();
			this.justMoved = true;
			this.timeSinceLastMove = Time.timeSinceLevelLoad;
			this.moving = false;
			this.moveNode = null;
			this.movePoint = this.vectorZero;
			this.waitingForNewPath = true;
			this.waitingForNewPathTime = Time.timeSinceLevelLoad;
			this.tempStop = false;
			this.blockedTime = 0f;
			this.blockPathCount++;
			if (this.blockPathCount > 2)
			{
				this.SetAnimatorSpeed(1f);
				this.PlayIdle();
				this.blockPathCount = 0;
			}
			if (this.targetNode != null && !this.hasActions && this.npc)
			{
				this.nodeConstraint.walkable = true;
				this.nodeConstraint.constrainWalkability = true;
				this.nodeConstraint.constrainTags = true;
				this.nodeConstraint.checkCircleID = this.CheckCircleID();
				if (!this.npc && this.targetNode.circle == 1)
				{
					this.nodeConstraint.checkCircleID = 1;
				}
				if (!this.boatNavigator)
				{
					this.nodeConstraint.passID = this.nodeStationaryID;
					this.nodeConstraint.passID2 = this.nodeMovingID;
					this.nodeConstraint.checkConnections = this.ConnectionNumber();
				}
				else
				{
					this.nodeConstraint.passID = this.boat.nodeStationaryID;
					this.nodeConstraint.passID2 = this.boat.nodeMovingID;
					this.nodeConstraint.checkConnections = this.boat.ConnectionNumber();
				}
				this.nodeConstraint.constrainToArea = -1;
				if (!this.nodeConstraint.Suitable(this.targetNode))
				{
					int id = this.targetNode.ID;
					if (Records.x.astarDebugging)
					{
						Debug.Log(((this != null) ? this.ToString() : null) + " repath node id is " + id.ToString());
					}
					bool flag3 = false;
					if (!this.npc)
					{
						int count = this.gos.Count;
						for (int i = 0; i < count; i++)
						{
							Character character5 = this.gos[i];
							if (character5.nodeStationaryID == id)
							{
								break;
							}
							if (character5.nodeMovingID == id)
							{
								flag3 = true;
								break;
							}
						}
					}
					if (!flag3)
					{
						if (this.boatNavigator)
						{
							this.targetNode = this.boat.NearNode((Vector3)this.targetNode.position, true, 0, -1);
						}
						else
						{
							this.targetNode = this.NearNode((Vector3)this.targetNode.position, true, 0, -1, this.CheckCircleID());
							if (Records.x.astarDebugging)
							{
								Debug.Log(((this != null) ? this.ToString() : null) + " had to repath but node was not longer available");
							}
						}
					}
				}
				if (this.inCombat && this.hasActions)
				{
					this.actions.targetMovePosition = this.targetNode;
				}
				if (this.party || (this.boatNavigator && this.sailing && this.isBoro))
				{
					this.showWaypoint = true;
				}
				if (this.party)
				{
					this.pushCount = Links.x.fellowship.pushCountMax + 1;
				}
				this.MakePath(this.targetNode, 200, false, false, this.party);
			}
			else
			{
				this.TargetReached();
			}
		}
		return false;
	}

	// Token: 0x06000377 RID: 887 RVA: 0x0004FF50 File Offset: 0x0004E150
	public bool IsWalking()
	{
		int currentHash = this.body.currentHash;
		return currentHash == this.body.walkHash || currentHash == this.body.walkStartHash || currentHash == this.body.combatWalkHash || currentHash == this.body.walkPartyHash || currentHash == this.body.combatWalkStartHash || currentHash == this.body.walkEndHash || currentHash == this.body.combatWalkEndHash || currentHash == this.body.creepStartHash || currentHash == this.body.creepEndHash || currentHash == this.body.creepHash || currentHash == this.body.walkBackHash || currentHash == this.body.walkBackStartHash || currentHash == this.body.walkBackEndHash;
	}

	// Token: 0x06000378 RID: 888 RVA: 0x0005002C File Offset: 0x0004E22C
	public void SetAnimatorSpeed(float speed)
	{
		if (this.body.animationHold)
		{
			return;
		}
		if (this.pocketPaused && !this.pocketPausedOverride && Records.x.pocketPause && (!Links.x.combat.inPocketAttack || !this.party || !Links.x.pocketWheel.rallyWheelOpen))
		{
			return;
		}
		if (this.turning)
		{
			if (this.party)
			{
				speed = 1.5f;
				if (this.hasActions)
				{
					speed *= 1.25f;
				}
			}
			else if (!this.dodging && (this.moving || this.movingOutOfWay))
			{
				speed = 1.4f;
			}
			else
			{
				if (this.patrolSpeed == 0f)
				{
					this.patrolSpeed = 1f;
				}
				if (this.hasActions)
				{
					if (this.moving)
					{
						this.patrolSpeed = 0.75f;
					}
					else
					{
						this.patrolSpeed = 0.75f;
					}
				}
				speed = this.patrolSpeed;
			}
		}
		else
		{
			bool @bool = this.animator.GetBool("Idle");
			if ((this.animID == 1 || (!@bool && this.IsWalking())) && !Links.x.combat.combatCinematics && !this.tempStop && !this.blocked && !this.turning && !this.isHit && speed > 0.1f)
			{
				float num;
				if (!this.party && !this.isBoro)
				{
					if (this.npc && !this.stats.animal && !this.hasActions && !Records.x.banquetIsle && !this.vipFollow)
					{
						num = this.stats.MoveSpeed(false) * 0.75f;
					}
					else
					{
						num = this.stats.MoveSpeed(false);
					}
					if (this.inCircle && this.group && (this.group.inFormationMovement || this.group.inSwarm || this.group.inSwarmWait))
					{
						num *= this.group.FormationSpeed(this);
					}
					if (this.summoned && !this.npc)
					{
						float sqrMagnitude = (this.currentPosition - Links.x.main.currentPosition).sqrMagnitude;
						if (sqrMagnitude > 625f && sqrMagnitude <= 1225f && !this.hasActions)
						{
							num *= 1.3f;
						}
						if (sqrMagnitude > 1225f)
						{
							num *= 2f;
						}
					}
				}
				else if (this.body.sneaking)
				{
					num = this.stats.MoveSpeed(false) - 0.25f;
				}
				else if (this.inCombat || (Records.x.InCombat(false) && (this.vipFollow || this.summoned)))
				{
					num = this.stats.MoveSpeed(false);
				}
				else
				{
					num = Links.x.main.stats.PartyAdventureMoveSpeed();
					RaycastHit raycastHit;
					if (this.mainSelected && Physics.SphereCast(this.currentPosition + new Vector3(0f, 4f, 0f), 0.25f, Vector3.up * -1f, out raycastHit, 20f, Links.x.floor))
					{
						num *= Mathf.Clamp(Mathf.Abs(raycastHit.normal.y), 0.85f, 1f);
					}
					if (this.inTown && !this.fleeing)
					{
						num *= 1.2f;
					}
					if (this.movingOutOfWay)
					{
						num *= 1.1f;
					}
					if (this.followingType != "" && !this.physicsMove)
					{
						num *= 1.1f;
					}
					if (!this.mainSelected && !Links.x.combat.inPocketAttack && !this.isBoro)
					{
						float sqrMagnitude2 = (this.currentPosition - Links.x.main.currentPosition).sqrMagnitude;
						if (sqrMagnitude2 < 64f)
						{
							num *= 0.9f - Mathf.Clamp(this.portraitID / 20f, 0f, 0.4f);
						}
						if (sqrMagnitude2 >= 64f && sqrMagnitude2 <= 144f && !this.hasActions)
						{
							num *= 0.95f - Mathf.Clamp(this.portraitID / 20f, 0f, 0.4f);
						}
						if (sqrMagnitude2 > 144f && sqrMagnitude2 <= 625f && !this.hasActions)
						{
							num *= 1.05f - Mathf.Clamp(this.portraitID / 20f, 0f, 0.4f);
						}
						if (sqrMagnitude2 > 625f && sqrMagnitude2 <= 1225f && !this.hasActions)
						{
							num *= 1.3f - Mathf.Clamp(this.portraitID / 20f, 0f, 0.4f);
						}
						if (sqrMagnitude2 > 1225f)
						{
							num *= 2f;
						}
					}
					if (this.isBoro && !this.sailing)
					{
						num = 0.6f;
					}
				}
				if (this.running)
				{
					speed *= 1.5f;
				}
				speed *= Mathf.Clamp(num, 0f, 20f);
				if (this.fleeing && !Records.x.removeControls && !this.summoned)
				{
					speed *= 2f;
				}
				if (this.moveBackward)
				{
					speed *= this.stats.characterRow._MoveBackSpeed;
				}
				if (this.stats.race == "Yeti")
				{
					if (this.inTown)
					{
						speed *= 0.9f;
					}
					else if (this.mainSelected || this.hasActions)
					{
						speed *= 0.8f;
					}
					else
					{
						speed *= 0.72f;
					}
				}
				if (this.charging)
				{
					if (this.stats.animal)
					{
						speed *= 3f;
					}
					else
					{
						speed *= 3.5f;
					}
				}
			}
			else if (this.IsAttacking(this.body.currentHash))
			{
				if (speed > 0.1f)
				{
					speed = 1f;
				}
			}
			else if (speed > 0.1f)
			{
				speed = 1f;
			}
		}
		if ((!this.IsWalking() || !this.party) && speed != this.animator.speed)
		{
			this.animator.speed = speed;
		}
		this.currentAnimatorSpeed = speed;
	}

	// Token: 0x06000379 RID: 889 RVA: 0x000506A8 File Offset: 0x0004E8A8
	public void DoPath(bool skipPool)
	{
		if (this.waitingForPath == -1)
		{
			this.waitingForPath = 0;
		}
		this.MakePath(this.savedPathTarget, this.maxNodesSave, this.estimatedPathSave, this.toDirectionSave, skipPool);
	}

	// Token: 0x0600037A RID: 890 RVA: 0x000506DC File Offset: 0x0004E8DC
	public void UpdateSizeRadius(float n)
	{
		this.radius = n;
		if (this.radius <= 1f)
		{
			this.attackRadius = Records.x.nodeSize / 2f;
		}
		if (this.radius == 3f)
		{
			this.attackRadius = Records.x.nodeSize * 2f / 2f;
		}
		if (this.radius == 4f)
		{
			this.attackRadius = Records.x.nodeSize * 3f / 2f;
		}
		if (this.radius == 8f)
		{
			this.attackRadius = Records.x.nodeSize * 3f / 2f;
		}
		if (this.thisCollider)
		{
			if (this.radius <= 3f)
			{
				this.thisCollider.radius = 0.7f;
			}
			else
			{
				this.thisCollider.radius = 2.5f;
			}
		}
		if (this.playerBorders)
		{
			this.playerBorders.UpdateSize(n);
			if (this.radius == 1f)
			{
				this.cc.radius = 0.7f;
				return;
			}
			if (this.radius == 8f)
			{
				this.cc.radius = 2.5f;
			}
		}
	}

	// Token: 0x0600037B RID: 891 RVA: 0x00050820 File Offset: 0x0004EA20
	public Vector3 BoundsMin()
	{
		return this.thisCollider.bounds.min;
	}

	// Token: 0x0600037C RID: 892 RVA: 0x00050840 File Offset: 0x0004EA40
	public Vector3 BoundsMax()
	{
		return this.thisCollider.bounds.max - new Vector3(0f, 0.5f, 0f);
	}

	// Token: 0x0600037D RID: 893 RVA: 0x00050879 File Offset: 0x0004EA79
	public int ConnectionNumber()
	{
		if (this.radius == 1f)
		{
			return 0;
		}
		if (this.radius == 3f)
		{
			return 3;
		}
		if (this.radius == 4f)
		{
			return 4;
		}
		if (this.radius >= 8f)
		{
			return 8;
		}
		return 0;
	}

	// Token: 0x0600037E RID: 894 RVA: 0x000508B8 File Offset: 0x0004EAB8
	public float RealRadius()
	{
		if (this.radius == 1f)
		{
			return 1f;
		}
		if (this.radius == 3f)
		{
			return 1.5f;
		}
		if (this.radius == 4f)
		{
			return 2f;
		}
		if (this.radius >= 8f)
		{
			return 3f;
		}
		return 1f;
	}

	// Token: 0x0600037F RID: 895 RVA: 0x00050918 File Offset: 0x0004EB18
	public void CheckPath(GraphNode pathTarg, bool toDirection)
	{
		if (!Links.x.gaia.sceneLoaded)
		{
			return;
		}
		if (this.NodesCount() == 0)
		{
			this.charging = false;
		}
		if (!this.npc)
		{
			if (Random.Range(0, 2) == 0 && this.hasActions)
			{
				this.walkConstraint.constrainPenalty = 2;
			}
			else
			{
				this.walkConstraint.constrainPenalty = 3;
			}
		}
		else if ((!this.hasActions && Random.Range(0, 10) == 0 && (this.deactivating || this.dayNightVanishing || this.alwaysOn)) || this.missing || this.waitingForNewPath)
		{
			this.walkConstraint.constrainPenalty = 0;
		}
		else
		{
			this.walkConstraint.constrainPenalty = 1;
		}
		this.walkConstraint.constrainWalkability = true;
		this.walkConstraint.walkable = true;
		if ((this.stats.animal && !this.ignoreNodeIDs) || (this.party && !this.mainSelected && !this.boatNavigator && (this.hasActions || !Links.x.main.moving || (!this.hasActions && Random.Range(0, 4) != 0))) || (this.fleeing || (Records.x.removeControls && !this.ignoreNodeIDs)) || (this.npc && !this.dayNightVanishing) || this.boatNavigator)
		{
			this.pushCount = Links.x.fellowship.pushCountMax + 100;
		}
		else if (this.npc && this.dayNightVanishing)
		{
			if (Random.Range(0, 2) == 0)
			{
				this.pushCount = 0;
			}
			else
			{
				this.pushCount = Links.x.fellowship.pushCountMax + 100;
			}
		}
		if (this.ignoreNodeIDs || (this.isBoro && Records.x.removeControls) || (!this.hasActions && this.pushCount < Links.x.fellowship.pushCountMax && this.returnToPointTime == 0f && !this.boatNavigator) || (this.ghostVanishing || this.ambushing || (this.dayNightVanishing && this.visible == 0 && !this.waitingForNewPath && !this.boatNavigator)) || (this.mainSelected && Records.x.pocketPause && !this.pocketPaused))
		{
			this.walkConstraint.constrainTags = false;
		}
		else
		{
			this.walkConstraint.constrainTags = true;
		}
		this.walkConstraint.checkCircleID = this.CheckCircleID();
		if (this.boatNavigator)
		{
			if (this.sailing && !this.npc)
			{
				if (!this.raycastModifier)
				{
					this.raycastModifier = base.gameObject.AddComponent<RaycastModifier>();
				}
			}
			else if (this.isBoro && this.raycastModifier)
			{
				Object.Destroy(this.raycastModifier);
			}
		}
		bool flag = false;
		if (this.raycastModifier)
		{
			if (this.mainSelected && !this.waitingForNewPath && this.radius < 3f)
			{
				flag = true;
			}
			if (Links.x.combat.inPocketAttack && this.party)
			{
				flag = true;
			}
			if (this.boatNavigator && !this.npc)
			{
				if (this.boat)
				{
					flag = true;
					this.raycastModifier.sailing = true;
					this.raycastModifier.excludeObject = this.boat.gameObject;
				}
			}
			else
			{
				this.raycastModifier.sailing = false;
			}
			if (!flag)
			{
				this.raycastModifier.enabled = false;
				if (this.simpleSmoothModifier)
				{
					this.simpleSmoothModifier.enabled = true;
				}
			}
			else
			{
				if (this.simpleSmoothModifier)
				{
					this.simpleSmoothModifier.enabled = false;
				}
				this.raycastModifier.enabled = true;
			}
		}
		else if (this.simpleSmoothModifier)
		{
			this.simpleSmoothModifier.enabled = true;
		}
		this.simpleSmoothModifier.radius = (int)this.radius;
		if (this.walkConstraint.constrainTags)
		{
			this.walkConstraint.passID = this.nodeMovingID;
			this.walkConstraint.passID2 = this.nodeStationaryID;
		}
		else
		{
			this.walkConstraint.passID = 0;
			this.walkConstraint.passID2 = 0;
		}
		this.walkConstraint.checkConnections = this.ConnectionNumber();
		this.walkConstraint.constrainDistance = false;
		this.walkConstraint.constrainToArea = -1;
		if (!this.npc && Links.x.hasMain && this.node != null && Links.x.main.node != null && this.node != null && this.node.Area == Links.x.main.node.Area && !this.inCircle)
		{
			this.walkConstraint.constrainToArea = (int)this.node.Area;
		}
		if (this.ghost && !this.ghostVanishing)
		{
			this.walkConstraint.constrainToEnvironment = 0;
		}
		if (this.sailing && this.boatNavigator)
		{
			this.walkConstraint.passID = this.boat.nodeMovingID;
			this.walkConstraint.passID2 = this.boat.nodeStationaryID;
			this.walkConstraint.constrainToEnvironment = 2;
			this.walkConstraint.checkConnections = 4;
			this.boat.SetNodeID(true, true);
			if (this.boat.node == null)
			{
				return;
			}
			if (this.simpleSmoothModifier && !flag)
			{
				this.simpleSmoothModifier.enabled = true;
			}
		}
		else if (this.movesOnWater)
		{
			this.walkConstraint.constrainToEnvironment = 2;
		}
		else
		{
			this.SetNodeID(true, true);
			if (this.node == null)
			{
				return;
			}
		}
		if (!toDirection)
		{
			if (this.raycastModifier && (pathTarg.Area != this.node.Area || pathTarg.GraphIndex != this.node.GraphIndex))
			{
				this.raycastModifier.enabled = false;
				if (this.simpleSmoothModifier)
				{
					this.simpleSmoothModifier.enabled = true;
				}
			}
			this.seeker.pathConstraint = this.walkConstraint;
			if (this.mainSelected || (this.isBoro && this.sailing))
			{
				this.seeker.clickPoint = this.clickedPoint;
				this.seeker.StartPath(this.tr.position, (Vector3)pathTarg.position, null);
				this.waitingForPath = 1;
			}
			else
			{
				if (this.party)
				{
					if (!this.raycastModifier.enabled)
					{
						this.seeker.clickPoint = Vector3.zero;
					}
				}
				else
				{
					this.seeker.clickPoint = Vector3.zero;
				}
				GraphNode graphNode = this.CastPoint();
				if (graphNode != null)
				{
					this.seeker.StartPath(graphNode, pathTarg, null);
					this.waitingForPath = 1;
				}
			}
		}
		if (toDirection)
		{
			if (this.fleeing || this.movingOutOfWay)
			{
				if (this.fleeingAroundPoint)
				{
					this.seeker.clickPoint = Vector3.zero;
					this.seeker.pathConstraint = this.walkConstraint;
					pathTarg = this.NearNode((Vector3)pathTarg.position + new Vector3(Random.Range(-2f, 2f), 0f, Random.Range(-2f, 2f)), true, 0, -1, 0);
					if (pathTarg != null)
					{
						this.seeker.StartPath(this.CastPoint(), pathTarg, null);
					}
					else
					{
						this.seeker.StartFleePath(this.CastPoint(), this.savedPathTarget, 40000, new OnPathDelegate(this.PathFinished), 5f, 1000);
					}
				}
				else
				{
					this.seeker.clickPoint = Vector3.zero;
					this.seeker.pathConstraint = this.walkConstraint;
					int num = this.maxNodesSave;
					if (num > 40)
					{
						num = 40;
					}
					Vector3 vector = new Vector3(Random.Range(-2f, 2f), 0f, Random.Range(-2f, 2f));
					if (this.savedPathTarget != null)
					{
						vector = (Vector3)this.savedPathTarget.position;
					}
					Quaternion quaternion = Quaternion.LookRotation(this.currentPosition - vector);
					if (!this.npc || this.hasActions)
					{
						this.setArea = (int)this.node.Area;
					}
					if (this.radius < 3f)
					{
						pathTarg = this.NearNode(this.currentPosition + quaternion * Vector3.forward * (float)num + new Vector3(Random.Range(-4f, 4f), 0f, Random.Range(-4f, 4f)), true, 0, -1, 0);
					}
					if (pathTarg != null && this.radius < 3f && Random.Range(0, 3) == 0)
					{
						this.seeker.StartPath(this.CastPoint(), pathTarg, null);
					}
					else
					{
						if (this.radius < 3f)
						{
							pathTarg = this.NearNode(this.currentPosition + quaternion * Vector3.forward * 3f + new Vector3(Random.Range(-4f, 4f), 0f, Random.Range(-4f, 4f)), true, 0, -1, 0);
						}
						if (pathTarg != null && this.radius < 3f)
						{
							this.seeker.StartPath(this.CastPoint(), pathTarg, null);
						}
						else
						{
							this.seeker.StartFleePath(this.CastPoint(), this.savedPathTarget, 40000, new OnPathDelegate(this.PathFinished), 1f, 1000);
						}
					}
				}
				this.waitingForPath = 1;
			}
			else
			{
				this.seeker.clickPoint = Vector3.zero;
				this.seeker.pathConstraint = this.walkConstraint;
				this.seeker.StartRandomPath(this.CastPoint(), 40000, new OnPathDelegate(this.PathFinished), 10f, 1000, (Vector3)this.savedPathTarget.position);
				this.waitingForPath = 1;
			}
		}
		if (Records.x.astarDebugging)
		{
			Debug.Log("Submitting path finished to seeker " + ((this != null) ? this.ToString() : null) + " " + this.waitingForPath.ToString());
		}
	}

	// Token: 0x06000380 RID: 896 RVA: 0x00051358 File Offset: 0x0004F558
	public void TakePath(Character takeFrom, GraphNode destination)
	{
		Debug.Log("take path " + ((takeFrom != null) ? takeFrom.ToString() : null) + " " + ((this != null) ? this.ToString() : null));
		this.ClearNodePath();
		this.prepPath.Clear();
		this.prepVectorPath.Clear();
		this.prepPathTemp = takeFrom.prepPath;
		this.prepVectorPathTemp = takeFrom.prepVectorPath;
		for (int i = 0; i < this.prepPathTemp.Count; i++)
		{
			this.prepPath.Add(this.prepPathTemp[i]);
			this.prepVectorPath.Add(this.prepVectorPathTemp[i]);
		}
		this.savedPathTarget = destination;
		this.maxNodesSave = 100;
		this.estimatedPathSave = false;
		this.toDirectionSave = false;
	}

	// Token: 0x06000381 RID: 897 RVA: 0x00051428 File Offset: 0x0004F628
	public void Jump(GraphNode destination, Vector3 point, bool evade, bool isFlyBack)
	{
		this.ClearNodePath();
		this.prepPath.Clear();
		this.prepVectorPath.Clear();
		this.prepVectorPath.Add(point);
		this.prepPath.Add(destination);
		this.waitingForPath = 2;
		this.savedPathTarget = destination;
		this.maxNodesSave = 100;
		this.estimatedPathSave = false;
		this.toDirectionSave = false;
		this.evading = evade;
		this.isHitFlying = isFlyBack;
		this.slideNode = null;
		this.DoPath(true);
	}

	// Token: 0x06000382 RID: 898 RVA: 0x000514AC File Offset: 0x0004F6AC
	public void PathFinished(Path p)
	{
		if (!Links.x.gaia.sceneLoaded || this.waitingForPath == 0)
		{
			if (Records.x.astarDebugging && Links.x.gaia.sceneLoaded)
			{
				Debug.Log(((this != null) ? this.ToString() : null) + " Path canceled - waiting for path = 0");
			}
			return;
		}
		p.Claim(this);
		if (this.sailing && this.boatNavigator)
		{
			this.boat.SetNodeID(true, false);
		}
		else
		{
			this.SetNodeID(true, false);
		}
		if (Records.x.astarDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				"Path finished ",
				(this != null) ? this.ToString() : null,
				" ",
				p.error.ToString(),
				" ",
				p.path.Count.ToString(),
				" ",
				p.vectorPath.Count.ToString()
			}));
		}
		bool flag = false;
		if (!p.error && !this.jumpingAreas)
		{
			this.tempPath = p.path;
			this.pathpointVectors = p.vectorPath;
			bool flag2 = false;
			if (this.raycastModifier && this.raycastModifier.enabled)
			{
				flag2 = true;
			}
			if (flag2)
			{
				if (!this.mainSelected && !this.hasActions && !this.inCircle && !this.inCombat && !this.npc && !this.isBoro && !this.sailing)
				{
					if (this.tempPath.Count > 15 && (Links.x.main.tr.position - this.currentPosition).sqrMagnitude < 400f)
					{
						flag = true;
					}
					if (this.tempPath.Count > 9 && (Links.x.main.tr.position - this.currentPosition).sqrMagnitude < 100f)
					{
						flag = true;
					}
				}
				this.prepVectorPath.Clear();
				this.prepPath.Clear();
				int count = this.pathpointVectors.Count;
				this.pointsTemp.Clear();
				this.nodesTemp.Clear();
				this.prevPoint = this.tr.position;
				if (this.pathpointVectors.Count > 0)
				{
					this.prevPoint = this.pathpointVectors[0];
				}
				if (!flag)
				{
					for (int i = 1; i < count; i++)
					{
						float num = Vector3.Distance(this.pathpointVectors[i], this.prevPoint);
						int num2 = Mathf.RoundToInt(num) / 2 + 1;
						if (this.sailing)
						{
							num2 = Mathf.RoundToInt(num) / 4 + 1;
						}
						if (num == 0f)
						{
							num = 0.2f;
						}
						for (int j = 0; j < num2; j++)
						{
							float num3 = 2f * (float)j / num;
							if (this.sailing)
							{
								num3 = (float)(j + 1) / (float)num2;
							}
							if (num3 > 1f)
							{
								num3 = 1f;
							}
							if (num3 < 0f)
							{
								num3 = 0f;
							}
							Vector3 vector = Vector3.Lerp(this.prevPoint, this.pathpointVectors[i], num3);
							RaycastHit raycastHit;
							if (this.boatNavigator)
							{
								if (Physics.Raycast(vector + new Vector3(0f, 10f, 0f), Vector3.up * -1f, out raycastHit, 20f, 16) && !this.pointsTemp.Contains(raycastHit.point))
								{
									this.pointsTemp.Add(raycastHit.point);
									this.nodesTemp.Add(this.tempPath[0]);
								}
							}
							else if (Physics.Raycast(vector + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 12f, 4194305) && Vector3.Distance(this.tr.position, vector) > 0.1f && !this.pointsTemp.Contains(raycastHit.point))
							{
								this.pointsTemp.Add(raycastHit.point);
								this.nodesTemp.Add(this.tempPath[0]);
							}
							if (j == num2 - 1)
							{
								this.prevPoint = vector;
							}
						}
					}
					if (this.pointsTemp.Count > 0)
					{
						this.pointsTemp[this.pointsTemp.Count - 1] = this.pathpointVectors[this.pathpointVectors.Count - 1];
					}
					else if (this.pathpointVectors.Count > 0)
					{
						this.pointsTemp.Add(this.pathpointVectors[this.pathpointVectors.Count - 1]);
						this.nodesTemp.Add(this.tempPath[0]);
					}
					if (this.pointsTemp.Count > 0)
					{
						GraphNode graphNode = this.NearNode(this.pointsTemp[this.pointsTemp.Count - 1], false, 0, (int)this.node.GraphIndex, 0);
						if (graphNode != null && this.nodesTemp.Count > 0)
						{
							this.nodesTemp[this.nodesTemp.Count - 1] = graphNode;
						}
					}
					for (int k = 0; k < this.pointsTemp.Count; k++)
					{
						if (k > 0)
						{
							this.prepVectorPath.Add(this.pointsTemp[k]);
							this.prepPath.Add(this.nodesTemp[k]);
						}
						else if ((this.pointsTemp[k] - this.tr.position).sqrMagnitude > 0.040000003f || this.boatNavigator)
						{
							this.prepVectorPath.Add(this.pointsTemp[k]);
							this.prepPath.Add(this.nodesTemp[k]);
						}
					}
				}
			}
			this.movingAreas = false;
			if (!flag2)
			{
				int count2 = this.tempPath.Count;
				this.prepPath.Clear();
				this.prepVectorPath.Clear();
				if (this.maxNodesSave == 0)
				{
					this.maxNodesSave = 100;
				}
				if (this.party && !this.mainSelected && this.maxNodesSave > 20)
				{
					this.maxNodesSave = 20;
				}
				uint num4 = 0U;
				if (this.node != null)
				{
					num4 = this.node.Area;
				}
				float nodeSize = Records.x.nodeSize;
				float nodeSize2 = Records.x.nodeSize;
				bool flag3 = false;
				Vector3 vector2 = this.tr.position;
				bool flag4 = false;
				bool flag5 = false;
				if (!this.mainSelected && !this.hasActions && !this.inCircle && !this.inCombat && !this.npc && !this.isBoro)
				{
					flag4 = false;
					if (this.tempPath.Count > 20 && (Links.x.main.tr.position - this.currentPosition).sqrMagnitude < 225f)
					{
						flag = true;
						flag3 = true;
					}
					if (this.tempPath.Count > 9 && (Links.x.main.tr.position - this.currentPosition).sqrMagnitude < 100f)
					{
						flag = true;
						flag3 = true;
					}
				}
				for (int l = 0; l < count2; l++)
				{
					if (this.prepPath.Count < this.maxNodesSave && this.tempPath[l] != null)
					{
						if (l == 0)
						{
							bool flag6 = false;
							if (this.tempPath[l].Area != num4)
							{
								flag6 = true;
							}
							GraphNode graphNode2 = this.node;
							if (this.boatNavigator)
							{
								GraphNode graphNode3 = this.boat.node;
							}
							if (flag6 && this.movingOutOfWay)
							{
								flag3 = true;
							}
							if (this.party && !this.mainSelected && flag6 && !this.inCircle)
							{
								flag3 = true;
							}
							if (this.forceNodePath)
							{
								flag6 = true;
							}
							float num5 = 6f;
							if (this.pathpointVectors.Count > 0)
							{
								num5 = (this.pathpointVectors[0] - this.tr.position).sqrMagnitude;
							}
							if (num5 > 36f && this.tempPath[0].HasLinkNode())
							{
								flag6 = true;
							}
							if ((this.tempPath.Count <= 1 || (!this.sailing && num5 >= 6f)) && !flag3)
							{
								if (l < this.tempPath.Count)
								{
									if (flag6 || this.tempPath.Count == 1)
									{
										this.prepVectorPath.Add(this.GetNodeCenter(this.tempPath[l]));
										vector2 = this.prepVectorPath[0];
									}
									else
									{
										if (l < this.pathpointVectors.Count)
										{
											this.prepVectorPath.Add(this.pathpointVectors[l]);
										}
										else
										{
											this.prepVectorPath.Add(this.GetNodeCenter(this.tempPath[l]));
										}
										vector2 = this.prepVectorPath[0];
									}
									this.prepPath.Add(this.tempPath[l]);
								}
								else
								{
									if (flag6)
									{
										this.prepVectorPath.Add(this.GetNodeCenter(this.tempPath[this.tempPath.Count - 1]));
									}
									else
									{
										this.prepVectorPath.Add(this.pathpointVectors[this.pathpointVectors.Count - 1]);
									}
									this.prepPath.Add(this.tempPath[this.tempPath.Count - 1]);
									vector2 = this.prepVectorPath[0];
								}
							}
							if (flag6)
							{
								this.movingAreas = true;
							}
						}
						else
						{
							int count3 = this.tempPath.Count;
							int count4 = this.pathpointVectors.Count;
							bool flag7 = false;
							if (l < count3 && l - 1 < count3)
							{
								if (this.tempPath[l].Area != this.tempPath[l - 1].Area)
								{
									flag7 = true;
								}
								if (((Vector3)this.tempPath[l].position - (Vector3)this.tempPath[l - 1].position).sqrMagnitude > 36f && (this.tempPath[l].HasLinkNode() || this.tempPath[l - 1].HasLinkNode()))
								{
									flag7 = true;
								}
							}
							if (l < count4 && l - 1 < count4)
							{
								float sqrMagnitude = (this.pathpointVectors[l] - this.pathpointVectors[l - 1]).sqrMagnitude;
							}
							if (l < count3 && l + 1 < count3 && this.tempPath[l].Area != this.tempPath[l + 1].Area)
							{
								flag7 = true;
							}
							if (l - 1 < count3 && l - 2 < count3 && l - 1 >= 0 && l - 2 >= 0 && this.tempPath[l - 1].Area != this.tempPath[l - 2].Area)
							{
								flag7 = true;
							}
							if (l - 2 < count3 && l - 3 < count3 && l - 3 >= 0 && l - 2 >= 0 && this.tempPath[l - 2].Area != this.tempPath[l - 3].Area)
							{
								flag7 = true;
							}
							if (l + 1 < count3 && l + 2 < count3 && this.tempPath[l + 1].Area != this.tempPath[l + 2].Area)
							{
								flag7 = true;
							}
							if (l + 2 < count3 && l + 3 < count3 && this.tempPath[l + 2].Area != this.tempPath[l + 3].Area)
							{
								flag7 = true;
							}
							if (flag7 && this.movingOutOfWay && this.party)
							{
								flag3 = true;
							}
							if (this.party && !this.mainSelected && flag7 && !this.missing && !this.inCircle)
							{
								flag3 = true;
							}
							if (this.forceNodePath)
							{
								flag7 = true;
							}
							if (flag4)
							{
								flag5 = false;
								if (l % 2 == 0)
								{
									flag5 = true;
									Vector3 vector3 = new Vector3(0f, 1f, 0f);
									Vector3 up = Vector3.up;
									LayerMask layerMask = 6357760;
									Vector3 vector4 = vector2;
									Vector3 vector5 = this.pathpointVectors[l];
									Vector3 vector6 = Quaternion.LookRotation(vector5 - vector4) * Vector3.right;
									if (flag7)
									{
										flag5 = false;
									}
									if (flag5 && Physics.Linecast(vector4 + vector3, vector5 + vector3, layerMask))
									{
										flag5 = false;
									}
									if (flag5 && Physics.Linecast(vector4 + vector3 + vector6 * 0.5f, vector5 + vector3 + vector6 * 0.5f, layerMask))
									{
										flag5 = false;
									}
									if (flag5 && Physics.Linecast(vector4 + vector3 - vector6 * 0.5f, vector5 + vector3 - vector6 * 0.5f, layerMask))
									{
										flag5 = false;
									}
									if (flag5)
									{
										float num6 = Vector3.Distance(vector5, vector4);
										int num7 = 1;
										int num8 = Mathf.RoundToInt(num6) * num7;
										for (int m = 0; m < num8; m++)
										{
											float num9 = (float)m / (float)num8;
											if (num9 > 1f)
											{
												num9 = 1f;
											}
											if (num9 < 0f)
											{
												num9 = 0f;
											}
											Vector3 vector7 = Vector3.Lerp(vector4, vector5, num9);
											if (flag5 && flag5)
											{
												if (!Physics.Raycast(vector7 + vector3, up * -1f, 2f, 4194305))
												{
													flag5 = false;
												}
												RaycastHit raycastHit2;
												if (flag5 && Physics.Raycast(vector7 + vector3, up * -1f, out raycastHit2, 8f, 4194321) && raycastHit2.collider.gameObject.layer == 4)
												{
													flag5 = false;
												}
											}
										}
									}
								}
							}
							if (((this.boatNavigator && l % 3 == 0) || (!this.boatNavigator && !flag4) || (!this.boatNavigator && flag4 && !flag5) || (l == count2 - 1 && this.boatNavigator && this.hasActions) || (l == this.maxNodesSave - 1 && this.boatNavigator && this.hasActions)) && !flag3 && l < this.pathpointVectors.Count)
							{
								if (flag7)
								{
									this.prepVectorPath.Add(this.GetNodeCenter(this.tempPath[l]));
									vector2 = this.GetNodeCenter(this.tempPath[l]);
								}
								else
								{
									this.prepVectorPath.Add(this.pathpointVectors[l]);
									vector2 = this.pathpointVectors[l];
								}
								this.prepPath.Add(this.tempPath[l]);
							}
							if (l < this.tempPath.Count)
							{
								num4 = this.tempPath[l].Area;
							}
							if (flag7)
							{
								this.movingAreas = true;
							}
						}
					}
				}
				if (((this.isBoro && this.sailing) || this.mainSelected) && this.clickedPoint != Vector3.zero && !this.usingCircles && Vector3.Distance(this.clickedPoint, this.pathpointVectors[this.pathpointVectors.Count - 1]) < 1f && !Physics.CheckSphere(this.clickedPoint, 1f, -2147417280))
				{
					this.pathpointVectors[this.pathpointVectors.Count - 1] = this.clickedPoint;
				}
				this.forceNodePath = false;
			}
			if (this.prepPath.Count > 0)
			{
				this.waitingForPath = 2;
				if (this.toDirectionSave && this.prepPath[this.prepPath.Count - 1] != null)
				{
					this.savedPathTarget = this.prepPath[this.prepPath.Count - 1];
				}
				if (Records.x.astarDebugging)
				{
					string[] array = new string[6];
					array[0] = "Do path ";
					array[1] = ((this != null) ? this.ToString() : null);
					array[2] = " node path count ";
					array[3] = this.prepPath.Count.ToString();
					array[4] = " ";
					int num10 = 5;
					GraphNode graphNode4 = this.prepPath[this.prepPath.Count - 1];
					array[num10] = ((graphNode4 != null) ? graphNode4.ToString() : null);
					Debug.Log(string.Concat(array));
				}
				if (this.savedPathTarget == null)
				{
					this.savedPathTarget = this.prepPath[this.prepPath.Count - 1];
				}
				this.blockedTime = 0f;
				this.justMoved = false;
				this.tempStop = false;
				this.blocked = false;
				this.vectorPath.Clear();
				this.nodePath.Clear();
				this.nodeActions.Clear();
				this.timeSinceFollowPath = Time.timeSinceLevelLoad;
				this.DoPath(true);
			}
			else
			{
				flag = true;
			}
		}
		else
		{
			flag = true;
		}
		if (flag)
		{
			if (Records.x.astarDebugging)
			{
				Debug.Log(string.Concat(new string[]
				{
					(this != null) ? this.ToString() : null,
					" path failed, error: ",
					p.error.ToString(),
					" ",
					this.maxNodesSave.ToString(),
					" ",
					this.node.environment.ToString()
				}));
				if (this.tempPath != null)
				{
					Debug.Log(string.Concat(new string[]
					{
						(this != null) ? this.ToString() : null,
						" temp path count ",
						this.tempPath.Count.ToString(),
						" push count ",
						this.pushCount.ToString()
					}));
				}
			}
			this.movingOutOfWay = false;
			if (this.npc)
			{
				this.waitingForPath = 3;
				this.waitForPathTime = Time.timeSinceLevelLoad;
				if (this.hasActions)
				{
					if (!p.error && this.tempPath.Count == 1)
					{
						this.TargetReached();
					}
					else
					{
						this.CheckIfClearPathEfforts();
					}
				}
				else
				{
					this.CheckIfClearPathEfforts();
				}
			}
			else if (this.hasActions && !this.jumpingAreas)
			{
				this.waitingForPath = 3;
				this.waitForPathTime = Time.timeSinceLevelLoad;
				if (!p.error && this.tempPath.Count == 1)
				{
					this.TargetReached();
					return;
				}
				this.CheckIfClearPathEfforts();
				return;
			}
			else
			{
				this.waitingForPath = 0;
			}
		}
		if (this.prepPath.Count == 0 && this.hasActions && this.creatures)
		{
			this.patrolNode--;
		}
		p.Release(this, false);
	}

	// Token: 0x06000383 RID: 899 RVA: 0x0005288C File Offset: 0x00050A8C
	public void AddKeyNode(GraphNode n, Vector3 pt)
	{
		if (n == this.node)
		{
			this.body.sameNode = true;
		}
		else
		{
			this.body.sameNode = false;
		}
		this.prepVectorPath.Clear();
		this.prepPath.Clear();
		this.prepPath.Add(n);
		this.prepVectorPath.Add(pt);
		this.waitingForPath = 2;
		this.savedPathTarget = n;
		this.maxNodesSave = 1;
		this.estimatedPathSave = false;
		this.toDirectionSave = false;
		this.DoPath(true);
		this.usingKeys = true;
		this.waypoint.transform.position = Links.x.gameplay.farPosition;
		if (this.waypointAnimator.enabled)
		{
			this.waypointAnimator.enabled = false;
		}
	}

	// Token: 0x06000384 RID: 900 RVA: 0x00052954 File Offset: 0x00050B54
	public GraphNode GetLastPrepNode()
	{
		if (this.nodePath.Count == 0)
		{
			return null;
		}
		if (!this.CheckControls())
		{
			return null;
		}
		if (!Records.x.InCombat(false))
		{
			return this.nodePath[this.nodePath.Count - 1];
		}
		if (this.nodePath[this.nodePath.Count - 1] == null)
		{
			return null;
		}
		return this.nodePath[this.nodePath.Count - 1];
	}

	// Token: 0x06000385 RID: 901 RVA: 0x000529D4 File Offset: 0x00050BD4
	public void FindCurrentNodeAnytime(bool snap)
	{
		if (Links.x.gaia.noAstar || !this.tr)
		{
			return;
		}
		GraphNode graphNode = this.NearNode(this.tr.position, true, 0, -1, 0);
		if (graphNode != null)
		{
			this.nodePoint = (Vector3)graphNode.position;
			if (Mathf.Abs(this.nodePoint.y - this.tr.position.y) < 2f && (this.nodePoint - this.tr.position).sqrMagnitude < 16f)
			{
				if (!this.stuckInPlace && !this.moving && snap && !this.mainSelected)
				{
					this.Slide(graphNode, false);
				}
				this.ClaimNode(graphNode, this.nodePoint, false);
			}
		}
	}

	// Token: 0x06000386 RID: 902 RVA: 0x00052AB0 File Offset: 0x00050CB0
	public void FindCurrentNode(bool snap)
	{
		if (this.tr && !this.offMap)
		{
			GraphNode graphNode = this.NearNode(this.tr.position, true, 0, -1, 0);
			if (graphNode != null && Mathf.Abs(this.nodePoint.y - this.tr.position.y) < 2f && (this.nodePoint - this.tr.position).sqrMagnitude < 16f)
			{
				this.nodePoint = (Vector3)graphNode.position;
				this.ClaimNode(graphNode, this.nodePoint, false);
				if (!this.stuckInPlace && !this.moving && snap && !this.mainSelected)
				{
					this.Slide(graphNode, false);
				}
			}
		}
	}

	// Token: 0x06000387 RID: 903 RVA: 0x00052B88 File Offset: 0x00050D88
	public void SetWaypoint(Vector3 pt)
	{
		if ((this.vectorPath.Count > 2 || pt != Vector3.zero) && (this.mainSelected || this.showWaypoint) && this.waypoint)
		{
			if (!this.waypoint.activeSelf)
			{
				this.waypoint.SetActive(true);
			}
			if (!this.waypointAnimator.enabled)
			{
				this.waypointAnimator.enabled = true;
				this.waypointAnimator.Play("waypointArrowStart");
			}
			if (pt == Vector3.zero)
			{
				pt = this.vectorPath[this.vectorPath.Count - 1];
			}
			this.waypoint.transform.position = pt + new Vector3(0f, -0.5f, 0f);
		}
	}

	// Token: 0x06000388 RID: 904 RVA: 0x00052C6C File Offset: 0x00050E6C
	private bool CanEndJump()
	{
		RaycastHit raycastHit;
		return Physics.Raycast(this.tr.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 30f, 4194449) && Vector3.Distance(raycastHit.point, this.tr.position) < 0.5f;
	}

	// Token: 0x06000389 RID: 905 RVA: 0x00052CE0 File Offset: 0x00050EE0
	public void ForceEndJump()
	{
		RaycastHit raycastHit;
		if (this.jumping && Physics.Raycast(this.tr.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 30f, 4194449))
		{
			this.SetPosition(raycastHit.point, null);
		}
		this.jumping = false;
		this.jumpLanding = false;
	}

	// Token: 0x0600038A RID: 906 RVA: 0x00052D58 File Offset: 0x00050F58
	public void ClearNodePath()
	{
		if (this.jumping && !this.CanEndJump())
		{
			return;
		}
		this.jumpLanding = false;
		this.vectorPath.Clear();
		this.nodePath.Clear();
		this.nodeActions.Clear();
		this.moving = false;
		this.moveNode = null;
		this.movePoint = Vector3.zero;
		if (!this.npc && !this.isBoro && this.waypoint && this.waypointAnimator)
		{
			this.waypoint.transform.position = Links.x.gameplay.farPosition;
			if (this.waypointAnimator.enabled)
			{
				this.waypointAnimator.enabled = false;
			}
		}
		if (this.sphere)
		{
			this.sphere.transform.position = this.tr.position;
		}
		this.waitingForPath = 0;
		this.savedPathTarget = null;
		this.jumping = false;
		if (this.isHitFlying)
		{
			this.isHitFlying = false;
		}
		this.waitingForNewPath = false;
		this.StopEvading();
		this.MoveBackEmpty();
		if (Records.x.astarDebugging)
		{
			Debug.Log(((this != null) ? this.ToString() : null) + " is clearning node path");
		}
		this.SetIdle(true);
	}

	// Token: 0x0600038B RID: 907 RVA: 0x00052EA8 File Offset: 0x000510A8
	public void EndPath()
	{
		if (this.sailing)
		{
			return;
		}
		if (this.jumping)
		{
			return;
		}
		if (Records.x.astarDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				(this != null) ? this.ToString() : null,
				" end path ",
				this.nodePath.Count.ToString(),
				" ",
				this.vectorPath.Count.ToString(),
				" ",
				this.animator.speed.ToString(),
				" ",
				this.animID.ToString(),
				" ",
				this.moveOnTiles.ToString()
			}));
		}
		if (this.moving && this.movePoint != this.vectorZero)
		{
			this.sphere.transform.position = this.movePoint;
		}
		else if (this.sphere)
		{
			if (this.node != null && !this.mainSelected)
			{
				this.sphere.transform.position = this.NodePosition();
			}
			else
			{
				this.sphere.transform.position = this.tr.position;
			}
		}
		if (Records.x.dialogue || Records.x.turnBased)
		{
			this.currentlyInDialogue = true;
		}
		if (this.node == null || Records.x.turnBased)
		{
			this.FindCurrentNode(false);
		}
		this.returnToPointTime = 0f;
		this.StopEvading();
		if (this.nodePath.Count == 0 && this.node != null && !Records.x.dialogue)
		{
			if ((this.NodePosition() - this.tr.position).sqrMagnitude > 0.5625f)
			{
				this.vectorPath.Clear();
				this.nodePath.Clear();
				this.nodeActions.Clear();
				this.nodeActions.Add("TileSwitch");
				this.nodePath.Add(this.node);
				this.vectorPath.Add(this.NodePosition());
				this.moveIndex = -1;
				this.waitingForPath = 0;
				if (this.sphere && this.node != null)
				{
					this.sphere.transform.position = this.NodePosition();
				}
				if (this.waypoint)
				{
					this.waypoint.transform.position = Links.x.gameplay.farPosition;
					if (this.waypointAnimator.enabled)
					{
						this.waypointAnimator.enabled = false;
					}
				}
				if (this.hasActions)
				{
					this.actions.targetMovePosition = this.nodePath[this.nodePath.Count - 1];
					if (this.actions.TargetCount() > 0 && this.waypoint)
					{
						this.waypoint.transform.position = Links.x.gameplay.farPosition;
						if (this.waypointAnimator.enabled)
						{
							this.waypointAnimator.enabled = false;
						}
					}
				}
				this.blockedTime = 0f;
				this.targetNode = this.node;
				this.tempStop = false;
				this.TurnEnter(true);
			}
			return;
		}
		this.savedPathTarget = null;
		this.waitingForPath = 0;
		int num = this.nodePath.Count - 1;
		if (this.nodePath.Count > 0)
		{
			this.tempStop = false;
			for (int i = 0; i < this.nodePath.Count; i++)
			{
				if (i != num)
				{
					this.nodePath[i] = null;
					this.nodeActions[i] = "";
					this.vectorPath[i] = Vector3.zero;
				}
				else if (this.node != null)
				{
					this.nodePath[i] = this.node;
					this.vectorPath[i] = this.NodePosition();
					this.moveNode = this.node;
					this.movePoint = this.NodePosition();
				}
			}
			this.nodePath.RemoveAll((GraphNode item) => item == null);
			this.nodeActions.RemoveAll((string item) => item == "");
			this.vectorPath.RemoveAll((Vector3 item) => item == Vector3.zero);
			if (this.sphere && this.node != null)
			{
				this.sphere.transform.position = this.NodePosition();
			}
			if (this.waypoint)
			{
				this.waypoint.transform.position = Links.x.gameplay.farPosition;
				if (this.waypointAnimator.enabled)
				{
					this.waypointAnimator.enabled = false;
				}
			}
			if (this.hasActions)
			{
				this.actions.targetMovePosition = this.nodePath[this.nodePath.Count - 1];
			}
			this.GetLook(true);
			this.targetNode = this.node;
		}
		this.waitingForNewPath = false;
		this.StopMoveToRoutine();
		this.ClearMoveTargets();
	}

	// Token: 0x0600038C RID: 908 RVA: 0x0005342C File Offset: 0x0005162C
	public void StartDelayedPath(GraphNode pathTarg, float t, float delay)
	{
		if (!this)
		{
			return;
		}
		if (this.dead)
		{
			return;
		}
		if (this.inactive)
		{
			return;
		}
		if (this.delayPathCoroutine != null)
		{
			base.StopCoroutine(this.delayPathCoroutine);
			this.delayPathCoroutine = null;
		}
		this.delayPathCoroutine = this.DelayedPath(pathTarg, t, delay);
		base.StartCoroutine(this.delayPathCoroutine);
	}

	// Token: 0x0600038D RID: 909 RVA: 0x0005348B File Offset: 0x0005168B
	private IEnumerator DelayedPath(GraphNode pathTarg, float t, float delay)
	{
		if (delay > 0f)
		{
			if (delay == 100f)
			{
				yield return new WaitForSeconds(1f);
				while (!Links.x.fellowship.EveryoneInPosition(this))
				{
					yield return null;
				}
			}
			else
			{
				while (this.inRecovery && this.hasActions)
				{
					yield return null;
				}
				yield return new WaitForSeconds(delay);
			}
		}
		else
		{
			yield return new WaitForSeconds(0.02f * t);
		}
		this.MakePath(pathTarg, 100, false, false, true);
		yield break;
	}

	// Token: 0x0600038E RID: 910 RVA: 0x000534B0 File Offset: 0x000516B0
	public void ClearPathUpdatesAll()
	{
		Links.x.gameplay.RemoveNeedsPath(this);
		this.savedPathTarget = null;
		this.waitingForPath = 0;
		this.MoveBackEmpty();
		this.blockedTime = 0f;
		this.stepReady = false;
		this.justMoved = false;
		this.tempStop = false;
		this.blocked = false;
		if (this.turning)
		{
			this.EndTurning(false);
		}
	}

	// Token: 0x0600038F RID: 911 RVA: 0x00053518 File Offset: 0x00051718
	public void ClearCurrentPathNodes()
	{
		Links.x.gameplay.RemoveNeedsPath(this);
		this.savedPathTarget = null;
		this.waitingForPath = 0;
		this.MoveBackEmpty();
		this.blockedTime = 0f;
		this.stepReady = false;
		this.justMoved = false;
		this.tempStop = false;
		this.blocked = false;
		if (this.turning)
		{
			this.EndTurning(false);
		}
		this.vectorPath.Clear();
		this.nodePath.Clear();
		this.nodeActions.Clear();
	}

	// Token: 0x06000390 RID: 912 RVA: 0x000535A0 File Offset: 0x000517A0
	public void ClearPathUpdates()
	{
		this.waitingForPath = 0;
	}

	// Token: 0x06000391 RID: 913 RVA: 0x000535AC File Offset: 0x000517AC
	public void MakePath(GraphNode pathTarg, int maxNodes, bool estimatePath, bool toDirection, bool skipPool)
	{
		if (Records.x.astarDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				(this != null) ? this.ToString() : null,
				" making path ",
				(pathTarg != null) ? pathTarg.ToString() : null,
				" ",
				this.waitingForPath.ToString()
			}));
		}
		if (this.dead || this.stunned || this.offMap || this.sleeping || (this.party && Records.x.partyCamping))
		{
			return;
		}
		if (Records.x.removeControls && !this.ignoreRemoveControls && !Links.x.combat.inPocketAttack && !Links.x.combat.inRally)
		{
			return;
		}
		if (Records.x.dialogue && !this.ignoreRemoveControls)
		{
			return;
		}
		if (this.sailing && !this.ignoreRemoveControls && !this.boatNavigator)
		{
			return;
		}
		if (this.ambushing && this.waitingForPath == 0)
		{
			return;
		}
		if (!Links.x.gaia.sceneLoaded)
		{
			return;
		}
		if (Links.x.combat.combatCinematics && !this.waitingToJoinDome)
		{
			this.waitingForPath = 0;
			return;
		}
		if (this.stuckInPlace && !this.boatNavigator)
		{
			this.waitingForPath = 0;
			return;
		}
		if (this.stats.Stuck() > 0 && !this.sailing)
		{
			if (this.hasActions)
			{
				this.actions.EndTurn(true);
			}
			this.waitingForPath = 0;
			return;
		}
		if (!this.tr || this.dead || this.stunned)
		{
			this.waitingForPath = 0;
			return;
		}
		if (this.inactive && this.npc)
		{
			this.waitingForPath = 0;
			return;
		}
		if (this.node == null && !this.boatNavigator)
		{
			this.FindCurrentNode(true);
		}
		if (this.boatNavigator && this.boat.node == null)
		{
			this.boat.ClaimNode(null, this.boat.tr.position, false);
		}
		if (pathTarg == null)
		{
			this.waitingForPath = 0;
			return;
		}
		if (this.jumpingAreas)
		{
			return;
		}
		if (Records.x.astarDebugging)
		{
			string[] array = new string[22];
			array[0] = ((this != null) ? this.ToString() : null);
			array[1] = " ";
			array[2] = ((Vector3)pathTarg.position).ToString();
			array[3] = " ";
			array[4] = this.waitingForPath.ToString();
			array[5] = " skip: ";
			array[6] = skipPool.ToString();
			array[7] = " max: ";
			array[8] = maxNodes.ToString();
			array[9] = " prep count: ";
			array[10] = this.prepPath.Count.ToString();
			array[11] = " searching: ";
			array[12] = this.searching.ToString();
			array[13] = " to direction: ";
			array[14] = toDirection.ToString();
			array[15] = this.fleeingAroundPoint.ToString();
			array[16] = " move target ";
			int num = 17;
			Character character = this.followingCharacter;
			array[num] = ((character != null) ? character.ToString() : null);
			array[18] = " ignore node ids ";
			array[19] = this.ignoreNodeIDs.ToString();
			array[20] = " running ";
			array[21] = this.running.ToString();
			Debug.Log(string.Concat(array));
		}
		if (this.jumping && this.waitingForPath == 0)
		{
			return;
		}
		if (!Links.x.gaia.pathfindingReady)
		{
			this.waitingForPath = 0;
			return;
		}
		if (this.party && this.inRecovery && this.hasActions)
		{
			this.StartDelayedPath(pathTarg, 0f, 0.0001f);
		}
		if (!this.npc || this.inCombat)
		{
			skipPool = true;
		}
		if (!this.usingKeys)
		{
			this.body.sameNode = false;
		}
		this.usingKeys = false;
		this.maxNodesSave = maxNodes;
		this.blockedTime = 0f;
		this.tempStop = false;
		this.blocked = false;
		if (this.sphere)
		{
			this.sphere.transform.position = (Vector3)pathTarg.position;
		}
		this.savedPathTarget = pathTarg;
		if (this.body.lookAtController.hasTarget && !Records.x.dialogue)
		{
			this.body.lookAtController.hasTarget = false;
		}
		if (!skipPool)
		{
			this.estimatedPathSave = estimatePath;
			this.toDirectionSave = toDirection;
			Links.x.gameplay.AddNeedsPath(this, false);
			this.waitingForPath = -1;
			return;
		}
		if (this.waitingForPath == 3)
		{
			this.waitingForPath = 0;
		}
		if (this.waitingForPath <= 0 && !this.outsideBounds)
		{
			if (this.charging)
			{
				this.jumping = false;
				this.charging = false;
			}
			this.savedPathTarget = pathTarg;
			this.estimatedPathSave = estimatePath;
			this.toDirectionSave = toDirection;
			this.CheckPath(pathTarg, toDirection);
			return;
		}
		if (this.waitingForPath != 1)
		{
			this.waitingForPath = 0;
			if (!estimatePath && !this.estimatedPathSave)
			{
				this.OnMovePathComplete();
				if (!this.npc)
				{
					if (this.nodePath.Count > 0)
					{
						if (this.canPush && !this.stats.animal)
						{
							this.pushCount = 0;
						}
						if ((!this.usingKeys && this.showWaypoint && this.mainSelected) || (this.isBoro && this.sailing))
						{
							if (this.waypoint)
							{
								if (!this.waypoint.activeSelf)
								{
									this.waypoint.SetActive(true);
								}
								if (!this.waypointAnimator.enabled)
								{
									this.waypointAnimator.enabled = true;
									this.waypointAnimator.Play("waypointArrowStart");
								}
								this.waypoint.transform.position = this.vectorPath[this.vectorPath.Count - 1] + new Vector3(0f, -0.5f, 0f);
							}
						}
						else if (this.waypoint && !this.showWaypoint)
						{
							this.waypoint.transform.position = Links.x.gameplay.farPosition;
						}
						this.showWaypoint = false;
						if (this.hasActions)
						{
							this.actions.targetMovePosition = this.nodePath[this.nodePath.Count - 1];
							if (this.actions.TargetCount() > 0 && this.waypoint)
							{
								if (this.waypointAnimator.enabled)
								{
									this.waypointAnimator.enabled = false;
								}
								this.waypoint.transform.position = Links.x.gameplay.farPosition;
							}
						}
					}
				}
				else if (this.hasActions && this.nodePath.Count > 0)
				{
					this.actions.targetMovePosition = this.nodePath[this.nodePath.Count - 1];
				}
				else if (this.nodePath.Count == 0)
				{
					if (Records.x.astarDebugging)
					{
						Debug.Log(((this != null) ? this.ToString() : null) + " doesn't have enough nodes to make path");
					}
					this.TargetReached();
				}
			}
			else if (this.npc)
			{
				this.prepPath.Clear();
				this.prepVectorPath.Clear();
			}
			else
			{
				Records.x.InCombat(false);
			}
			this.clickedPoint = Vector3.zero;
		}
	}

	// Token: 0x06000392 RID: 914 RVA: 0x00053D2C File Offset: 0x00051F2C
	public void CheckIfClearPathEfforts()
	{
		this.pathTries++;
		if (this.pathTries > 2)
		{
			this.pathTries = 0;
			this.attackRadiusTries = 0;
			if (this.inCombat)
			{
				this.ClearMoveTargets();
				this.waitingForPath = 0;
				this.sphere.transform.position = this.tr.position;
				this.TargetReached();
				if (this.hasActions)
				{
					this.actions.EndTurn(true);
					return;
				}
			}
			else
			{
				this.ClearMoveTargets();
				this.waitingForPath = 0;
				if (this.sphere)
				{
					this.sphere.transform.position = this.tr.position;
				}
				this.TargetReached();
				this.patrolNode++;
			}
		}
	}

	// Token: 0x06000393 RID: 915 RVA: 0x00053DF8 File Offset: 0x00051FF8
	public void StopMoveToRoutine()
	{
		if (!this)
		{
			return;
		}
		if (base.gameObject.activeSelf)
		{
			if (this.pathToCharacterCoroutine != null)
			{
				base.StopCoroutine(this.pathToCharacterCoroutine);
			}
			if (this.delayPathCoroutine != null)
			{
				base.StopCoroutine(this.delayPathCoroutine);
			}
			this.delayPathCoroutine = null;
			this.pathToCharacterCoroutine = null;
		}
	}

	// Token: 0x06000394 RID: 916 RVA: 0x00053E54 File Offset: 0x00052054
	public bool CheckEarlyIfInRange()
	{
		if (this.followingType == "Dialogue")
		{
			float sqrMagnitude = (this.followingCharacter.tr.position - this.tr.position).sqrMagnitude;
			float num = this.InteractionDistanceCheck(this.followingType);
			return sqrMagnitude <= num;
		}
		return false;
	}

	// Token: 0x06000395 RID: 917 RVA: 0x00053EB0 File Offset: 0x000520B0
	public void FinishMoveTo()
	{
		if (!Links.x.gaia.sceneLoaded)
		{
			this.ClearMoveTargets();
			return;
		}
		if (this.followingCharacter)
		{
			this.targetPosition = this.followingCharacter.tr.position;
		}
		if (this.followingItem)
		{
			this.targetPosition = this.followingItem.tr.position;
		}
		if (this.followingType == "Dialogue")
		{
			Links.x.gameplay.FollowCharacterPathFinished(this.followingCharacter, this);
		}
		this.followingType.Contains("Charm");
		if (this.followingType == "Attack")
		{
			if (this.inCombat && Records.x.turnBased)
			{
				this.actionPicked = true;
			}
			Links.x.gameplay.FollowCharacterPathFinished(this.followingCharacter, this);
		}
		if (this.followingType == "Item")
		{
			this.TargetReached();
			if (this.inCombat && Records.x.turnBased)
			{
				this.actionPicked = true;
			}
			Links.x.gameplay.ItemPathFinished(this.followingItem, this);
		}
		if (this.followingType == "Exit")
		{
			if (this.turning)
			{
				this.EndTurning(true);
			}
			Links.x.gameplay.MapExitFinished(this.followingExit, this, false);
		}
		if (this.followingType == "Boat")
		{
			Links.x.gameplay.BoatFollowFinished(this.followingBoat);
		}
		if (this.followingType == "Breakable")
		{
			this.TargetReached();
			if (this.inCombat && Records.x.turnBased)
			{
				this.actionPicked = true;
			}
			Links.x.gameplay.BreakableFinished(this.followingBreakable, this);
		}
		if (this.followingType == "Chest")
		{
			this.TargetReached();
			if (this.inCombat && Records.x.turnBased)
			{
				this.actionPicked = true;
			}
			Links.x.gameplay.ChestFinished(this.followingChest, this);
		}
		if (this.followingType == "Door")
		{
			this.TargetReached();
			if (this.inCombat && Records.x.turnBased)
			{
				this.actionPicked = true;
			}
			Links.x.gameplay.DoorFinished(this.followingDoor, this);
		}
		if (this.followingType == "Puzzle")
		{
			this.TargetReached();
			if (this.inCombat && Records.x.turnBased)
			{
				this.actionPicked = true;
			}
			Links.x.gameplay.PuzzleFinished(this.followingInteractive, this);
		}
		if (this.followingCharacter || this.followingItem)
		{
			Quaternion quaternion = Quaternion.Euler(this.vectorZero);
			if (this.followingItem)
			{
				quaternion = Quaternion.LookRotation(this.followingItem.tr.position - this.tr.position);
			}
			else if (this.followingCharacter.transform.position != this.tr.position)
			{
				quaternion = Quaternion.LookRotation(this.followingCharacter.tr.position - this.tr.position);
			}
			this.rot = quaternion;
			Vector3 eulerAngles = this.rot.eulerAngles;
			eulerAngles.z = 0f;
			eulerAngles.x = 0f;
			this.rot = Quaternion.Euler(eulerAngles);
		}
		this.ClearMoveTargets();
	}

	// Token: 0x06000396 RID: 918 RVA: 0x00054248 File Offset: 0x00052448
	public void ClearMoveTargets()
	{
		if (Records.x.astarDebugging && !this.npc)
		{
			Debug.Log(((this != null) ? this.ToString() : null) + " clearing targets");
		}
		this.followingCharacter = null;
		if (this.followingItem)
		{
			this.followingItem.StopMovingTo();
		}
		this.followingItem = null;
		this.followingType = "";
		this.followingNode = null;
		this.followingInteractive = null;
		this.followingBreakable = null;
		this.followingChest = null;
		this.followingDoor = null;
		this.followingBoat = null;
		this.followingExit = null;
		this.followingTime = 0f;
		if (this.pathToCharacterCoroutine != null)
		{
			base.StopCoroutine(this.pathToCharacterCoroutine);
			this.pathToCharacterCoroutine = null;
		}
		if (this.party)
		{
			this.waitingForNewPath = false;
			this.vectorPath.Clear();
			this.nodePath.Clear();
			this.nodeActions.Clear();
			if (!this.npc && !this.isBoro && this.waypoint)
			{
				this.waypoint.transform.position = Links.x.gameplay.farPosition;
				if (this.waypointAnimator.enabled)
				{
					this.waypointAnimator.enabled = false;
				}
			}
			if (this.sphere)
			{
				this.sphere.transform.position = this.tr.position;
			}
			this.waitingForPath = 0;
			this.savedPathTarget = null;
		}
	}

	// Token: 0x06000397 RID: 919 RVA: 0x000543CC File Offset: 0x000525CC
	public float InteractionDistanceCheck(string moveType)
	{
		float num = 4f;
		if (moveType == "Dialogue")
		{
			num = Links.x.fellowship.dialogueMaxDistance * Links.x.fellowship.dialogueMaxDistance;
		}
		if (moveType == "DialogueLong")
		{
			num = 100f;
		}
		if (moveType == "Searching")
		{
			float num2 = 15f;
			num = num2 * num2;
		}
		if (moveType.Contains("Charm"))
		{
			float num3 = 10f;
			num = num3 * num3;
		}
		if (moveType == "Item")
		{
			float num4 = 4f;
			num = num4 * num4;
		}
		if (moveType == "Boat")
		{
			float num5 = 20f;
			num = num5 * num5;
		}
		if (moveType == "Exit")
		{
			float num6 = 3f;
			if (this.followingExit.mapExit.exitTo != MapExit.exitToNames.Interiors && this.followingExit.mapExit.exitTo != MapExit.exitToNames.Exterior)
			{
				num6 = 4f;
			}
			num = num6 * num6;
		}
		if (moveType == "Breakable")
		{
			float num7 = 4f;
			if (this.followingBreakable.resourceLocation >= 0 && (this.followingBreakable.breakable.component == Breakable.ComponentTypes.Berry || this.followingBreakable.breakable.component == Breakable.ComponentTypes.Rock))
			{
				num7 = 6f;
			}
			num = num7 * num7;
		}
		if (moveType == "Puzzle")
		{
			float num8 = 6f;
			num = num8 * num8;
		}
		if (moveType == "Chest")
		{
			float num9 = 4f;
			num = num9 * num9;
		}
		if (moveType == "Door")
		{
			float num10 = 4f;
			num = num10 * num10;
		}
		return num;
	}

	// Token: 0x06000398 RID: 920 RVA: 0x00054548 File Offset: 0x00052748
	public void StartGetPathToTarget(GraphNode moveToNode, Character moveToCharacter, global::Item moveToItem, BreakableActions moveToBreakable, ChestActions moveToChest, DoorActions moveToDoor, PuzzleActions moveToInteractive, Boat moveToBoat, Character partyCharacter, MapExitActions moveToExit, bool unblockPath, bool showFeed, bool moveWithoutPoint, string moveType, bool distanceCheckOnly)
	{
		if (this.hasActions && this.actions.cannotInterrupt)
		{
			this.actions.TryingToInterruptInventoryWait();
			return;
		}
		if (Records.x.astarDebugging && this.moveNode != null)
		{
			Debug.Log(((this != null) ? this.ToString() : null) + " is making target path for: " + ((Vector3)moveToNode.position).ToString());
		}
		if (!Links.x.gaia.sceneLoaded || moveToNode == null)
		{
			return;
		}
		if (partyCharacter.node == null)
		{
			partyCharacter.FindCurrentNode(false);
		}
		if (partyCharacter.node == null)
		{
			return;
		}
		if (moveToCharacter)
		{
			if (moveToCharacter.dead || (moveToCharacter.stunned && !Records.x.kill))
			{
				this.ClearMoveTargets();
				return;
			}
			if (moveToCharacter.node == null)
			{
				this.ClearMoveTargets();
				return;
			}
		}
		if (moveType == "Searching" && this.stats.formationGroup == 0)
		{
			return;
		}
		if (this.npc && this.inCircle)
		{
			return;
		}
		if (this.followingTime == 0f)
		{
			this.followingTime = Time.timeSinceLevelLoad;
		}
		else if (Time.timeSinceLevelLoad > this.followingTime + 10f)
		{
			this.ClearMoveTargets();
			return;
		}
		this.followingCharacter = moveToCharacter;
		this.followingType = moveType;
		this.followingNode = moveToNode;
		if (this.followingItem && this.followingItem != moveToItem)
		{
			this.followingItem.StopMovingTo();
			if (moveToItem)
			{
				moveToItem.MovingTo();
			}
		}
		this.followingItem = moveToItem;
		this.followingBreakable = moveToBreakable;
		this.followingChest = moveToChest;
		this.followingDoor = moveToDoor;
		this.followingInteractive = moveToInteractive;
		this.followingBoat = moveToBoat;
		this.followingExit = moveToExit;
		if (Records.x.astarDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				(this != null) ? this.ToString() : null,
				" is making target path for: ",
				moveType,
				" distance only ",
				distanceCheckOnly.ToString(),
				" move node: ",
				(moveToNode != null) ? moveToNode.ToString() : null,
				" for character: ",
				(moveToCharacter != null) ? moveToCharacter.ToString() : null
			}));
		}
		if (this.pathToCharacterCoroutine == null && !this.doingAction && this.followingType != "")
		{
			this.pathToCharacterCoroutine = this.GetPathToTarget(moveToNode, moveToCharacter, moveToItem, moveToBreakable, moveToChest, moveToDoor, moveToInteractive, moveToBoat, partyCharacter, moveToExit, unblockPath, showFeed, moveWithoutPoint, moveType, 0f);
			base.StartCoroutine(this.pathToCharacterCoroutine);
			this.waitForPathToCharacter = false;
			return;
		}
		this.waitForPathToCharacter = true;
	}

	// Token: 0x06000399 RID: 921 RVA: 0x000547F0 File Offset: 0x000529F0
	private IEnumerator GetPathToTarget(GraphNode moveToNode, Character moveToCharacter, global::Item moveToItem, BreakableActions moveToBreakable, ChestActions moveToChest, DoorActions moveToDoor, PuzzleActions moveToInteractive, Boat moveToBoat, Character partyCharacter, MapExitActions moveToExit, bool unblockPath, bool showFeed, bool moveWithoutPoint, string moveType, float maxDistance)
	{
		if (Records.x.paused)
		{
			yield return null;
		}
		float num = ((Vector3)moveToNode.position - (Vector3)partyCharacter.node.position).sqrMagnitude;
		float num2 = 100f;
		Vector3 realPosition = (Vector3)moveToNode.position;
		float maxY = 2.5f;
		if (moveType.Contains("Item"))
		{
			moveToNode = this.NearNode(moveToItem.transform.position, false, 0, 2, 0);
			Vector3 vector = (Vector3)moveToNode.position;
			Vector3 vector2 = this.NodePosition();
			num = (vector - new Vector3(vector2.x, vector.y, vector2.z)).sqrMagnitude;
			num2 = (moveToItem.tr.position - new Vector3(this.tr.position.x, moveToItem.tr.position.y, this.tr.position.z)).sqrMagnitude;
			realPosition = moveToItem.tr.position;
			maxY = 4f;
		}
		if (moveType.Contains("Attacking") || moveType.Contains("Dialogue") || moveType.Contains("Charm"))
		{
			num = ((Vector3)moveToCharacter.node.position - (Vector3)partyCharacter.node.position).sqrMagnitude;
			num2 = (moveToCharacter.tr.position - this.tr.position).sqrMagnitude;
			realPosition = moveToCharacter.tr.position;
			maxY = 4f;
		}
		if (moveToBreakable)
		{
			num2 = (moveToBreakable.gameObject.transform.position - this.tr.position).sqrMagnitude;
			realPosition = moveToBreakable.gameObject.transform.position;
		}
		if (moveToChest)
		{
			num2 = (moveToChest.gameObject.transform.position - this.tr.position).sqrMagnitude;
			realPosition = moveToChest.gameObject.transform.position;
		}
		if (moveToDoor)
		{
			num2 = (moveToDoor.lockColliderPosition - this.tr.position).sqrMagnitude;
			realPosition = moveToDoor.lockColliderPosition;
		}
		if (moveToInteractive)
		{
			num2 = (moveToInteractive.gameObject.transform.position - this.tr.position).sqrMagnitude;
			realPosition = moveToInteractive.gameObject.transform.position;
			if (moveToInteractive.id.Contains("Birch") && Links.x.diorama.sceneName.Contains("C6"))
			{
				realPosition = (Vector3)moveToNode.position;
			}
			maxY = 4f;
		}
		if (moveToExit && moveToExit.mapExit.doorPoint != Vector3.zero)
		{
			num2 = ((Vector3)moveToNode.position - this.tr.position).sqrMagnitude;
		}
		maxDistance = this.InteractionDistanceCheck(moveType);
		if (moveType == "Dialogue" && moveToCharacter && moveToCharacter.stats.xmlName.Contains("StoreKeep"))
		{
			maxDistance = this.InteractionDistanceCheck("DialogueLong");
		}
		if (Records.x.astarDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				"Distance is ",
				num.ToString(),
				" real dist is ",
				num2.ToString(),
				" max distance is ",
				maxDistance.ToString(),
				" ",
				Vector3.Distance(this.NodePosition(), (Vector3)moveToNode.position).ToString(),
				" node pos ",
				this.NodePosition().ToString(),
				" following pos ",
				((Vector3)moveToNode.position).ToString()
			}));
		}
		if ((num <= maxDistance || num2 < maxDistance) && moveType != "Searching" && !Records.x.paused)
		{
			if (this.followingExit)
			{
				this.alwaysTurn = true;
				this.SetRotation(Quaternion.LookRotation(this.followingExit.transform.position - this.tr.position), false, false);
				if (this.turning)
				{
					yield return new WaitForSeconds(0.25f);
				}
			}
			this.FinishMoveTo();
		}
		else
		{
			if (moveToCharacter && moveType != "Searching" && moveToCharacter.node != null)
			{
				this.followingNode = moveToCharacter.node;
				moveToNode = this.followingNode;
			}
			if (moveType == "Boat")
			{
				this.followingNode = AstarPath.active.GetNearest(moveToBoat.transform.position, this.nodeConstraint).node;
				moveToNode = this.followingNode;
			}
			GraphNode foundNode = null;
			if (this.delayPath > 0f)
			{
				yield return new WaitForSeconds(this.delayPath);
				this.delayPath = 0f;
			}
			float minDistance = 0f;
			if (moveType == "Door")
			{
				minDistance = 0.48999998f;
			}
			bool stop = false;
			bool onTable = false;
			bool canCheckAllAngles = false;
			Vector3 forwAngle = Vector3.zero;
			Vector3 rightAngle = Vector3.zero;
			(Vector3)moveToNode.position;
			if (this.followingType == "Item" && Mathf.Abs(realPosition.y - this.tr.position.y) > 1.25f)
			{
				forwAngle = Quaternion.LookRotation(realPosition - new Vector3(this.tr.position.x, realPosition.y, this.tr.position.z)) * Vector3.forward;
				RaycastHit raycastHit;
				if (Physics.Raycast(this.tr.position + new Vector3(0f, 0.5f, 0f), forwAngle, out raycastHit, 30f, Links.x.sightBlockers) && raycastHit.normal.y <= 0.5f)
				{
					onTable = true;
				}
				canCheckAllAngles = true;
				rightAngle = Quaternion.LookRotation(realPosition - new Vector3(this.tr.position.x, realPosition.y, this.tr.position.z)) * Vector3.right;
			}
			if (this.followingType == "Breakable" && moveToBreakable.resourceLocation >= 0)
			{
				canCheckAllAngles = true;
				RaycastHit raycastHit2;
				Physics.Raycast(moveToBreakable.gameObject.transform.position + new Vector3(0f, 10f, 0f), Vector3.up * -1f, out raycastHit2, 30f, 4194433);
				forwAngle = Quaternion.LookRotation(realPosition - new Vector3(this.tr.position.x, realPosition.y, this.tr.position.z)) * Vector3.forward;
				rightAngle = Quaternion.LookRotation(realPosition - new Vector3(this.tr.position.x, realPosition.y, this.tr.position.z)) * Vector3.right;
			}
			bool testSpread = false;
			Vector3 stayPoint = Vector3.zero;
			if (this.followingType == "Searching" && (this.stats.defendMainInCombat || this.stats.stayNearPatrol))
			{
				if (this.stats.defendMainInCombat && this.stats.defendingCharacter && this.stats.defendingCharacter.IsSentient())
				{
					stayPoint = this.stats.defendingCharacter.currentPosition;
					testSpread = true;
				}
				if (this.stats.stayNearPatrol)
				{
					stayPoint = (Vector3)this.stats.stayNearPoint.position;
					testSpread = true;
				}
			}
			int num14;
			for (int i = 0; i < 8; i = num14 + 1)
			{
				if (i == 0 || (foundNode == null && canCheckAllAngles))
				{
					GraphNode checkNode = moveToNode;
					GraphNode offsetNode = null;
					bool flag = false;
					if (canCheckAllAngles)
					{
						offsetNode = null;
						float num3 = 2.5f;
						Vector3 vector3 = Vector3.zero;
						if (i == 0)
						{
							vector3 = realPosition + forwAngle * -1f * num3;
						}
						if (i == 7)
						{
							vector3 = realPosition + forwAngle * num3;
						}
						if (i == 4)
						{
							vector3 = realPosition + rightAngle * -1f * num3;
						}
						if (i == 3)
						{
							vector3 = realPosition + rightAngle * num3;
						}
						if (i == 5)
						{
							vector3 = realPosition + forwAngle * num3 + rightAngle * num3;
						}
						if (i == 1)
						{
							vector3 = realPosition + forwAngle * -1f * num3 + rightAngle * num3;
						}
						if (i == 6)
						{
							vector3 = realPosition + forwAngle * num3 + rightAngle * -1f * num3;
						}
						if (i == 2)
						{
							vector3 = realPosition + forwAngle * -1f * num3 + rightAngle * -1f * num3;
						}
						if (onTable)
						{
							vector3.y = this.tr.position.y;
						}
						offsetNode = this.NearNode(vector3, false, 0, 2, 0);
						if (offsetNode != null)
						{
							checkNode = offsetNode;
						}
						else
						{
							flag = true;
						}
					}
					if (!flag && Links.x.gaia.pathfindingReady && Links.x.gaia.sceneLoaded && this.followingType != "")
					{
						for (int j = 0; j < 2; j = num14 + 1)
						{
							if (foundNode == null && this.followingType != "" && Links.x.gaia.pathfindingReady)
							{
								GraphNode graphNode = checkNode;
								if (j == 1)
								{
									graphNode = this.node;
								}
								ConstantPath constPath = ConstantPath.ConstructFast(graphNode, Records.x.GetConstantPathRadius(4), null);
								this.interactConstraint.constrainWalkability = false;
								this.interactConstraint.walkable = true;
								this.interactConstraint.constrainTags = false;
								this.interactConstraint.passID = 0;
								this.interactConstraint.passID2 = 0;
								this.interactConstraint.checkConnections = 0;
								this.interactConstraint.constrainToEnvironment = 1;
								if (this.ghost && !this.ghostVanishing)
								{
									this.interactConstraint.constrainToEnvironment = 0;
								}
								if ((this.sailing && this.boatNavigator) || this.movesOnWater)
								{
									this.interactConstraint.constrainToEnvironment = 2;
								}
								this.interactConstraint.constrainToArea = -1;
								this.interactConstraint.checkCircleID = 0;
								constPath.nnConstraint = this.interactConstraint;
								int x = 0;
								Vector3 zero = Vector3.zero;
								Vector3 thisPosition = this.tr.position;
								(Vector3)checkNode.position;
								Vector3 vector4 = Vector3.zero;
								int num4;
								if (Links.x.gaia.pathfindingReady && Links.x.gaia.sceneLoaded)
								{
									AstarPath.StartPath(constPath, false);
									yield return base.StartCoroutine(constPath.WaitForPath());
									constPath.Claim(this);
									this.allNodes = constPath.allNodes;
									x = this.allNodes.Count;
									num4 = x - 1;
									if (!this.hasActions && (this.pushCount < Links.x.fellowship.pushCountMax || this.mainSelected))
									{
										this.interactConstraint.constrainTags = false;
									}
									else
									{
										this.interactConstraint.constrainTags = true;
									}
									if (!this.mainSelected)
									{
										this.interactConstraint.checkCircleID = this.CheckCircleID();
									}
									this.interactConstraint.passID = partyCharacter.nodeMovingID;
									this.interactConstraint.passID2 = partyCharacter.nodeStationaryID;
									this.interactConstraint.constrainWalkability = true;
									this.interactConstraint.walkable = true;
									if (this.npc)
									{
										this.interactConstraint.constrainPenalty = 1;
									}
									else
									{
										this.interactConstraint.constrainPenalty = 2;
									}
									this.interactConstraint.constrainToEnvironment = 1;
									if (this.ghost && !this.ghostVanishing)
									{
										this.interactConstraint.constrainToEnvironment = 0;
									}
									if (this.sailing && this.boatNavigator)
									{
										this.interactConstraint.constrainToEnvironment = 2;
										this.interactConstraint.passID = this.boat.nodeMovingID;
										this.interactConstraint.passID2 = this.boat.nodeStationaryID;
										this.interactConstraint.checkConnections = this.boat.ConnectionNumber();
									}
									else
									{
										this.interactConstraint.checkConnections = partyCharacter.ConnectionNumber();
									}
									if (this.movesOnWater)
									{
										this.interactConstraint.constrainToEnvironment = 2;
									}
									this.interactConstraint.constrainToArea = (int)this.node.Area;
									this.suitableNodes.Clear();
									this.bestNodes.Clear();
									this.nearNodes.Clear();
									float num5 = 225f;
									for (int l = 0; l < x; l++)
									{
										GraphNode graphNode2 = this.allNodes[l];
										if ((((Vector3)graphNode2.position - realPosition).sqrMagnitude < num5 || testSpread) && this.interactConstraint.Suitable(graphNode2))
										{
											if (!testSpread)
											{
												this.suitableNodes.Add(graphNode2);
											}
											else if (((Vector3)graphNode2.position - stayPoint).sqrMagnitude < 100f)
											{
												this.suitableNodes.Add(graphNode2);
											}
										}
									}
									constPath.Release(this, false);
								}
								x = this.suitableNodes.Count;
								num4 = x - 1;
								this.used.Clear();
								for (int m = 0; m < x; m++)
								{
									this.used.Add(false);
								}
								Vector3 vector5 = Quaternion.LookRotation(realPosition - new Vector3(this.tr.position.x, realPosition.y, this.tr.position.z)) * Vector3.forward;
								Vector3 vector6 = Vector3.zero;
								for (int n = 0; n < x; n++)
								{
									if (!stop)
									{
										float num6 = 100000f;
										int num7 = -1;
										for (int num8 = num4; num8 >= 0; num8--)
										{
											if (!stop && !this.used[num8])
											{
												vector4 = (Vector3)this.suitableNodes[num8].position;
												float sqrMagnitude = this.SubtractVectors(new Vector3(realPosition.x, vector4.y, realPosition.z), vector4).sqrMagnitude;
												bool flag2;
												if (onTable)
												{
													if (vector4.y > thisPosition.y + 1.25f)
													{
													}
													flag2 = true;
												}
												else
												{
													flag2 = true;
													if (Mathf.Abs(vector4.y - thisPosition.y) > maxY)
													{
														flag2 = false;
													}
												}
												if (testSpread || (sqrMagnitude < num6 && sqrMagnitude < maxDistance && sqrMagnitude > minDistance && flag2))
												{
													num7 = num8;
													num6 = sqrMagnitude;
												}
											}
										}
										if (num7 > -1)
										{
											this.used[num7] = true;
											this.bestNodes.Add(this.suitableNodes[num7]);
										}
										if (this.followingType == "")
										{
											stop = true;
										}
									}
								}
								x = this.bestNodes.Count;
								num4 = x - 1;
								this.used.Clear();
								for (int num9 = 0; num9 < x; num9++)
								{
									this.used.Add(false);
								}
								if (moveType != "Exit")
								{
									for (int num10 = 0; num10 < x; num10++)
									{
										float num6 = -100f;
										int num7 = -1;
										for (int num11 = 0; num11 < x; num11++)
										{
											if (!this.used[num11])
											{
												vector4 = (Vector3)this.bestNodes[num11].position;
												vector6 = Vector3.Normalize(realPosition - new Vector3(vector4.x, realPosition.y, vector4.z));
												float num12 = Vector3.Dot(vector5, vector6);
												if (num12 > num6)
												{
													num7 = num11;
													num6 = num12;
												}
											}
										}
										if (num7 > -1)
										{
											this.used[num7] = true;
											this.nearNodes.Add(this.bestNodes[num7]);
										}
										if (this.followingType == "")
										{
											stop = true;
										}
									}
								}
								else
								{
									for (int num13 = 0; num13 < x; num13++)
									{
										this.nearNodes.Add(this.bestNodes[num13]);
									}
								}
								if (Records.x.astarDebugging)
								{
									Debug.Log(string.Concat(new string[]
									{
										this.allNodes.Count.ToString(),
										" ",
										this.suitableNodes.Count.ToString(),
										" ",
										this.bestNodes.Count.ToString(),
										" ",
										this.nearNodes.Count.ToString(),
										" ",
										stop.ToString()
									}));
								}
								if (this.followingType == "Exit")
								{
									this.nearNodes.Insert(0, moveToNode);
								}
								x = this.nearNodes.Count;
								bool flag3 = this.nearNodes.Count != 0 && !stop;
								if (flag3)
								{
									if (x > 0)
									{
										bool foundPath = false;
										for (int k = 0; k < x; k = num14 + 1)
										{
											if (!foundPath && !stop)
											{
												GraphNode destination = this.nearNodes[k];
												if (this.node != null && destination != null)
												{
													ABPath p = ABPath.ConstructFast(this.node, destination, null);
													p.nnConstraint = this.interactConstraint;
													AstarPath.StartPath(p, false);
													yield return base.StartCoroutine(p.WaitForPath());
													p.Claim(this);
													if (!p.error)
													{
														foundPath = true;
														foundNode = destination;
													}
													p.Release(this, false);
													p = null;
												}
												destination = null;
											}
											if (this.followingType == "")
											{
												stop = true;
											}
											num14 = k;
										}
									}
									if (foundNode != null)
									{
										if (canCheckAllAngles)
										{
											this.followingNode = offsetNode;
											moveToNode = offsetNode;
											break;
										}
										break;
									}
								}
								constPath = null;
								thisPosition = default(Vector3);
							}
							num14 = j;
						}
					}
					checkNode = null;
					offsetNode = null;
				}
				num14 = i;
			}
			if (canCheckAllAngles)
			{
				num = ((Vector3)moveToNode.position - (Vector3)partyCharacter.node.position).sqrMagnitude;
				num2 = (realPosition - partyCharacter.tr.position).sqrMagnitude;
				maxDistance = this.InteractionDistanceCheck(moveType);
				if (Records.x.astarDebugging)
				{
					Debug.Log(string.Concat(new string[]
					{
						"Item check final distance is ",
						num.ToString(),
						" max distance is ",
						maxDistance.ToString(),
						" ",
						Vector3.Distance(this.NodePosition(), (Vector3)moveToNode.position).ToString(),
						" node pos ",
						this.NodePosition().ToString(),
						" following pos ",
						((Vector3)moveToNode.position).ToString()
					}));
				}
				if (num <= maxDistance || num2 <= maxDistance)
				{
					stop = true;
					this.FinishMoveTo();
				}
			}
			if (!Links.x.gaia.pathfindingReady || !Links.x.gaia.sceneLoaded)
			{
				stop = true;
			}
			if (Records.x.astarDebugging && !stop)
			{
				if (foundNode != null)
				{
					string[] array = new string[8];
					array[0] = "Interactive path found for ";
					array[1] = ((this != null) ? this.ToString() : null);
					array[2] = " ";
					array[3] = ((Vector3)foundNode.position).ToString();
					array[4] = " ";
					array[5] = stop.ToString();
					array[6] = " ";
					int num15 = 7;
					Character character = this.followingCharacter;
					array[num15] = ((character != null) ? character.ToString() : null);
					Debug.Log(string.Concat(array));
				}
				else
				{
					Debug.Log(string.Concat(new string[]
					{
						"Interactive path NOT found for ",
						(this != null) ? this.ToString() : null,
						" node counts: ",
						this.suitableNodes.Count.ToString(),
						" ",
						this.bestNodes.Count.ToString(),
						" ",
						this.nearNodes.Count.ToString()
					}));
					if (moveToNode != null)
					{
						Debug.Log(((Vector3)moveToNode.position).ToString() + " move to node " + ((this != null) ? this.ToString() : null));
						if (Records.x.editor)
						{
							this.CreateSphere((Vector3)moveToNode.position, 1f);
						}
					}
				}
			}
			if (!stop)
			{
				if (foundNode != null && this.followingType != "")
				{
					if (!this.npc)
					{
						if (moveType == "Item" || moveType == "Breakable" || moveType == "Chest" || moveType == "Puzzle" || moveType == "Door" || moveType == "Exit" || moveType == "Boat" || moveType.Contains("Charm"))
						{
							this.ClearPathUpdates();
							if (!this.npc && this.hasActions)
							{
								if (this.actions)
								{
									this.actions.ClearSelectedActionRealTime();
								}
								if (this.actions)
								{
									this.actions.Interrupt();
								}
								if (this.actions)
								{
									this.actions.CheckIfRunningAI();
								}
							}
							if (this.party || (this.boatNavigator && this.sailing && this.isBoro))
							{
								this.showWaypoint = true;
							}
							if (Vector3.Distance((Vector3)foundNode.position, this.tr.position) < 0.75f)
							{
								this.FinishMoveTo();
							}
							else
							{
								this.MakePath(foundNode, 100, false, false, true);
							}
							this.movingToPatrolNode = false;
						}
						else
						{
							Links.x.fellowship.MakeWaypoints(Vector3.zero, foundNode, false, false);
						}
					}
					else
					{
						this.ClearPathUpdates();
						if (this.searching && moveType == "Searching" && this.animID == 24)
						{
							yield return new WaitForSeconds(1f);
						}
						this.MakePath(foundNode, 100, false, false, true);
						this.movingToPatrolNode = false;
					}
				}
				else
				{
					this.selectedBeforeDoor = false;
					if (!this.npc && this.followingType != "")
					{
						this.ClearPathUpdates();
						this.ClearMoveTargets();
						Links.x.gameFeed.ShowNotice("Cannot reach");
					}
					else if (moveWithoutPoint && !stop)
					{
						this.ClearPathUpdates();
						if (!this.npc && this.hasActions)
						{
							this.actions.ClearSelectedActionRealTime();
							this.actions.Interrupt();
							this.actions.CheckIfRunningAI();
						}
						if (this.party || (this.boatNavigator && this.sailing && this.isBoro))
						{
							this.showWaypoint = true;
						}
						this.MakePath(moveToNode, 100, false, true, true);
						this.movingToPatrolNode = false;
					}
				}
			}
			foundNode = null;
			forwAngle = default(Vector3);
			rightAngle = default(Vector3);
			stayPoint = default(Vector3);
		}
		this.pathToCharacterCoroutine = null;
		yield break;
	}

	// Token: 0x0600039A RID: 922 RVA: 0x00054870 File Offset: 0x00052A70
	public void OnMovePathComplete()
	{
		int count = this.prepPath.Count;
		if (this.prepPath.Count > 0 && this.prepPath[this.prepPath.Count - 1] != null)
		{
			this.targetNode = this.prepPath[this.prepPath.Count - 1];
		}
		this.PrepPath(count, false);
		if (this.animID == 23)
		{
			this.animID = 0;
		}
	}

	// Token: 0x0600039B RID: 923 RVA: 0x000548E8 File Offset: 0x00052AE8
	public GraphNode GetPathNode(int num)
	{
		if (this.nodePath.Count == 0)
		{
			return this.node;
		}
		if (num < this.nodePath.Count)
		{
			return this.nodePath[num];
		}
		return this.nodePath[this.nodePath.Count - 1];
	}

	// Token: 0x0600039C RID: 924 RVA: 0x0005493C File Offset: 0x00052B3C
	public void DoFootsteps()
	{
		bool flag = false;
		if (!this.npc || (this.npc && this.hostility == 2) || (this.npc && this.attackingUntilBribe))
		{
			flag = true;
		}
		if (this.isBoro && !this.sailing)
		{
			flag = false;
		}
		if (this.movesOnWater)
		{
			this.PlaySplash();
			MasterAudio.PlaySound3DAtVector3AndForget("Splash", this.tr.position, Random.Range(0.4f, 0.5f), new float?(Random.Range(0.95f, 1f)), 0f, "", null);
		}
		if (flag)
		{
			if (this.sailing && this.boatNavigator)
			{
				this.boat.AddSounds();
			}
			else
			{
				Links.x.sensory.AddFootstep(this);
			}
			if (this.npc)
			{
				bool flag2 = this.inCombat;
			}
		}
		this.GetTerrain();
		if (this.party || this.visible == 1)
		{
			this.stats.CheckTerrainAbilities(this.terrain);
		}
	}

	// Token: 0x0600039D RID: 925 RVA: 0x00054A4C File Offset: 0x00052C4C
	public void PlaySplash()
	{
		if (this.splash)
		{
			Vector3 position = this.tr.position;
			position.y = 20.2f;
			if (!this.splash.activeSelf)
			{
				this.splash.SetActive(true);
			}
			foreach (object obj in this.splash.transform)
			{
				((Transform)obj).gameObject.SetActive(true);
			}
			this.splash.transform.position = position;
		}
	}

	// Token: 0x0600039E RID: 926 RVA: 0x00054B00 File Offset: 0x00052D00
	public void GetTerrain()
	{
		RaycastHit raycastHit;
		if (!this.dead && !this.stunned && this.visible == 1 && Physics.Raycast(this.nodePoint, Links.x.rtsCamera.tr.forward, out raycastHit, 600f, 16777216))
		{
			Vector2 textureCoord = raycastHit.textureCoord;
			if (this.desiredGraph == 1)
			{
				textureCoord.x *= (float)Links.x.sensory.terrainTextureWidthInt;
				textureCoord.y *= (float)Links.x.sensory.terrainTextureHeightInt;
			}
			else
			{
				textureCoord.x *= (float)Links.x.sensory.terrainTextureWidthExt;
				textureCoord.y *= (float)Links.x.sensory.terrainTextureHeightExt;
			}
			string text = this.terrain;
			this.terrain = Links.x.sensory.GetPixelColor((int)textureCoord.x, (int)textureCoord.y, this.desiredGraph);
			if (this.mainSelected && Links.x.diorama.underground)
			{
				Color32 color = this.terrainColor;
				this.terrainColor = Links.x.sensory.GetPixelColorForUndergroundMap((int)textureCoord.x, (int)textureCoord.y);
				if (Links.x.sceneMap.undergroundMap)
				{
					Links.x.sceneMap.undergroundMap.ChangedArea(this.indoorID);
				}
			}
		}
	}

	// Token: 0x0600039F RID: 927 RVA: 0x00054C84 File Offset: 0x00052E84
	public GraphNode CastPoint()
	{
		if (this.boatNavigator && this.sailing)
		{
			return this.boat.node;
		}
		if (this.node == null)
		{
			return this.NearNode(this.tr.position, false, 0, -1, 0);
		}
		if (this.npc)
		{
			return this.node;
		}
		if (this.SubtractVectors(this.tr.position, (Vector3)this.node.position).sqrMagnitude > 6.25f)
		{
			return this.NearNode(this.tr.position, false, 0, 2, 0);
		}
		return this.node;
	}

	// Token: 0x060003A0 RID: 928 RVA: 0x00054D28 File Offset: 0x00052F28
	public void PrepPath(int pathLength, bool isCombatMove)
	{
		if (this.nodePath.Count > 0)
		{
			this.moveTurn = true;
		}
		this.blockedTime = 0f;
		int num = this.prepPath.Count;
		if (this.prepPath.Count > 0)
		{
			this.targetNode = this.prepPath[this.prepPath.Count - 1];
		}
		if (this.animID == 23)
		{
			this.animID = 0;
		}
		this.moveIndex = -1;
		this.nodePath.Clear();
		this.vectorPath.Clear();
		this.nodeActions.Clear();
		for (int i = 0; i < this.prepPath.Count; i++)
		{
			if (this.prepPath[i] != null)
			{
				this.nodePath.Add(this.prepPath[i]);
				this.vectorPath.Add(this.prepVectorPath[i]);
				this.nodeActions.Add("TileSwitch");
			}
		}
		num = this.nodePath.Count;
		if (this.nodePath.Count > 0 && this.nodePath[num - 1] != null)
		{
			this.targetNode = this.nodePath[num - 1];
		}
		if (this.party && this.raycastModifier && this.raycastModifier.enabled)
		{
			this.targetNode = this.NearNode(this.vectorPath[num - 1], false, 0, -1, 0);
		}
		if (!this.npc)
		{
			Links.x.fellowship.SetWaypoint();
		}
		if (!this.moveTurn && this.nodePath.Count > 0)
		{
			this.nextNode = this.nodePath[0];
		}
		if (Records.x.astarDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				"Prep path made for ",
				(this != null) ? this.ToString() : null,
				" node points ",
				this.nodePath.Count.ToString(),
				" ",
				this.tr.position.ToString()
			}));
		}
		if (this.nodePath.Count == 0)
		{
			this.vectorPath.Clear();
			this.nodePath.Clear();
			this.EndPath();
			if (this.fleeTime > 0f)
			{
				this.Flee(this.fleePoint, this.missing, 0f, 0f);
				return;
			}
		}
		else
		{
			if (this.fleeTime > 0f)
			{
				this.fleeing = true;
				if (Records.x.combat && this.radius < 3f)
				{
					this.ignoreNodeIDs = true;
				}
				this.CircleColor(true);
			}
			this.TurnEnter(false);
			if (this.isHitFlying && this.jumping && this.CanMove() && !this.pocketPaused)
			{
				this.Jumping();
			}
		}
	}

	// Token: 0x060003A1 RID: 929 RVA: 0x0005501C File Offset: 0x0005321C
	public void PlayIdle()
	{
		if (this.IsSentient())
		{
			if (this.animID != 6 && this.animID != 7 && this.animID != 33 && this.animID != 34 && this.animID != 8 && this.animID != 9 && this.animID != 23 && this.animID != 10 && this.animID != 23 && this.animID != 15 && this.animID != 16 && this.animID != 25)
			{
				this.PlayAnimation("Idle", Random.Range(0f, 1f));
				this.animator.SetBool("Idle", true);
				if (this.summoned)
				{
					this.SetAnimatorSpeed(1f);
				}
			}
			if (this.dodging)
			{
				this.PlayAnimation("Defend", 0f);
			}
			if (this.sailing)
			{
				this.NeedToUpdateSailingAnimator(false);
			}
		}
	}

	// Token: 0x060003A2 RID: 930 RVA: 0x00055120 File Offset: 0x00053320
	public void SetIdle(bool state)
	{
		if (state)
		{
			if (this.resting && !this.hasActions)
			{
				this.animator.SetBool("Idle", false);
				if (this.inCircle)
				{
					this.PlayAnimation("Fatigued", 0f);
				}
				else
				{
					this.PlayAnimation("Hit_down", 0f);
				}
			}
			else
			{
				if (this.animID != 0 && this.npc && !this.sailing)
				{
					this.animator.SetFloat("Combat Variation", this.GetAnimatorVariation(2));
					float num = this.GetAnimatorVariation(3);
					if (this.stats.hasCustomIdle && !this.hasActions)
					{
						num = 1f;
					}
					this.animator.SetFloat("Idle Variation", num);
				}
				this.animator.SetBool("Idle", true);
				if (this.IsSentient() && (this.animID == 23 || this.animID == 1))
				{
					this.animID = 0;
				}
			}
		}
		else
		{
			this.animator.SetBool("Idle", false);
		}
		this.SetAnimatorSpeed(1f);
	}

	// Token: 0x060003A3 RID: 931 RVA: 0x0005523C File Offset: 0x0005343C
	public void EarlyFinish(bool doMoveTurn)
	{
		if (this.jumping)
		{
			return;
		}
		this.MoveBackEmpty();
		this.StopEvading();
		this.nodePath.Clear();
		this.nodeActions.Clear();
		this.vectorPath.Clear();
		if (!this.npc && this.hasActions)
		{
			this.actions.ClearMoves();
		}
		this.moveIndex = -1;
		this.moveTurn = doMoveTurn;
		if (!this.waitingForNewPath && !this.boatNavigator && (this.animID == 23 || this.animID == 1))
		{
			this.animID = 0;
		}
		if (this.fleeing)
		{
			this.CheckFleeEnd();
			if (this.fleeing)
			{
				return;
			}
		}
		this.justMoved = true;
		this.timeSinceLastMove = Time.timeSinceLevelLoad;
		if (!this.moveTurn && !this.waitingForNewPath)
		{
			if (!this.boatNavigator)
			{
				this.SetIdle(true);
			}
			this.moving = false;
			this.moveNode = null;
			this.movePoint = this.vectorZero;
		}
		if (Records.x.astarDebugging && Links.x.gaia.sceneLoaded)
		{
			Debug.Log("Early finish " + ((this != null) ? this.ToString() : null));
		}
	}

	// Token: 0x060003A4 RID: 932 RVA: 0x0005536D File Offset: 0x0005356D
	public void StopMoving()
	{
		this.TargetReached();
	}

	// Token: 0x060003A5 RID: 933 RVA: 0x00055378 File Offset: 0x00053578
	public void TargetReached()
	{
		if (this.dead || this.stunned)
		{
			return;
		}
		if (this.jumping && !this.CanEndJump())
		{
			return;
		}
		this.MoveBackEmpty();
		this.animator.SetBool("Backward", false);
		this.StopEvading();
		if (this.sailing && this.boatNavigator)
		{
			this.prevNodePosition = this.boat.tr.position;
			this.boat.TargetReached();
		}
		else
		{
			this.prevNodePosition = this.tr.position;
			if (!this.waitingForNewPath)
			{
				if (this.IsMoveAnim())
				{
					this.SetIdle(true);
				}
				if (this.animID == 23 || this.animID == 1)
				{
					this.animID = 0;
				}
			}
		}
		if (!this.fleeing && !Records.x.removeControls && !this.inCircle && this.npc && !this.missing && !this.ambushing)
		{
			if (this.creatures)
			{
				if (this.creatures.deactivating)
				{
					this.ignoreNodeIDs = true;
				}
				else
				{
					this.ignoreNodeIDs = false;
				}
			}
			else
			{
				this.ignoreNodeIDs = false;
			}
		}
		if (Links.x.gaia.sceneLoaded)
		{
			this.timeSinceMoveEnded = Time.timeSinceLevelLoad + Random.Range(3f, 8f);
		}
		this.justMoved = true;
		this.timeSinceLastMove = Time.timeSinceLevelLoad;
		this.moving = false;
		this.movingOutOfWay = false;
		this.returnToPointTime = 0f;
		this.running = false;
		this.blockPathCount = 0;
		if (this.isHitFlying)
		{
			this.isHitFlying = false;
		}
		this.movingAreas = false;
		this.alwaysJump = false;
		this.charging = false;
		if (Records.x.astarDebugging && Links.x.gaia.sceneLoaded)
		{
			Debug.Log("Target reached " + ((this != null) ? this.ToString() : null) + " " + this.tr.position.ToString());
		}
		this.pathTries = 0;
		if (this.moveTurn)
		{
			this.stepReady = false;
			this.moveTurn = false;
			return;
		}
		this.movePoint = this.vectorZero;
		this.moveNode = null;
		this.stepReady = false;
		this.nodePath.Clear();
		this.vectorPath.Clear();
		this.nodeActions.Clear();
		if (!this.npc && Records.x.InCombat(false))
		{
			Links.x.combat.updateCircles = true;
		}
		if (this.hasActions && (this.followingType == "" || this.followingType.Contains("Attack")) && (!this.sailing || (this.sailing && this.npc)) && !this.jumpingPosition && this.waitingForPath != 1)
		{
			this.actions.CheckIfMoveComplete();
		}
		if (this.fleeing)
		{
			this.CheckFleeEnd();
			if (this.fleeing)
			{
				return;
			}
		}
		if (this.missing)
		{
			if (this.visible == 0)
			{
				this.Missing();
				return;
			}
			this.fleeing = true;
			Debug.Log("Flee " + ((this != null) ? this.ToString() : null));
		}
		if (!this.npc)
		{
			if (this.waypoint)
			{
				if ((this.tr.position - this.sphere.transform.position).sqrMagnitude < Records.x.nodeSize * Records.x.nodeSize || Records.x.dialogue || Records.x.removeControls)
				{
					this.savedPathTarget = null;
					this.sphere.transform.position = this.tr.position;
				}
				else if (!this.hasActions && !this.mainSelected && (this.tr.position - Links.x.main.tr.position).sqrMagnitude < 100f)
				{
					this.savedPathTarget = null;
					this.sphere.transform.position = this.tr.position;
				}
				this.waypoint.transform.position = Links.x.gameplay.farPosition;
				if (this.waypointAnimator.enabled)
				{
					this.waypointAnimator.enabled = false;
				}
			}
		}
		else
		{
			this.savedPathTarget = null;
		}
		if (this.movingToPatrolNode)
		{
			this.patrolNode++;
			this.movingToPatrolNode = false;
		}
		this.stepReady = false;
		this.tempStop = false;
		this.prepPath.Clear();
		this.moveNode = null;
		this.movePoint = this.vectorZero;
		this.targetNode = null;
		this.nextNode = null;
		this.moveIndex = -1;
		this.blockedTime = 0f;
		if (!this.inactive)
		{
			if (this.sailing && this.boatNavigator)
			{
				this.boat.SetNodeID(false, false);
			}
			else
			{
				this.ClaimNode(this.node, this.nodePoint, false);
			}
		}
		if (this.doTurn && !this.hasActions && !this.boatNavigator && this.endTurn != Vector3.zero)
		{
			this.SetRotation(Quaternion.Euler(this.endTurn), false, false);
		}
		if (this.fleeing && this.fleeingAroundPoint)
		{
			this.SetRotation(Quaternion.LookRotation((Vector3)this.fleePoint.position, this.tr.position), false, false);
		}
		if (this.lookTarget && !this.boatNavigator && !this.moving && !this.mainSelected)
		{
			if (this.hasActions || Records.x.removeControls)
			{
				this.justMoved = false;
				this.SetRotation(Quaternion.LookRotation(this.lookTarget.tr.position - this.tr.position), false, false);
				this.lookTarget = null;
			}
			else
			{
				this.lookTargetTime = Time.timeSinceLevelLoad;
			}
		}
		if (this.npc)
		{
			this.GetPatrolHoldTime(true);
		}
		if (this.boatNavigator)
		{
			this.boat.CheckInTile();
		}
		else
		{
			this.CheckInTile();
		}
		if (this.downed || ((!this.hasActions || this.inCircle) && this.resting))
		{
			if (this.resting && this.inCircle)
			{
				this.PlayAnimation("Fatigued", 0f);
			}
			else
			{
				this.PlayAnimation("Hit Down", 0f);
			}
		}
		if (this.followingType != "")
		{
			bool flag = Links.x.gameplay.CanScatterPartyToMakePath(this.followingType);
			if (this.npc || this.hasActions)
			{
				flag = false;
			}
			if (this.npc && this.followingType == "Searching" && this.GetLKPlayerBool(this.followingCharacter))
			{
				this.ClearMoveTargets();
				return;
			}
			this.StartGetPathToTarget(this.followingNode, this.followingCharacter, this.followingItem, this.followingBreakable, this.followingChest, this.followingDoor, this.followingInteractive, this.followingBoat, this, this.followingExit, flag, false, false, this.followingType, true);
		}
	}

	// Token: 0x060003A6 RID: 934 RVA: 0x00055AB4 File Offset: 0x00053CB4
	public bool ObstacleTest(Vector3 pos, Vector3 testFromPos, bool testFromTr)
	{
		pos.y += 1.5f;
		float num = this.radius * 0.25f;
		Vector3 forward = Vector3.forward;
		Quaternion quaternion = this.rot;
		Vector3 vector = forward;
		for (int i = 0; i < 6; i++)
		{
			vector.y += 60f;
			quaternion = Quaternion.Euler(new Vector3(0f, vector.y, 0f));
			if (Physics.Raycast(pos, quaternion * forward, num, Links.x.geometry))
			{
				return true;
			}
		}
		if (testFromTr)
		{
			testFromPos.y += 1.5f;
			if (Physics.Linecast(testFromPos, pos, Links.x.geometry))
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060003A7 RID: 935 RVA: 0x00055B78 File Offset: 0x00053D78
	public bool PointInNodes(Vector3 pt)
	{
		bool flag = false;
		Vector3 vector = this.NodePosition();
		float num = pt.x - vector.x;
		if (num < 0f)
		{
			num *= -1f;
		}
		if (num < Records.x.nodeSize / 2f + 0.1f)
		{
			float num2 = pt.z - vector.z;
			if (num2 < 0f)
			{
				num2 *= -1f;
			}
			if (num2 < Records.x.nodeSize / 2f + 0.1f)
			{
				flag = true;
			}
		}
		return flag;
	}

	// Token: 0x060003A8 RID: 936 RVA: 0x00055C00 File Offset: 0x00053E00
	public bool ConnectionIsParty(int x)
	{
		int count = this.gos.Count;
		for (int i = 0; i < count; i++)
		{
			Character character = this.gos[i];
			if (character.nodeStationaryID == x || character.nodeMovingID == x)
			{
				return !character.npc;
			}
		}
		return true;
	}

	// Token: 0x060003A9 RID: 937 RVA: 0x00055C54 File Offset: 0x00053E54
	public bool ConnectionIsStill(int x, out Character pushCharacter)
	{
		int count = this.gos.Count;
		pushCharacter = null;
		for (int i = 0; i < count; i++)
		{
			Character character = this.gos[i];
			if ((character.nodeStationaryID == x || character.nodeMovingID == x) && (character.moving || character.NodesCount() > 0))
			{
				if (character.npc && character.hasActions)
				{
					return false;
				}
				if (character.npc)
				{
					pushCharacter = character;
					return true;
				}
				if (!character.npc)
				{
					if (character.moving)
					{
						pushCharacter = character;
					}
					return true;
				}
			}
		}
		return true;
	}

	// Token: 0x060003AA RID: 938 RVA: 0x00055CE4 File Offset: 0x00053EE4
	public bool AllTilesFree(GraphNode pt, bool planning)
	{
		if (pt == null)
		{
			return true;
		}
		bool flag = false;
		if ((!Records.x.removeControls && this.missing) || (this.offMap || this.ghostVanishing || (Records.x.pocketPause && !this.pocketPaused && !flag)) || Links.x.combat.inRally || this.ambushing)
		{
			return true;
		}
		int num = 0;
		if (this.sailing && !this.boatNavigator)
		{
			return true;
		}
		if (this.ignoreNodeIDs)
		{
			return true;
		}
		if (this.charging)
		{
			return true;
		}
		int num2 = 1;
		if (this.sailing || this.movesOnWater)
		{
			num2 = 2;
		}
		int num3;
		if (this.boatNavigator)
		{
			num3 = pt.AllConnectionsFreeParty(this.boat.nodeMovingID, this.boat.nodeStationaryID, this.boat.ConnectionNumber(), num2);
		}
		else
		{
			num3 = pt.AllConnectionsFreeParty(this.nodeMovingID, this.nodeStationaryID, this.ConnectionNumber(), num2);
		}
		bool flag2;
		if (num3 == 0)
		{
			flag2 = true;
		}
		else
		{
			flag2 = false;
			num = num3;
		}
		if (!flag2)
		{
			if (!planning && !this.boatNavigator)
			{
				int count = this.gos.Count;
				int i = 0;
				while (i < count)
				{
					Character character = this.gos[i];
					if (character.nodeStationaryID == num || character.nodeMovingID == num)
					{
						if (character.NodesCount() == 0 && character.waitingForPath == 0 && character.blockedTime == 0f && character.nodeMovingID == num)
						{
							character.SetNodeID(true, false);
							if (Records.x.astarDebugging)
							{
								string[] array = new string[8];
								array[0] = "setting collision character's node id ";
								int num4 = 1;
								Character character2 = character;
								array[num4] = ((character2 != null) ? character2.ToString() : null);
								array[2] = " ";
								int num5 = 3;
								GraphNode graphNode = character.node;
								array[num5] = ((graphNode != null) ? graphNode.ToString() : null);
								array[4] = " ";
								array[5] = num.ToString();
								array[6] = " ";
								array[7] = ((this != null) ? this.ToString() : null);
								Debug.Log(string.Concat(array));
							}
						}
						if (!this.npc && !this.hasActions && !this.mainSelected)
						{
							bool flag3 = false;
							if (Links.x.main.moving)
							{
								if (character.moving)
								{
									flag3 = true;
								}
								if (this.NodesCount() > 1)
								{
									flag3 = true;
								}
							}
							else if ((this.currentPosition - Links.x.main.currentPosition).sqrMagnitude > 625f)
							{
								flag3 = true;
							}
							if (flag3)
							{
								return true;
							}
						}
						if (character.node == null)
						{
							pt.ID = 0;
							character.FindCurrentNode(false);
							return true;
						}
						this.collisionCharacter = character;
						break;
					}
					else
					{
						i++;
					}
				}
			}
			if (this.collisionCharacter && this.mainSelected && (!this.collisionCharacter.npc || this.movingAreas))
			{
				flag2 = true;
			}
		}
		return flag2;
	}

	// Token: 0x060003AB RID: 939 RVA: 0x00055FCC File Offset: 0x000541CC
	public Character GetNodeCharacter(int index)
	{
		int count = this.gos.Count;
		for (int i = 0; i < count; i++)
		{
			Character character = this.gos[i];
			if (character.nodeStationaryID == index || character.nodeMovingID == index)
			{
				return character;
			}
		}
		return null;
	}

	// Token: 0x060003AC RID: 940 RVA: 0x00056018 File Offset: 0x00054218
	public void CheckInTile()
	{
		if (!Links.x.gaia.sceneLoaded)
		{
			return;
		}
		if (this.inactive)
		{
			return;
		}
		if (this.isBoro && this.sailing)
		{
			return;
		}
		if (this.ghostVanishing || this.ambushing)
		{
			return;
		}
		if (Records.x.pocketPause)
		{
			return;
		}
		if (this.jumpingAreas || this.jumpingPosition)
		{
			return;
		}
		if (this.Pivoting())
		{
			return;
		}
		if (this.inAction || this.inRecovery || this.inQueuedAbility)
		{
			return;
		}
		if (this.mainSelected)
		{
			return;
		}
		if (this.ignoreRemoveControls)
		{
			return;
		}
		if (this.jumping || this.charging || Links.x.combat.inPocketAttack)
		{
			return;
		}
		if (Time.timeSinceLevelLoad < this.tileCheckUpdateTime + 0.25f)
		{
			return;
		}
		if (this.inCircle && this.npc && this.group.inSwarm)
		{
			return;
		}
		if (this.isHit || this.body.IsHit())
		{
			return;
		}
		if (this.waitingForPath == 1 || this.IsWalking())
		{
			return;
		}
		if (!this.npc && !this.hasActions && Links.x.main && Links.x.main.moving)
		{
			return;
		}
		this.tileCheckUpdateTime = Time.timeSinceLevelLoad;
		if (this.node != null && this.slideNode == null)
		{
			Vector3 vector = this.NodePosition();
			vector.y = this.tr.position.y;
			float sqrMagnitude = (vector - this.tr.position).sqrMagnitude;
			GraphNode graphNode = this.node;
			float num = Records.x.nodeSize * Records.x.nodeSize;
			if (this.radius > 1f)
			{
				num += 4f;
			}
			float num2 = 0.5625f;
			if (this.radius > 1f)
			{
				num2 = 2.25f;
			}
			float sqrMagnitude2 = (this.tr.position - Links.x.main.currentPosition).sqrMagnitude;
			bool flag = false;
			if (!this.moving && this.node.ID != this.nodeStationaryID && this.node.ID != this.nodeMovingID)
			{
				flag = true;
			}
			if ((sqrMagnitude > num || sqrMagnitude2 < 1f || this.node == Links.x.main.node || this.node == Links.x.main.mainNode2 || this.node == Links.x.main.mainNode3 || this.node == Links.x.main.mainNode4 || flag) && !this.moving && this.nodePath.Count == 0 && this.blockedTime == 0f && !this.waitingForNewPath)
			{
				bool flag2 = true;
				this.nodeConstraint.walkable = true;
				this.nodeConstraint.constrainWalkability = true;
				if (this.sailing)
				{
					this.nodeConstraint.checkCircleID = 0;
					this.nodeConstraint.constrainTags = false;
					this.nodeConstraint.passID = 0;
					this.nodeConstraint.passID2 = 0;
					this.nodeConstraint.constrainToEnvironment = 2;
				}
				else
				{
					this.nodeConstraint.constrainTags = true;
					if (this.ghostVanishing)
					{
						this.nodeConstraint.constrainTags = false;
					}
					this.nodeConstraint.passID = this.nodeStationaryID;
					this.nodeConstraint.passID2 = this.nodeMovingID;
					if (this.ghost && !this.ghostVanishing)
					{
						this.nodeConstraint.constrainToEnvironment = 0;
					}
					else
					{
						this.nodeConstraint.constrainToEnvironment = 1;
					}
					if (this.movesOnWater)
					{
						this.nodeConstraint.constrainToEnvironment = 2;
					}
					this.nodeConstraint.checkCircleID = 0;
				}
				this.nodeConstraint.checkConnections = this.ConnectionNumber();
				this.nodeConstraint.constrainToArea = -1;
				GraphNode graphNode2 = this.node.ClosestConnection(this.node, this.nodeStationaryID, this.nodeMovingID, 6f, this.tr.position, (int)this.radius, this.ConnectionNumber(), this.nodeConstraint, 0);
				if (graphNode2 != null)
				{
					vector = (Vector3)graphNode2.position;
					vector.y = this.tr.position.y;
					if ((vector - this.tr.position).sqrMagnitude < sqrMagnitude)
					{
						this.ClaimNode(graphNode2, (Vector3)graphNode2.position, false);
						flag2 = false;
					}
				}
				if (Records.x.astarDebugging && Records.x.editor && !this.sailing)
				{
					Debug.Log(string.Concat(new string[]
					{
						"Off tile ",
						(this != null) ? this.ToString() : null,
						" by ",
						Vector3.Distance((Vector3)graphNode.position, this.tr.position).ToString(),
						", new node off by ",
						Vector3.Distance(this.NodePosition(), this.tr.position).ToString(),
						",  needs tile: ",
						flag2.ToString()
					}));
				}
				if (flag2)
				{
					GraphNode graphNode3 = this.NearNode(this.tr.position, true, 0, -1, 0);
					if (graphNode3 != null)
					{
						this.ClaimNode(graphNode3, (Vector3)graphNode3.position, false);
					}
				}
				if (this.inCombat && !this.sailing && !this.mainSelected)
				{
					vector = this.NodePosition();
					vector.y = this.tr.position.y;
					if (!this.moving && ((vector - this.tr.position).sqrMagnitude > Records.x.nodeSize / 2f * (Records.x.nodeSize / 2f) || flag) && !this.mainSelected)
					{
						this.Slide(this.node, false);
						return;
					}
				}
			}
			else if (sqrMagnitude > num2 && !this.moving && this.nodePath.Count == 0 && this.blockedTime == 0f && !this.waitingForNewPath && !this.sailing && this.movePoint == Vector3.zero && this.rb.isKinematic && !this.mainSelected && !this.physicsMove && this.stats.Stuck() <= 0 && this.waitingForPath == 0)
			{
				bool flag3 = false;
				if (this.inCircle && this.ignoreNodeIDs)
				{
					flag3 = true;
				}
				if (!flag3)
				{
					this.Slide(this.node, false);
				}
			}
		}
	}

	// Token: 0x060003AD RID: 941 RVA: 0x00056708 File Offset: 0x00054908
	public void SlideTo(GraphNode slide)
	{
		if (this.boatNavigator || this.sailing || this.jumping)
		{
			this.slideNode = null;
			this.slideNodePosition = Vector3.zero;
			return;
		}
		if (this.moving)
		{
			this.ClearNodePath();
		}
		this.movingOutOfWayTime = Time.timeSinceLevelLoad;
		this.movingOutOfWay = true;
		this.slideNode = slide;
		this.slideNodePosition = (Vector3)slide.position;
		if (Records.x.editor)
		{
			Debug.Log(((this != null) ? this.ToString() : null) + " sliding " + ((Vector3)this.slideNode.position).ToString());
		}
		this.ttime = 0f;
		this.prevPoint = this.tr.position;
		this.prevNodePosition = this.tr.position;
		this.ClaimNode(this.slideNode, (Vector3)this.slideNode.position, false);
	}

	// Token: 0x060003AE RID: 942 RVA: 0x00056808 File Offset: 0x00054A08
	public void Slide(GraphNode n, bool actualSlide)
	{
		if (this.sailing)
		{
			return;
		}
		if (this.charging || this.evading || this.jumping || this.isHitFlying)
		{
			return;
		}
		bool flag = actualSlide;
		if (this.InAttack() && this.node.Walkable)
		{
			flag = false;
		}
		if (this.stats.Stuck() > 0 || this.stats.pinning || this.stats.pinned)
		{
			return;
		}
		if (flag)
		{
			if (Records.x.astarDebugging)
			{
				Debug.Log(((this != null) ? this.ToString() : null) + " sliding");
			}
			this.slideNode = n;
			this.slideNodePosition = (Vector3)n.position;
			if (Records.x.editor)
			{
				Debug.Log(((this != null) ? this.ToString() : null) + " sliding " + ((Vector3)this.slideNode.position).ToString());
			}
			this.ttime = 0f;
			this.prevPoint = this.tr.position;
			this.prevNodePosition = this.tr.position;
			this.PlayAnimation("Stop", 0f);
			return;
		}
		if (!this.InAttack() && this.NodesCount() == 0)
		{
			if (Records.x.astarDebugging)
			{
				Debug.Log(((this != null) ? this.ToString() : null) + " slide jump");
			}
			this.Jump(n, this.GetNodeCenter(n), false, false);
		}
	}

	// Token: 0x060003AF RID: 943 RVA: 0x00056994 File Offset: 0x00054B94
	public void ZeroPreviousNode()
	{
		if (this.lastNode != null && this.radius == 1f && this.lastNode != this.node && (this.lastNode.ID == this.nodeStationaryID || this.lastNode.ID == this.nodeMovingID) && this.lastNode != this.node)
		{
			this.lastNode.ID = 0;
			this.lastNode.Tag = 0U;
		}
		if (this.radius > 1f && this.lastNode != null && this.lastNode != this.node)
		{
			this.lastNode.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
			this.lastNode.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
		}
		this.lastNode = null;
		if (this.party)
		{
			if (this.mainNode2 != null)
			{
				this.mainNode2.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode2.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
			}
			if (this.mainNode3 != null)
			{
				this.mainNode3.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode3.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
			}
			if (this.mainNode4 != null)
			{
				this.mainNode4.SetFlowerConnections(0, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode4.SetFlowerConnections(0, this.nodeStationaryID, this.ConnectionNumber());
			}
			this.mainNode2 = null;
			this.mainNode3 = null;
			this.mainNode4 = null;
		}
	}

	// Token: 0x060003B0 RID: 944 RVA: 0x00056B32 File Offset: 0x00054D32
	public bool HasNode(GraphNode mouseNode)
	{
		return false;
	}

	// Token: 0x060003B1 RID: 945 RVA: 0x00056B35 File Offset: 0x00054D35
	public Vector3 NodePosition()
	{
		if (this.radius == 3f)
		{
			return this.node.QuadCenter();
		}
		return (Vector3)this.node.position;
	}

	// Token: 0x060003B2 RID: 946 RVA: 0x00056B60 File Offset: 0x00054D60
	public Vector3 GetNodeCenter(GraphNode n)
	{
		if (this.radius == 3f)
		{
			return n.QuadCenter();
		}
		return (Vector3)n.position;
	}

	// Token: 0x060003B3 RID: 947 RVA: 0x00056B84 File Offset: 0x00054D84
	public void ClaimNode(GraphNode curr, Vector3 pos, bool snap)
	{
		if (Links.x.gaia.noAstar)
		{
			return;
		}
		if (this.offMap)
		{
			return;
		}
		bool flag = false;
		if (this.outsideBounds)
		{
			this.nodePoint = this.tr.position;
		}
		else
		{
			if (curr == null && pos != this.vectorZero)
			{
				GraphNode graphNode = this.NearNode(pos, true, 0, -1, 0);
				if (graphNode != null)
				{
					if (this.node != graphNode)
					{
						flag = true;
					}
					this.node = graphNode;
					this.nodePoint = this.NodePosition();
				}
				else
				{
					this.RemoveLastNode(true);
					this.nodePoint = this.tr.position;
				}
			}
			if (curr == null && pos == this.vectorZero)
			{
				if (this.tr.position != this.vectorZero)
				{
					this.node = this.NearNode(this.tr.position, true, 0, -1, 0);
					if (this.node != null)
					{
						this.nodePoint = this.NodePosition();
						if (!this.stuckInPlace && this.stats.Stuck() == 0 && !this.sailing && (snap || this.moveOnTiles || (!this.moveOnTiles && !this.mainSelected)))
						{
							this.SetPosition(this.nodePoint, null);
						}
					}
					flag = true;
				}
				else
				{
					this.RemoveLastNode(true);
					this.nodePoint = this.tr.position;
				}
			}
			if (curr != null)
			{
				if (this.node != curr)
				{
					if (curr.GraphIndex == 1U)
					{
						this.GetIndoorID();
					}
					else
					{
						this.indoorID = "";
					}
					if (this.hasActions)
					{
						this.CheckForLeaveBehindTiles();
					}
					flag = true;
					if (this.body.sneaking)
					{
						this.CheckLights(false);
					}
					float num = 100f;
					if (this.running)
					{
						num = 49f;
					}
					if ((this.lastFatiguePosition - this.tr.position).sqrMagnitude > num && this.npc)
					{
						if (this.inCombat)
						{
							if (this.running)
							{
								this.stats.AddStamina(-3f);
							}
							else
							{
								this.stats.AddStamina(-1f);
							}
						}
						this.lastFatiguePosition = this.tr.position;
					}
				}
				this.node = curr;
				this.nodePoint = this.NodePosition();
			}
			if (flag && !this.moving)
			{
				Links.x.gameplay.CheckTileEffects(this, this.node, false);
			}
			if (this.node == null)
			{
				this.nodePoint = this.tr.position;
			}
			this.ZeroPreviousNode();
			if (this.mainSelected && this.node != null && this.radius <= 1f)
			{
				int num2 = 0;
				for (int i = 0; i < 4; i++)
				{
					float num3 = 2f;
					GraphNode graphNode2 = null;
					for (int j = 0; j < 8; j++)
					{
						GraphNode graphNode3 = this.node.ConnectionFromIndex(j);
						if (graphNode3 != null && graphNode3 != this.mainNode2 && graphNode3 != this.mainNode3 && graphNode3 != this.mainNode4)
						{
							float num4 = Vector3.Distance(this.tr.position, (Vector3)graphNode3.position);
							if (num4 < num3)
							{
								graphNode2 = graphNode3;
								num3 = num4;
							}
						}
					}
					if (graphNode2 == null)
					{
						break;
					}
					if (num2 == 0)
					{
						this.mainNode2 = graphNode2;
					}
					if (num2 == 1)
					{
						this.mainNode3 = graphNode2;
					}
					if (num2 == 2)
					{
						this.mainNode4 = graphNode2;
					}
					num2++;
				}
				this.GetIndoorID();
			}
			if (this.node != null)
			{
				this.SetNodeID(false, false);
				this.lastNode = this.node;
			}
			else
			{
				this.lastNode = null;
			}
		}
		this.CheckForPickup();
		if (this.party && this.IsWalking() && Links.x.diorama.InTown(this.tr.position) != this.inTown)
		{
			this.PlayAnimation("Walk", 0f);
		}
		this.heightAdd = this.characterHeight - 0.5f;
	}

	// Token: 0x060003B4 RID: 948 RVA: 0x00056F78 File Offset: 0x00055178
	public void CheckForLeaveBehindTiles()
	{
		if (this.npc && this.stats.leaveBehindTiles)
		{
			string text = "";
			if (this.stats.xmlName.Contains("Fish") && (this.IsWalking() || this.animID == 1) && this.animator.GetFloat("Combat Variation") == 1f)
			{
				text = "FishPoison";
			}
			if (text != "")
			{
				Library.Abilities abilityRow = Links.x.library.GetAbilityRow(text);
				TileEffects tileEffects = Links.x.tileEffects.AddComponent<TileEffects>();
				tileEffects.startNode = this.node;
				tileEffects.spellTarget = null;
				tileEffects.source = this;
				tileEffects.spellIndex = this.stats.SpellIndex(text);
				tileEffects.paganRow = Links.x.library.GetPaganRow(text);
				tileEffects.mainSkill = abilityRow._MainSkill;
				tileEffects.sourceLevel = (float)this.stats.level;
				tileEffects.Setup(abilityRow, null, this.actions, null, null, this);
			}
		}
	}

	// Token: 0x060003B5 RID: 949 RVA: 0x0005708C File Offset: 0x0005528C
	public void CheckForPickup()
	{
		Pickups pickups = Links.x.cellar.NodeHasPickup(this.node);
		if (pickups)
		{
			pickups.PickItUp(this);
		}
	}

	// Token: 0x060003B6 RID: 950 RVA: 0x000570C0 File Offset: 0x000552C0
	public void GetIndoorID()
	{
		if (this.node == null)
		{
			return;
		}
		if (this.node.GraphIndex == 1U)
		{
			this.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName((Vector3)this.node.position);
			return;
		}
		this.indoorID = "";
	}

	// Token: 0x060003B7 RID: 951 RVA: 0x0005711C File Offset: 0x0005531C
	public void SetNodeID(bool overrideDefaults, bool moving)
	{
		if (this.dead)
		{
			return;
		}
		if (this.sailing)
		{
			return;
		}
		int num = this.nodeMovingID;
		if (this.nodePath.Count == 0 || (this.nodePath.Count > 0 && this.blockedTime > 0f))
		{
			num = this.nodeStationaryID;
		}
		if (overrideDefaults)
		{
			if (moving)
			{
				num = this.nodeMovingID;
			}
			else
			{
				num = this.nodeStationaryID;
			}
		}
		if (this.node != null && !this.sailing)
		{
			this.node.SetFlowerConnections(num, this.nodeMovingID, this.ConnectionNumber());
			this.node.SetFlowerConnections(num, this.nodeStationaryID, this.ConnectionNumber());
		}
		if (this.mainSelected)
		{
			if (this.mainNode2 != null)
			{
				this.mainNode2.SetFlowerConnections(num, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode2.SetFlowerConnections(num, this.nodeStationaryID, this.ConnectionNumber());
			}
			if (this.mainNode3 != null)
			{
				this.mainNode3.SetFlowerConnections(num, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode3.SetFlowerConnections(num, this.nodeStationaryID, this.ConnectionNumber());
			}
			if (this.mainNode4 != null)
			{
				this.mainNode4.SetFlowerConnections(num, this.nodeMovingID, this.ConnectionNumber());
				this.mainNode4.SetFlowerConnections(num, this.nodeStationaryID, this.ConnectionNumber());
			}
		}
	}

	// Token: 0x060003B8 RID: 952 RVA: 0x0005727C File Offset: 0x0005547C
	public int CheckCircleID()
	{
		if (this.inCircle)
		{
			if (!this.npc)
			{
				if (this.hasCircleBuff)
				{
					return 1;
				}
			}
			else if (this.group)
			{
				if (this.hasCreatureBuff)
				{
					return this.group.groupID;
				}
				if (!this.hasCreatureBuff)
				{
					if (false)
					{
						return 0;
					}
					return this.group.groupID;
				}
			}
		}
		return 0;
	}

	// Token: 0x060003B9 RID: 953 RVA: 0x000572E0 File Offset: 0x000554E0
	public GraphNode NearNode(Vector3 pos, bool checkEmpty, int uniqueID, int graphIndex, int circleID)
	{
		if (this.ghostVanishing)
		{
			checkEmpty = false;
		}
		if (Links.x.gaia.noAstar)
		{
			return null;
		}
		this.nodeConstraint.constrainWalkability = true;
		this.nodeConstraint.walkable = true;
		this.nodeConstraint.constrainTags = checkEmpty;
		this.nodeConstraint.checkCircleID = circleID;
		this.nodeConstraint.passID = this.nodeStationaryID;
		this.nodeConstraint.passID2 = this.nodeMovingID;
		this.nodeConstraint.constrainPenalty = 0;
		this.nodeConstraint.checkConnections = this.ConnectionNumber();
		if (this.ghost && !this.ghostVanishing)
		{
			this.nodeConstraint.constrainToEnvironment = 0;
		}
		else if (this.sailing || this.movesOnWater)
		{
			this.nodeConstraint.constrainToEnvironment = 2;
		}
		else
		{
			this.nodeConstraint.constrainToEnvironment = 1;
		}
		this.nodeConstraint.uniqueID = uniqueID;
		int num = this.setArea;
		this.nodeConstraint.constrainToArea = num;
		this.setArea = -1;
		GraphNode graphNode = AstarPath.active.GetNearest(pos, this.nodeConstraint).node;
		if (graphNode != null)
		{
			return graphNode;
		}
		return null;
	}

	// Token: 0x060003BA RID: 954 RVA: 0x00057408 File Offset: 0x00055608
	public Vector3 FindFloorPoint(Vector3 start, bool directRaycast, Vector3 checkFrom, float minDist, string type)
	{
		Vector3 vector = this.vectorZero;
		bool flag = false;
		Vector3 vector2 = start;
		vector2.y += 0.9f;
		float num = 1.75f;
		if (Physics.Raycast(vector2, -1f * this.upVector, out this.rayHit, num, 4096))
		{
			Vector3 point = this.rayHit.point;
			bool flag2 = false;
			if (!flag2)
			{
				flag2 = this.ObstacleTest(point, checkFrom, directRaycast);
			}
			if (!flag2)
			{
				bool flag3 = true;
				if (type != "")
				{
					flag3 = this.AllTilesFree(null, true);
				}
				if (flag3)
				{
					flag = true;
					vector = point;
				}
			}
		}
		if (type == "")
		{
			flag = true;
		}
		bool flag4 = false;
		if (type == "Quick")
		{
			flag4 = true;
		}
		if (!flag)
		{
			float num2 = float.PositiveInfinity;
			float num3 = 2f;
			float num4 = 2f;
			if (start == checkFrom)
			{
				flag4 = true;
			}
			if (flag4)
			{
				int num5 = 0;
				int num6 = 0;
				int num7 = 0;
				int num8 = 0;
				int num9 = Random.Range(0, 4);
				if (num9 == 1)
				{
					num5 = 1;
					num6 = 2;
					num7 = 3;
					num8 = 0;
				}
				if (num9 == 2)
				{
					num5 = 3;
					num6 = 2;
					num7 = 0;
					num8 = 1;
				}
				if (num9 == 3)
				{
					num5 = 2;
					num6 = 3;
					num7 = 1;
					num8 = 0;
				}
				this.nodeFindDirections[num5] = checkFrom;
				Vector3[] array = this.nodeFindDirections;
				int num10 = num5;
				array[num10].x = array[num10].x + num3;
				Vector3[] array2 = this.nodeFindDirections;
				int num11 = num5;
				array2[num11].y = array2[num11].y + 0.5f;
				this.nodeFindDirections[num6] = checkFrom;
				Vector3[] array3 = this.nodeFindDirections;
				int num12 = num6;
				array3[num12].z = array3[num12].z + num3;
				Vector3[] array4 = this.nodeFindDirections;
				int num13 = num6;
				array4[num13].y = array4[num13].y + 0.5f;
				this.nodeFindDirections[num7] = checkFrom;
				Vector3[] array5 = this.nodeFindDirections;
				int num14 = num7;
				array5[num14].x = array5[num14].x + num3 * -1f;
				Vector3[] array6 = this.nodeFindDirections;
				int num15 = num7;
				array6[num15].y = array6[num15].y + 0.5f;
				this.nodeFindDirections[num8] = checkFrom;
				Vector3[] array7 = this.nodeFindDirections;
				int num16 = num8;
				array7[num16].z = array7[num16].z + num3 * -1f;
				Vector3[] array8 = this.nodeFindDirections;
				int num17 = num8;
				array8[num17].y = array8[num17].y + 0.5f;
			}
			else
			{
				Vector3 eulerAngles = Quaternion.LookRotation(start - checkFrom).eulerAngles;
				eulerAngles.x = 0f;
				eulerAngles.z = 0f;
				Vector3 vector3 = eulerAngles;
				vector3.y += 45f;
				Vector3 vector4 = eulerAngles;
				vector4.y -= 45f;
				Vector3 vector5 = eulerAngles;
				vector5.y += 90f;
				Vector3 vector6 = eulerAngles;
				vector6.y -= 90f;
				this.nodeFindDirections[0] = this.vectorZero;
				this.nodeFindDirections[1] = this.vectorZero;
				this.nodeFindDirections[2] = this.vectorZero;
				this.nodeFindDirections[3] = this.vectorZero;
				bool flag5 = false;
				bool flag6 = false;
				bool flag7 = false;
				bool flag8 = false;
				if (!Physics.Raycast(checkFrom + this.yAdd2, Quaternion.Euler(vector3) * Vector3.forward, 3f, Links.x.allObstacles))
				{
					flag6 = true;
				}
				if (!Physics.Raycast(checkFrom + this.yAdd2, Quaternion.Euler(vector4) * Vector3.forward, 3f, Links.x.allObstacles))
				{
					flag5 = true;
				}
				if (!Physics.Raycast(checkFrom + this.yAdd2, Quaternion.Euler(vector5) * Vector3.forward, 2f, Links.x.allObstacles))
				{
					flag8 = true;
				}
				if (!Physics.Raycast(checkFrom + this.yAdd2, Quaternion.Euler(vector6) * Vector3.forward, 2f, Links.x.allObstacles))
				{
					flag7 = true;
				}
				if (flag5)
				{
					this.nodeFindDirections[0] = checkFrom + Quaternion.Euler(vector4) * Vector3.forward * num4;
				}
				if (flag6)
				{
					this.nodeFindDirections[1] = checkFrom + Quaternion.Euler(vector3) * Vector3.forward * num4;
				}
				if (flag7)
				{
					this.nodeFindDirections[2] = checkFrom + Quaternion.Euler(vector6) * Vector3.forward * num4;
				}
				if (flag8)
				{
					this.nodeFindDirections[3] = checkFrom + Quaternion.Euler(vector5) * Vector3.forward * num4;
				}
				if (!flag5 && !flag7 && !flag6 && !flag8)
				{
					vector5 = eulerAngles;
					vector5.y += 135f;
					vector6 = eulerAngles;
					vector6.y -= 135f;
					if (!Physics.Raycast(checkFrom + this.yAdd2, Quaternion.Euler(vector5) * Vector3.forward, out this.rayHit, 4f, Links.x.allObstacles))
					{
						this.nodeFindDirections[1] = checkFrom + Quaternion.Euler(vector5) * Vector3.forward * num4;
					}
					if (!Physics.Raycast(checkFrom + this.yAdd2, Quaternion.Euler(vector6) * Vector3.forward, out this.rayHit, 4f, Links.x.allObstacles))
					{
						this.nodeFindDirections[0] = checkFrom + Quaternion.Euler(vector6) * Vector3.forward * num4;
					}
				}
			}
			for (int i = 0; i < 4; i++)
			{
				Vector3 vector7 = this.nodeFindDirections[i];
				bool flag9 = true;
				Vector3 vector8 = vector7;
				vector8.y = start.y;
				float sqrMagnitude = this.SubtractVectors(start, vector8).sqrMagnitude;
				if (flag9 && vector7 != this.vectorZero && sqrMagnitude < num2)
				{
					vector2 = vector7;
					vector2.y += 0.8f;
					if (Physics.Raycast(vector2, -1f * this.upVector, out this.rayHit, num, 4194449))
					{
						Vector3 point2 = this.rayHit.point;
						bool flag10 = this.ObstacleTest(point2, checkFrom, directRaycast);
						if (!flag10 && !flag4)
						{
							flag9 = this.AllTilesFree(null, true);
						}
						if (!flag10 && flag9)
						{
							num2 = sqrMagnitude;
							vector = point2;
						}
					}
				}
			}
		}
		return vector;
	}

	// Token: 0x060003BB RID: 955 RVA: 0x00057ABB File Offset: 0x00055CBB
	public GraphNode GetLastNode()
	{
		if (this.nodePath.Count > 0)
		{
			return this.nodePath[this.nodePath.Count - 1];
		}
		return null;
	}

	// Token: 0x060003BC RID: 956 RVA: 0x00057AE8 File Offset: 0x00055CE8
	public void ZeroAttackTime(float attackTimeReduction)
	{
		this.currentAttackSpeed = this.stats.ActionTime() + this.inventoryTime;
		if (this.currentAttackSpeed < 0.25f)
		{
			this.currentAttackSpeed = 0.25f;
		}
		float num = this.currentAttackSpeed * attackTimeReduction / this.currentAttackSpeed;
		this.at = num;
		this.attackTime = num;
		this.stats.UpdateAbilityTriggers();
		if (this.portrait)
		{
			this.portrait.SetActionBar(this.attackTime);
			this.portrait.skillBag.SetSelectedState();
		}
		this.inventoryTime = 0f;
	}

	// Token: 0x060003BD RID: 957 RVA: 0x00057B88 File Offset: 0x00055D88
	public void FullAttackTime()
	{
		if (!this.IsSentient())
		{
			this.attackTime = 0f;
			return;
		}
		this.at = 1f;
		this.attackTime = 1f;
		this.inventoryTime = 0f;
		if (this.portrait)
		{
			this.portrait.SetActionBar(this.attackTime);
			this.portrait.skillBag.SetSelectedState();
		}
		if (this.mainSelected)
		{
			Links.x.hudControl.UpdateAttackTime(this.at, 1f, this.inventoryTime);
		}
	}

	// Token: 0x060003BE RID: 958 RVA: 0x00057C20 File Offset: 0x00055E20
	public void UpdateAtkTime(float amt)
	{
		this.inventoryTime += amt;
		if (amt < 0f && this.mainSelected)
		{
			Links.x.hudControl.AttackTimerDecreaseTime();
		}
		float num = this.at * this.currentAttackSpeed;
		this.currentAttackSpeed = this.stats.ActionTime() + this.inventoryTime;
		if (this.currentAttackSpeed < 0.25f)
		{
			this.currentAttackSpeed = 0.25f;
		}
		this.at = num / this.currentAttackSpeed;
		this.attackTime = this.at;
		if (this.portrait)
		{
			this.portrait.SetActionBar(this.attackTime);
		}
		if (this.mainSelected)
		{
			Links.x.hudControl.UpdateAttackTime(this.at, 1f, this.inventoryTime);
			if (Records.x.pocketPause && amt > 0f)
			{
				Links.x.gameplay.PocketPause(false);
			}
		}
	}

	// Token: 0x060003BF RID: 959 RVA: 0x00057D1C File Offset: 0x00055F1C
	public void Leave(bool canBeStunned)
	{
		if (this.dead || (!canBeStunned && this.stunned))
		{
			Debug.Log("Cannot make a dead/stunned character leave " + ((this != null) ? this.ToString() : null));
		}
		if (Records.x.editor)
		{
			Debug.Log("Leaving " + ((this != null) ? this.ToString() : null));
		}
		this.missing = true;
		this.missingTime = Time.timeSinceLevelLoad;
		this.hostility = -1;
		if (this.actions && this.hasActions)
		{
			this.actions.EndActions();
		}
		if (this.sleeping)
		{
			this.WakeUp();
		}
		if (this.inactive)
		{
			this.TurnScriptsOn();
		}
		this.alwaysOn = true;
		this.stats.state = "Fled";
		if (Links.x.hasMain)
		{
			this.Flee(Links.x.main.node, true, Links.x.gameplay.seconds, 100f);
		}
		else
		{
			this.Flee(this.node, true, Links.x.gameplay.seconds, 100f);
		}
		if (this.stunned)
		{
			this.Missing();
		}
	}

	// Token: 0x060003C0 RID: 960 RVA: 0x00057E53 File Offset: 0x00056053
	public void LeaveToDeactivationPoint()
	{
		if (this.inactive)
		{
			this.TurnScriptsOn();
		}
		this.alwaysOn = true;
		if (this.sleeping)
		{
			this.WakeUp();
		}
		this.deactivating = true;
	}

	// Token: 0x060003C1 RID: 961 RVA: 0x00057E80 File Offset: 0x00056080
	public void Missing()
	{
		this.missing = true;
		this.alwaysOn = true;
		this.Dead(true, false, true);
		CreatureActions creatureActions = this.creatures;
		if (creatureActions && this.swarm)
		{
			creatureActions.RemoveFromScene();
		}
		this.SetMeshState(false);
		this.stats.state = "Fled";
		this.body.SetMeshState(false, true);
		this.body.Missing();
		if (this.summoned)
		{
			this.DestroyCharacter();
		}
		if (Records.x.editor)
		{
			Debug.Log(((this != null) ? this.ToString() : null) + " has left the scene");
		}
	}

	// Token: 0x060003C2 RID: 962 RVA: 0x00057F28 File Offset: 0x00056128
	public void Flee(GraphNode fromNode, bool isMissing, float startTime, float fleeTimeLength)
	{
		if (!this.fleeingAroundPoint && (this.fleeTime > 0f || this.stunned || this.dead))
		{
			return;
		}
		if (startTime != 0f)
		{
			this.fleeTime = fleeTimeLength;
			this.fleeStartTime = startTime;
		}
		if (Records.x.editor)
		{
			Debug.Log("Fleeing " + ((this != null) ? this.ToString() : null));
		}
		this.fleePoint = fromNode;
		if (this.mainSelected && this.physicsMove)
		{
			this.StopMove();
		}
		this.fleeing = true;
		int num = 20;
		if (this.summoned && isMissing)
		{
			num = 80;
			this.ignoreNodeIDs = true;
		}
		this.MakePath(fromNode, num, false, true, false);
		this.CircleColor(true);
	}

	// Token: 0x060003C3 RID: 963 RVA: 0x00057FE8 File Offset: 0x000561E8
	public void CheckFleeEnd()
	{
		if (this.sailing)
		{
			this.fleeing = false;
		}
		if (this.tr)
		{
			Vector3 position = this.tr.position;
			if (this.fleeing && this.fleePoint != null)
			{
				if (Links.x.hasMain)
				{
					if (this.fleePoint == null)
					{
						this.fleePoint = Links.x.main.node;
					}
				}
				else if (this.fleePoint == null)
				{
					this.fleePoint = this.node;
				}
				if (!this.hasActions && Records.x.InCombat(false) && this.hostility != 2 && !this.attackingUntilBribe && Links.x.gameplay.seconds >= this.fleeStartTime + this.fleeTime)
				{
					this.fleeTime += Random.Range(100f, 200f);
					this.StartQuip("Help!");
				}
				if (((Links.x.main.tr.position - position).sqrMagnitude < 625f && this.missing) || (!this.missing && Links.x.gameplay.seconds < this.fleeStartTime + this.fleeTime) || this.stats.Confuse() > 0 || this.fleeingAroundPoint)
				{
					this.MakePath(this.fleePoint, 20, false, true, false);
					return;
				}
				if (this.missing)
				{
					this.Missing();
				}
				else
				{
					this.fleeing = false;
				}
			}
			else if (this.missing)
			{
				this.Missing();
			}
			else
			{
				this.fleeing = false;
			}
		}
		if (!this.missing)
		{
			this.fleeing = false;
		}
		if (!this.fleeing)
		{
			this.fleeTime = 0f;
			this.fleeStartTime = 0f;
		}
		this.CircleColor(false);
	}

	// Token: 0x060003C4 RID: 964 RVA: 0x000581C3 File Offset: 0x000563C3
	public void EndFleeFromEffect()
	{
		this.fleeing = false;
		this.fleeTime = 0f;
		this.fleeStartTime = 0f;
	}

	// Token: 0x060003C5 RID: 965 RVA: 0x000581E2 File Offset: 0x000563E2
	public void StartFleeAroundPoint(GraphNode fromNode)
	{
		this.fleeingAroundPoint = true;
		this.fleeing = true;
		base.StartCoroutine(this.FleeAroundPt(fromNode));
	}

	// Token: 0x060003C6 RID: 966 RVA: 0x00058200 File Offset: 0x00056400
	private IEnumerator FleeAroundPt(GraphNode fromNode)
	{
		if (this.actions)
		{
			this.actions.Interrupt();
		}
		this.TargetReached();
		this.Flee(fromNode, this.missing, Links.x.gameplay.seconds, 10000f);
		yield return new WaitForSeconds(0.1f);
		if (this.fleeingAroundPoint)
		{
			if (this.actions)
			{
				this.actions.Interrupt();
			}
			this.TargetReached();
		}
		yield return new WaitForSeconds(0.1f);
		if (this.fleeingAroundPoint)
		{
			if (this.actions)
			{
				this.actions.Interrupt();
			}
			this.TargetReached();
		}
		yield return new WaitForSeconds(0.1f);
		if (this.fleeingAroundPoint)
		{
			if (this.actions)
			{
				this.actions.Interrupt();
			}
			this.TargetReached();
		}
		yield return new WaitForSeconds(0.1f);
		if (this.fleeingAroundPoint)
		{
			this.Flee(fromNode, this.missing, Links.x.gameplay.seconds, 10000f);
		}
		yield break;
	}

	// Token: 0x060003C7 RID: 967 RVA: 0x00058216 File Offset: 0x00056416
	public void EndFleeAroundPoint()
	{
		this.fleeingAroundPoint = false;
		this.EndFleeFromEffect();
	}

	// Token: 0x060003C8 RID: 968 RVA: 0x00058228 File Offset: 0x00056428
	public void GhostFlee()
	{
		if (!this.stats.HasEffect("GhostFlee"))
		{
			Effects effects = base.gameObject.AddComponent<Effects>();
			Links.x.cellar.AddEffects(effects);
			effects.source = this;
			effects.target = this;
			effects.effectName = "GhostFlee";
			effects.sourceLevel = 0f;
			effects.Inflicted(false);
		}
		if (Links.x.gameplay.seconds > this.lastGhostFleeTime + 50f)
		{
			this.lastGhostFleeTime = Links.x.gameplay.seconds;
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(118);
			pooledGameObject.transform.position = this.tr.position - new Vector3(0f, 1.5f, 0f);
			pooledGameObject.SetActive(true);
		}
		this.PlayAnimation("Hit", 0f);
		MasterAudio.PlaySound3DAtVector3AndForget("GhostScream", this.tr.position, Random.Range(0.2f, 0.3f), new float?(Random.Range(0.7f, 1f)), 0f, "", null);
		if (this.hasActions)
		{
			this.actions.CheckIfRunningAI();
			this.actions.EndTurn(true);
		}
		this.ClearNodePath();
		this.Knockback(Links.x.NearestIncense(this.currentPosition), 6, false, false, false);
		this.SetMoveFollowPosition(this.NodePosition());
	}

	// Token: 0x060003C9 RID: 969 RVA: 0x000583B0 File Offset: 0x000565B0
	public void SetAsLeader()
	{
		bool flag = false;
		if (Links.x.main == this)
		{
			flag = true;
		}
		if (Links.x.main != this)
		{
			Character main = Links.x.main;
			if (!Records.x.removeControls)
			{
				Links.x.gameplay.SetSelectionCircle(this);
			}
			Links.x.RemoveOtherLeaders(this);
			Links.x.ChangePartyPositionFromLeader(this);
			if (Links.x.main.moonlight)
			{
				Links.x.main.moonlight.moonlightRevealer.main = false;
			}
			if (this.hasActions && main.actions && !main.actions.ai.findingAction && !main.inRecovery && !main.inAction && !main.inQueuedAbility && !main.dead)
			{
				Links.x.combat.GetNextAction(main);
			}
			this.ClearNodePath();
			this.ClearPathUpdatesAll();
			if (main)
			{
				if (main.body)
				{
					main.body.CombatSheen(0);
				}
				if (main.portrait)
				{
					main.portrait.skillBag.SetTrinketGrid(false);
					main.portrait.skillBag.UpdateAbilityTriggers();
				}
			}
			if (Records.x.pocketPause)
			{
				main.ChangePocketPauseState();
			}
			Links.x.combat.pocketTarget = null;
			if (Records.x.partyWait)
			{
				main.waitPosition = main.currentPosition;
			}
		}
		Links.x.hasMain = true;
		Links.x.main = this;
		Links.x.follow.position = this.tr.position + this.headHeight;
		this.mainSelected = true;
		this.selected = true;
		this.movingOutOfWay = false;
		this.body.SeeThroughColliders(false);
		this.MoveBackEmpty();
		Links.x.gameplay.SetDomeSize();
		Links.x.fellowship.RemoveAllFromSelected(this);
		Links.x.rtsCamera.Follow(this.tr, this, false);
		this.UpdateCC();
		if (Links.x.sensory && !this.inCombat && !flag && Links.x.gaia.sceneLoaded)
		{
			Links.x.sensory.LookAtObject(this.body.headBone, 10f, false, this, 3f, 0.1f, null, 1);
		}
		if (this.portrait)
		{
			if (this.portrait.skillBag)
			{
				this.portrait.skillBag.SetSelectedState();
			}
			this.portrait.SetFatigue();
		}
		if (this.inCombat)
		{
			if (this.actions)
			{
				if (!this.body.attacking && !this.inAction && !this.inRecovery && !Records.x.pocketPause)
				{
					this.ClearNodePath();
				}
				this.actions.CheckIfRunningAI();
			}
			Links.x.hudControl.UpdateAttackTime(this.attackTime, 1f, this.inventoryTime);
		}
		if (this.body)
		{
			this.body.CombatSheen(0);
		}
		if (this.CanAttack())
		{
			if (Records.x.pocketPause)
			{
				Links.x.gameplay.PocketPause(true);
				Shader.SetGlobalFloat("_AttackTime", this.attackTime);
				this.ChangePocketPauseState();
			}
		}
		else
		{
			Shader.SetGlobalFloat("_AttackTime", 0f);
		}
		if (Records.x.pocketPause)
		{
			Links.x.hudControl.ToggleAttackTimer(true);
		}
		Links.x.rtsCamera.Follow(this.tr, this, false);
		if (this.portrait && this.portrait.skillBag)
		{
			Links.x.pocketWheel.Open(this);
		}
		if (this.moonlight)
		{
			this.moonlight.moonlightRevealer.main = true;
		}
		Links.x.fellowship.UpdatePortraits();
		Links.x.gameplay.UpdateSelectedParty();
		this.CircleAnimation("");
		if (this.bracket)
		{
			this.bracket.SetActive(true);
		}
	}

	// Token: 0x060003CA RID: 970 RVA: 0x00058808 File Offset: 0x00056A08
	public void AddToSelected(bool updatePortrait, bool setLeader)
	{
		if (this.stunned || this.dead)
		{
			return;
		}
		if (this.isBoro)
		{
			return;
		}
		this.selected = true;
		if (updatePortrait && this.portrait)
		{
			this.portrait.SetSelection();
		}
		this.CircleAnimation("");
		if (Records.x.InCombat(false))
		{
			Links.x.combat.GetTargets(false, false, null);
		}
		this.selectedBeforeDoor = false;
		if (this.bracket)
		{
			this.bracket.SetActive(true);
		}
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Smile);
		this.SetAsLeader();
	}

	// Token: 0x060003CB RID: 971 RVA: 0x000588AC File Offset: 0x00056AAC
	public void RemoveFromSelected(bool setLeader)
	{
		this.selected = false;
		this.CircleAnimation("");
		if (Records.x.InCombat(false))
		{
			Links.x.combat.GetTargets(false, false, null);
		}
		if (this.bracket)
		{
			this.bracket.SetActive(false);
		}
		this.PlayFaceAnimation(FaceAnimations.AnimationNames.Frown);
		if (this.moonlight)
		{
			this.moonlight.moonlightRevealer.main = false;
		}
		this.body.SeeThroughColliders(false);
		if (this.cc && this.cc.enabled)
		{
			this.cc.enabled = false;
			this.playerBorders.enabled = false;
		}
		if (this.portrait && this.portrait.skillBag)
		{
			this.portrait.skillBag.SetSelectedState();
		}
	}

	// Token: 0x060003CC RID: 972 RVA: 0x00058997 File Offset: 0x00056B97
	public void StartExploration()
	{
		this.CircleAnimation("");
	}

	// Token: 0x060003CD RID: 973 RVA: 0x000589A4 File Offset: 0x00056BA4
	public void ToggleCombatAnimator(bool state)
	{
	}

	// Token: 0x060003CE RID: 974 RVA: 0x000589A6 File Offset: 0x00056BA6
	public void ToggleArrow(bool on)
	{
		if (!on)
		{
			this.CircleAnimation("");
			return;
		}
		this.CircleAnimation("");
	}

	// Token: 0x060003CF RID: 975 RVA: 0x000589C4 File Offset: 0x00056BC4
	public void DropWeapon()
	{
		int num = this.bag[0];
		if (num > 1)
		{
			int num2 = -1;
			if (this.node != null)
			{
				num2 = (int)this.node.Area;
			}
			global::Item item = Links.x.inventory.groundBag.DropLoot(num, this.bag[1], Vector3.zero, Vector3.zero, this.durability[0], null, base.gameObject.transform.position, false, false, num2);
			if (item)
			{
				Links.x.diorama.AddItem(item);
			}
		}
		this.bag[0] = 0;
		this.bag[1] = 0;
		this.CreateEquippedItems(0, 0, Vector3.zero, Vector3.zero, 0, true);
	}

	// Token: 0x060003D0 RID: 976 RVA: 0x00058A8C File Offset: 0x00056C8C
	public void CreateEquippedItems(int ID, int stackSize, Vector3 socketA, Vector3 socketB, int slot, bool force)
	{
		bool flag = true;
		bool flag2 = false;
		bool flag3 = false;
		if (ID == 0 && slot <= 2)
		{
			ID = 1;
		}
		if (slot == 8 || slot == 10 || slot == 12)
		{
			return;
		}
		if (slot == 32 || slot == 34 || slot == 36)
		{
			return;
		}
		Library.Inventory inventory = null;
		if (ID <= 1 || stackSize <= -100)
		{
			flag3 = true;
		}
		if (slot == 0)
		{
			inventory = this.invRow1;
		}
		if (slot == 2)
		{
			inventory = this.invRow2;
		}
		if (slot == 4)
		{
			inventory = this.invRow3;
		}
		if (slot == 6)
		{
			inventory = this.invRow4;
		}
		int num = slot / 2;
		if (this.equippedItems[num])
		{
			Equipment component = this.equippedItems[num].GetComponent<Equipment>();
			int id = component.id;
			GameObject ammoObject = component.ammoObject;
			string ammoObjectName = component.ammoObjectName;
			component.ammoObject = null;
			if (flag || force)
			{
				Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(id);
				GameObject gameObject = this.equippedItems[num];
				if (this.party && slot < 8 && gameObject)
				{
					MeshRenderer component2 = gameObject.gameObject.GetComponent<MeshRenderer>();
					if (component2)
					{
						if (component2.material.GetFloat("_Glow") > 0f)
						{
							component2.material.SetFloat("_Glow", 0f);
						}
					}
					else
					{
						SkinnedMeshRenderer component3 = gameObject.gameObject.GetComponent<SkinnedMeshRenderer>();
						if (component3 && component3.material.GetFloat("_Glow") > 0f)
						{
							component3.material.SetFloat("_Glow", 0f);
						}
					}
				}
				Links.x.archives.RecycleItemBody(gameObject, invRowByIndex._CharacterModel);
				this.equippedItems[slot / 2] = null;
				inventory = null;
				flag2 = true;
				if (ammoObject)
				{
					Links.x.archives.RecycleItemBody(ammoObject, ammoObjectName);
				}
			}
		}
		if (slot == 18 && this.stats.model != this.stats.characterRow._Model)
		{
			flag = true;
			flag3 = false;
		}
		if (this.bag[slot] == 0)
		{
			this.equippedItems[slot / 2] = null;
			inventory = null;
		}
		Library.Inventory inventory2;
		if (slot <= 6)
		{
			inventory = Links.x.library.GetInvRowByIndex(ID);
			inventory2 = inventory;
		}
		else
		{
			inventory2 = Links.x.library.GetInvRowByIndex(ID);
		}
		if (inventory2._UIModel.Contains("None"))
		{
			flag3 = true;
		}
		bool flag4 = false;
		bool flag5 = false;
		if (slot == 0 && inventory._Tag == "Weapon")
		{
			this.invRow1 = inventory;
		}
		if (slot == 2)
		{
			this.invRow2 = inventory;
		}
		if (slot == 4)
		{
			this.invRow3 = inventory;
		}
		if (slot == 6)
		{
			this.invRow4 = inventory;
		}
		if ((slot == 0 || slot == 2 || slot == 4 || slot == 6) && this.party && this.portrait)
		{
			this.portrait.skillBag.SetTrinketGrid(false);
		}
		if (flag)
		{
			if (slot < 4)
			{
				this.stats.UpdateAbilityTriggers();
			}
			if (slot == 7 || slot == 13 || slot == 14)
			{
				this.stats.UpdateAbilityTriggers();
			}
		}
		if (this.party && (slot == 0 || slot == 2) && this.portrait)
		{
			this.portrait.SetWpnDurabilityColor();
		}
		if (slot == 16 || slot == 20 || slot == 22 || slot == 24)
		{
			this.stats.EnchantJewelryEffects(slot, false);
		}
		if (!flag3 && (flag || force))
		{
			if (slot == 0 && !this.npc && ID <= 1)
			{
				Links.x.inventory.CreateFist(0, false, this, null, false);
			}
			if (slot != 4)
			{
			}
			if (ID > 1)
			{
				if (slot == 18)
				{
					if (this.party && inventory2._ArmorID != -1)
					{
						if (this.bodyObj)
						{
							Links.x.archives.RecycleBody(this.bodyObj, this.bodyObj.name, base.gameObject.name);
						}
						this.bodyObj = null;
						this.stats.model = Links.x.archives.GetArmorModel(inventory2._CharacterModel, this.stats.race, this.stats.sex, this);
						this.SetupBody();
						this.AddEquippedItems();
						this.SetMeshState(true);
						flag4 = true;
						flag5 = true;
					}
				}
				else
				{
					Transform transform = this.body.GetSlot(slot);
					if (transform)
					{
						GameObject itemPrefabBody = Links.x.archives.GetItemPrefabBody(inventory2._CharacterModel);
						bool flag6 = false;
						int num2 = 2;
						string text = "slingstone_ammo_clay";
						if (inventory2._MeleeRangeEnd >= 5f && slot == 0)
						{
							flag6 = true;
						}
						if (inventory2._Name.Contains("Bow"))
						{
							transform = this.body.GetSlot(2);
							num2 = 0;
							text = "arrow_tier1";
						}
						if (inventory2._MainSkill == "Elixir" && inventory2._Tag == "Weapon")
						{
							text = "item_ammo_projectile_globe1";
						}
						if (!itemPrefabBody)
						{
							Debug.Log(((this != null) ? this.ToString() : null) + " missing item prefab " + inventory2._Name);
						}
						if (itemPrefabBody && transform)
						{
							itemPrefabBody.gameObject.transform.SetParent(transform, false);
							itemPrefabBody.gameObject.transform.localPosition = new Vector3(0f, 0f, 0f);
							itemPrefabBody.gameObject.transform.localRotation = Quaternion.Euler(this.vectorZero);
							Equipment equipment = itemPrefabBody.GetComponent<Equipment>();
							if (!equipment)
							{
								equipment = itemPrefabBody.AddComponent<Equipment>();
							}
							equipment.id = inventory2._ID;
							if (inventory2._Tag == "Weapon")
							{
								itemPrefabBody.name = inventory2._MainSkill;
								if (inventory2._MainSkill == "Whip")
								{
									itemPrefabBody.name = "FlailWhip";
								}
								if (inventory._MainSkill == "Sling")
								{
									itemPrefabBody.name = "Sling_t-1_a_maya";
								}
							}
							BoxCollider boxCollider = itemPrefabBody.GetComponent<BoxCollider>();
							if (boxCollider)
							{
								Object.Destroy(boxCollider);
							}
							this.equippedItems[slot / 2] = itemPrefabBody;
							flag2 = true;
							if (slot < 8 && this.party && this.durability[slot / 2].x <= (float)Records.x.durabilityThreshold && itemPrefabBody.gameObject && itemPrefabBody.gameObject.GetComponent<Renderer>() && itemPrefabBody.gameObject.GetComponent<Renderer>().material)
							{
								itemPrefabBody.gameObject.GetComponent<Renderer>().material.SetFloat("_Glow", 1f);
							}
							if (flag6)
							{
								GameObject itemPrefabBody2 = Links.x.archives.GetItemPrefabBody(text);
								itemPrefabBody2.gameObject.transform.SetParent(this.body.GetSlot(num2), false);
								itemPrefabBody2.gameObject.transform.localPosition = new Vector3(0f, 0f, 0f);
								itemPrefabBody2.gameObject.transform.localRotation = Quaternion.Euler(this.vectorZero);
								equipment.ammoObject = itemPrefabBody2;
								equipment.ammoObjectName = text;
								boxCollider = itemPrefabBody2.GetComponent<BoxCollider>();
								if (boxCollider)
								{
									Object.Destroy(boxCollider);
								}
							}
						}
					}
				}
			}
			else
			{
				this.equippedItems[slot / 2] = null;
				if (slot == 18 && this.party)
				{
					string armorModel = Links.x.archives.GetArmorModel("Tunic", this.stats.race, this.stats.sex, this);
					if (this.stats.model != armorModel && !this.ghost)
					{
						this.stats.model = armorModel;
						this.SetupBody();
						this.AddEquippedItems();
						this.SetMeshState(true);
						flag4 = true;
						flag5 = true;
					}
				}
			}
		}
		else
		{
			this.AnimatorController(slot);
		}
		if (!flag3 && (flag || force))
		{
			this.AnimatorController(slot);
		}
		if (flag2)
		{
			this.body.GatherRenderers(false);
			if (this.visible == 1 || !this.npc)
			{
				this.SetMeshState(true);
			}
			else
			{
				this.SetMeshState(false);
			}
			if (!this.npc && (slot == 16 || slot == 24))
			{
				flag4 = true;
				flag5 = true;
			}
		}
		bool flag7 = false;
		bool flag8 = false;
		if (this.bag[14] == Links.x.library.torchID || this.bag[26] == Links.x.library.torchID || this.bag[28] == Links.x.library.torchID)
		{
			flag7 = true;
		}
		if (this.bag[14] == Links.x.library.incenseTorchID || this.bag[26] == Links.x.library.incenseTorchID || this.bag[28] == Links.x.library.incenseTorchID)
		{
			flag8 = true;
		}
		if (flag7)
		{
			this.AddTorch();
			this.hasTorch = true;
		}
		if (flag8)
		{
			this.AddIncenseTorch();
			this.hasIncenseTorch = true;
		}
		if (this.hasTorch && !flag7)
		{
			this.RemoveTorch();
			this.hasTorch = false;
		}
		if (this.hasIncenseTorch && !flag8)
		{
			this.RemoveIncenseTorch();
			this.hasIncenseTorch = false;
		}
		if (flag4 && !this.summoned)
		{
			Links.x.fellowship.AddHudPortraitChange(this);
		}
		if (flag5 && !this.summoned)
		{
			Links.x.fellowship.AddPortraitChange(this);
		}
		if (!this.npc)
		{
			if (this.invRow1 == null)
			{
				Links.x.inventory.CreateFist(0, false, this, null, false);
			}
			else if (this.invRow1._DisplayName == "Empty")
			{
				Links.x.inventory.CreateFist(0, false, this, null, false);
			}
			else if (this.ammoCount1 < 0)
			{
				this.ammoCount1 = 0;
			}
		}
		if (this.party)
		{
			this.portrait.SetMagicColor();
		}
		this.GetAlternativeWeaponRows();
	}

	// Token: 0x060003D1 RID: 977 RVA: 0x000594D8 File Offset: 0x000576D8
	public bool ShowSailAnim()
	{
		if (!this.sailing)
		{
			return false;
		}
		if (!this.npc)
		{
			if (!this.party)
			{
				return false;
			}
			if (Links.x.gaia.boat.leavingBoat)
			{
				return false;
			}
		}
		return !this.pocketPausedOverride && !this.inAction && !this.inRecovery && !this.IsAttacking(this.body.currentHash) && !this.stats.animal && !this.inQueuedAbility && this.animID != 2 && this.animID != 32 && this.animID != 41 && this.animID != 42 && this.animID != 15 && this.animID != 16 && !this.alwaysJump && !this.jumping && !this.dead && !this.stunned && !this.dodging;
	}

	// Token: 0x060003D2 RID: 978 RVA: 0x000595C8 File Offset: 0x000577C8
	public void NeedToUpdateSailingAnimator(bool always)
	{
		if (!this.sailing && !always)
		{
			return;
		}
		bool flag = this.ShowSailAnim();
		if (this.oar && !flag)
		{
			this.AnimatorController(0);
			this.AnimatorController(2);
		}
		if (!this.oar && flag)
		{
			this.AnimatorController(0);
		}
		GameObject gameObject = this.equippedItems[0];
		GameObject gameObject2 = this.equippedItems[1];
		if (this.oar)
		{
			if (gameObject && gameObject.activeSelf)
			{
				gameObject.SetActive(false);
			}
			if (gameObject2 && gameObject2.activeSelf)
			{
				gameObject2.SetActive(false);
				return;
			}
		}
		else
		{
			if (gameObject && !gameObject.activeSelf)
			{
				gameObject.SetActive(true);
			}
			if (gameObject2 && !gameObject2.activeSelf)
			{
				gameObject2.SetActive(true);
			}
		}
	}

	// Token: 0x060003D3 RID: 979 RVA: 0x0005969C File Offset: 0x0005789C
	public void AnimatorController(int slot)
	{
		bool flag = false;
		int num = 1;
		if (slot == 0 && this.invRow1 != null)
		{
			num = this.invRow1._ID;
			if (this.invRow1._UIModel.Contains("None"))
			{
				flag = true;
			}
		}
		if (slot == 2 && this.invRow2 != null)
		{
			num = this.invRow2._ID;
		}
		bool flag2 = false;
		if (this.sailing && this.ShowSailAnim())
		{
			flag2 = true;
		}
		if (flag2)
		{
			if (slot == 0)
			{
				bool flag3 = false;
				if (this.party)
				{
					if (Links.x.gaia.boat)
					{
						flag3 = Links.x.gaia.boat.IsSailorLeft(this);
					}
				}
				else if (this.boat)
				{
					flag3 = this.boat.IsSailorLeft(this);
				}
				string text = this.animationPrefix;
				if (text != "_Volling")
				{
					text = "_Volling";
				}
				if (flag3)
				{
					this.animControllerName = text + "_SailingLeft";
				}
				else
				{
					this.animControllerName = text + "_SailingRight";
				}
				AnimatorOverrideController overrideController = Links.x.archives.GetOverrideController(this.animControllerName);
				this.animator.runtimeAnimatorController = overrideController;
				this.animator.SetBool("Party", this.party);
				if (!this.oar)
				{
					this.oar = Links.x.cellar.GetPooledGameObject(137);
					this.oar.transform.parent = this.body.GetSlot(0);
					this.oar.SetActive(true);
					this.oar.transform.localPosition = Vector3.zero;
					this.oar.transform.localRotation = Quaternion.Euler(Vector3.zero);
					this.oar.layer = 6;
					return;
				}
			}
		}
		else
		{
			if (this.oar)
			{
				Links.x.cellar.ReturnPooledGameObject(137, this.oar);
				this.oar = null;
			}
			if (slot == 0 && num <= 1)
			{
				this.animControllerName = this.animationPrefix + "_Unarmed";
				AnimatorOverrideController animatorOverrideController = Links.x.archives.GetOverrideController(this.animControllerName);
				if (!animatorOverrideController)
				{
					if (this.bag[0] <= 1)
					{
						this.animControllerName = this.animationPrefix + "_unarmed";
						animatorOverrideController = Links.x.archives.GetOverrideController(this.animControllerName);
					}
					if (!animatorOverrideController)
					{
						Debug.Log("missing animation override controller for " + this.animControllerName + " " + ((this != null) ? this.ToString() : null));
					}
				}
				this.animator.runtimeAnimatorController = animatorOverrideController;
				this.animator.SetBool("Party", this.party);
				if (this.body)
				{
					this.body.anim.Rebind();
					this.body.anim.Update(0f);
				}
				this.needsRebind = false;
				if (this.invRow1 != null && (this.invRow1._MainSkill == "Whip" || this.invRow1._MainSkill == "Sling"))
				{
					this.needsRebind = true;
				}
			}
			if (slot == 2 && num <= 1 && this.animator.runtimeAnimatorController != null && (this.animator.runtimeAnimatorController.name.Contains("Multi") || this.animator.runtimeAnimatorController.name.Contains("Shield")))
			{
				string text2 = this.invRow1._CharacterAnimation;
				if (this.stats.race == "Yeti")
				{
					text2 = Records.x.GetWeaponControllerPrefix(this.invRow1, this.invRow2, this.stats.race, false);
				}
				this.animControllerName = this.animationPrefix + text2;
				AnimatorOverrideController overrideController2 = Links.x.archives.GetOverrideController(this.animControllerName);
				if (overrideController2 != null)
				{
					this.animator.runtimeAnimatorController = overrideController2;
				}
				this.animator.enabled = false;
				this.animator.enabled = true;
				if (this.body)
				{
					this.body.anim.Rebind();
					this.body.anim.Update(0f);
				}
				this.needsRebind = false;
				if (this.invRow1 != null && (this.invRow1._MainSkill == "Whip" || this.invRow1._MainSkill == "Sling"))
				{
					this.needsRebind = true;
				}
				this.animator.SetBool("Party", this.party);
			}
			if (slot == 0 && num > 1 && flag && this.invRow1._CharacterAnimation != "")
			{
				string characterAnimation = this.invRow1._CharacterAnimation;
				this.animControllerName = this.animationPrefix + characterAnimation;
				AnimatorOverrideController animatorOverrideController2 = Links.x.archives.GetOverrideController(this.animControllerName);
				if (animatorOverrideController2 != null)
				{
					this.animator.runtimeAnimatorController = animatorOverrideController2;
				}
				else if (!animatorOverrideController2)
				{
					if (this.bag[0] <= 1)
					{
						this.animControllerName = this.animationPrefix + "_unarmed";
						animatorOverrideController2 = Links.x.archives.GetOverrideController(this.animControllerName);
					}
					if (!animatorOverrideController2)
					{
						Debug.Log("missing animation override controller for " + this.animControllerName + " " + ((this != null) ? this.ToString() : null));
					}
					else
					{
						this.animator.runtimeAnimatorController = animatorOverrideController2;
					}
				}
			}
			if (slot == 0 && num > 1)
			{
				if (this.equippedItems[0])
				{
					this.equippedItems[0].SetActive(true);
				}
				string weaponControllerPrefix = Records.x.GetWeaponControllerPrefix(this.invRow1, this.invRow2, this.stats.race, false);
				this.animControllerName = this.animationPrefix + weaponControllerPrefix;
				AnimatorOverrideController animatorOverrideController3 = Links.x.archives.GetOverrideController(this.animControllerName);
				if (animatorOverrideController3 == null && this.animationPrefix.Contains("Volling"))
				{
					this.animControllerName = "_Volling" + weaponControllerPrefix;
					animatorOverrideController3 = Links.x.archives.GetOverrideController(this.animControllerName);
				}
				if (animatorOverrideController3 != null)
				{
					this.animator.runtimeAnimatorController = animatorOverrideController3;
				}
				if (this.body)
				{
					this.body.anim.Rebind();
					this.body.anim.Update(0f);
				}
				this.needsRebind = false;
				if (this.invRow1 != null && (this.invRow1._MainSkill == "Whip" || this.invRow1._MainSkill == "Sling"))
				{
					this.needsRebind = true;
				}
				this.animator.enabled = false;
				this.animator.enabled = true;
				this.animator.SetBool("Party", this.party);
			}
			if (slot == 2 && num > 1)
			{
				if (this.equippedItems[1])
				{
					this.equippedItems[1].SetActive(true);
				}
				string weaponControllerPrefix2 = Records.x.GetWeaponControllerPrefix(this.invRow1, this.invRow2, this.stats.race, false);
				this.animControllerName = this.animationPrefix + weaponControllerPrefix2;
				AnimatorOverrideController animatorOverrideController4 = Links.x.archives.GetOverrideController(this.animControllerName);
				if (animatorOverrideController4 == null && this.animationPrefix.Contains("Volling"))
				{
					this.animControllerName = "_Volling" + weaponControllerPrefix2;
					animatorOverrideController4 = Links.x.archives.GetOverrideController(this.animControllerName);
				}
				if (animatorOverrideController4 != null)
				{
					this.animator.runtimeAnimatorController = animatorOverrideController4;
				}
				if (this.body)
				{
					this.body.anim.Rebind();
					this.body.anim.Update(0f);
				}
				this.needsRebind = false;
				if (this.invRow1 != null && (this.invRow1._MainSkill == "Whip" || this.invRow1._MainSkill == "Sling"))
				{
					this.needsRebind = true;
				}
				this.animator.SetBool("Party", this.party);
				this.animator.enabled = false;
				this.animator.enabled = true;
			}
		}
	}

	// Token: 0x060003D4 RID: 980 RVA: 0x00059F6C File Offset: 0x0005816C
	public void InvFromDB()
	{
		this.bag.Clear();
		this.sockets.Clear();
		this.durability.Clear();
		int num = 54;
		if (!this.npc || this.stats.characterRow._CanJoinParty)
		{
			num = 176;
		}
		for (int i = 0; i < num / 2; i++)
		{
			this.bag.Add(0);
			this.bag.Add(0);
			this.sockets.Add(Vector3.zero);
			this.sockets.Add(Vector3.zero);
			this.bagPositions.Add(-1);
			this.durability.Add(Vector4.zero);
		}
		List<int> savedBag = this.stats.savedBag;
		List<Vector4> savedDur = this.stats.savedDur;
		for (int j = 0; j < num; j++)
		{
			if (j < savedBag.Count)
			{
				this.bag[j] = savedBag[j];
				if (this.stats.savedIntercesion > -1 && this.stats.savedIntercesion == this.bag[j])
				{
					this.sockets[j] = this.stats.savedIntercessionA;
					this.sockets[j + 1] = this.stats.savedIntercessionB;
				}
			}
		}
		for (int k = 0; k < this.durability.Count; k++)
		{
			if (k < savedDur.Count)
			{
				this.durability[k] = savedDur[k];
			}
		}
		if (this.bag[0] == 0)
		{
			this.bag[0] = 1;
			this.bag[1] = 1;
		}
	}

	// Token: 0x060003D5 RID: 981 RVA: 0x0005A124 File Offset: 0x00058324
	public string GetNPCSavedItems()
	{
		this.str.Clear();
		int count = this.bag.Count;
		int num = 0;
		for (int i = 0; i < count; i++)
		{
			if (i % 2 == 0)
			{
				if (num > 0)
				{
					this.str.Append(",");
				}
				Library.Inventory invRow = Links.x.library.GetInvRow(this.bag[i]);
				this.str.Append(invRow._Name);
				this.str.Append(",");
				this.str.Append(this.bag[i + 1]);
				this.str.Append(",");
				this.str.Append(this.sockets[i].x);
				this.str.Append(",");
				this.str.Append(this.sockets[i].y);
				this.str.Append(",");
				this.str.Append(this.sockets[i].z);
				this.str.Append(",");
				this.str.Append(this.sockets[i + 1].x);
				this.str.Append(",");
				this.str.Append(this.sockets[i + 1].y);
				this.str.Append(",");
				this.str.Append(this.sockets[i + 1].z);
				this.str.Append(",");
				this.str.Append(this.durability[i / 2].x);
				this.str.Append(",");
				this.str.Append(this.durability[i / 2].z);
				this.str.Append(",");
				this.str.Append(this.durability[i / 2].w);
				this.str.Append(",");
				this.str.Append(i / 2);
				num++;
			}
		}
		return this.str.ToString();
	}

	// Token: 0x060003D6 RID: 982 RVA: 0x0005A3AC File Offset: 0x000585AC
	public void SetNPCSavedItems(string itemList)
	{
		if (this.ghost)
		{
			return;
		}
		if (itemList == null)
		{
			return;
		}
		char c = ',';
		int num = 0;
		int num2 = 0;
		int num3 = 0;
		int num4 = 0;
		int num5 = 0;
		int num6 = 0;
		int num7 = 0;
		int num8 = -1;
		int num9 = 0;
		int num10 = 0;
		int num11 = 0;
		List<int> list = new List<int>();
		string[] array = new string[0];
		array = itemList.Split(c, StringSplitOptions.None);
		int num12 = array.Length;
		int num13 = 0;
		for (int i = 0; i < num12; i++)
		{
			if (num13 == 0)
			{
				int num14 = 0;
				if (array[i] != "" && array[i] != null)
				{
					bool flag = true;
					string text = array[i];
					Library.Inventory invRowFromName = Links.x.library.GetInvRowFromName(text);
					if (invRowFromName != null)
					{
						num14 = invRowFromName._ID;
					}
					if (flag)
					{
						int.TryParse(array[i + 1], out num);
						int.TryParse(array[i + 2], out num2);
						int.TryParse(array[i + 3], out num3);
						int.TryParse(array[i + 4], out num4);
						int.TryParse(array[i + 5], out num5);
						int.TryParse(array[i + 6], out num6);
						int.TryParse(array[i + 7], out num7);
						int.TryParse(array[i + 8], out num8);
						int.TryParse(array[i + 9], out num9);
						int.TryParse(array[i + 10], out num10);
						int.TryParse(array[i + 11], out num11);
						list.Add(num14);
						list.Add(num);
						list.Add(num2);
						list.Add(num3);
						list.Add(num4);
						list.Add(num5);
						list.Add(num6);
						list.Add(num7);
						list.Add(num8);
						list.Add(num9);
						list.Add(num10);
						list.Add(num11);
					}
				}
			}
			if (num13 == 11)
			{
				num13 = 0;
			}
			else
			{
				num13++;
			}
		}
		for (int j = 0; j < this.bag.Count; j++)
		{
			if (j % 2 == 0)
			{
				this.bag[j] = 0;
				this.bag[j + 1] = 0;
				this.sockets[j] = Vector3.zero;
				this.sockets[j + 1] = Vector3.zero;
				this.durability[j / 2] = Vector4.zero;
			}
		}
		num12 = list.Count;
		num13 = 0;
		if (!this.stunned)
		{
			for (int k = 0; k < num12; k++)
			{
				if (num13 == 0)
				{
					num11 = list[k + 11] * 2;
					if (num11 < this.bag.Count)
					{
						this.bag[num11] = list[k];
						this.bag[num11 + 1] = list[k + 1];
						this.sockets[num11] = new Vector3((float)list[k + 2], (float)list[k + 3], (float)list[k + 4]);
						this.sockets[num11 + 1] = new Vector3((float)list[k + 5], (float)list[k + 6], (float)list[k + 7]);
						this.durability[num11 / 2] = new Vector4((float)list[k + 8], 0f, (float)list[k + 9], (float)list[k + 10]);
					}
					else
					{
						this.bag.Add(list[k]);
						this.bag.Add(list[k + 1]);
						this.sockets.Add(new Vector3((float)list[k + 2], (float)list[k + 3], (float)list[k + 4]));
						this.sockets.Add(new Vector3((float)list[k + 5], (float)list[k + 6], (float)list[k + 7]));
						this.durability.Add(new Vector4((float)list[k + 8], 0f, (float)list[k + 9], (float)list[k + 10]));
					}
				}
				if (num13 == 11)
				{
					num13 = 0;
				}
				else
				{
					num13++;
				}
			}
		}
	}

	// Token: 0x060003D7 RID: 983 RVA: 0x0005A82C File Offset: 0x00058A2C
	public void SetUpInv()
	{
		Links.x.inventory.SetUpBag(this);
		this.tempBagID = this.inventoryBag.bagID;
		this.tempBagAmoumt = this.inventoryBag.bagAmount;
		this.tempSocketA = this.inventoryBag.socketA;
		this.tempSocketB = this.inventoryBag.socketB;
		this.tempBagPos = this.inventoryBag.bagPos;
		this.tempDurability = this.inventoryBag.durability;
		this.tempBagItems = this.inventoryBag.bagItems;
		Links.x.inventory.SpawnSavedItems(this);
	}

	// Token: 0x060003D8 RID: 984 RVA: 0x0005A8D0 File Offset: 0x00058AD0
	public int FreeBagID()
	{
		int num = -1;
		for (int i = 36; i < this.bag.Count; i++)
		{
			if (this.bag[i] == 0 && i % 2 == 0)
			{
				num = i;
				break;
			}
		}
		return num;
	}

	// Token: 0x060003D9 RID: 985 RVA: 0x0005A910 File Offset: 0x00058B10
	public void UpdateListsFromInv(bool updatedBodyEquipped)
	{
		if (this.party)
		{
			this.bag.Clear();
			this.bagPositions.Clear();
			this.sockets.Clear();
			this.durability.Clear();
			int count = this.tempBagID.Count;
			for (int i = 0; i < count; i++)
			{
				this.bag.Add(this.tempBagID[i]);
				this.bag.Add(this.tempBagAmoumt[i]);
				this.sockets.Add(this.tempSocketA[i]);
				this.sockets.Add(this.tempSocketB[i]);
				this.bagPositions.Add(this.tempBagPos[i]);
				this.durability.Add(this.tempDurability[i]);
			}
			if (this.portrait && updatedBodyEquipped)
			{
				this.portrait.skillBag.SetTrinketGrid(false);
			}
		}
	}

	// Token: 0x060003DA RID: 986 RVA: 0x0005AA1C File Offset: 0x00058C1C
	public void SetBagPosition(int equipIndex, int n)
	{
		if (equipIndex < 0)
		{
			return;
		}
		if (equipIndex >= this.bagPositions.Count)
		{
			Debug.Log("bagPosition list is not large enough for this " + equipIndex.ToString() + " " + ((this != null) ? this.ToString() : null));
			return;
		}
		this.bagPositions[equipIndex] = n;
	}

	// Token: 0x060003DB RID: 987 RVA: 0x0005AA72 File Offset: 0x00058C72
	public GameObject GetItemEquipped(int index)
	{
		if (this.equippedItems[index])
		{
			return this.equippedItems[index];
		}
		return null;
	}

	// Token: 0x060003DC RID: 988 RVA: 0x0005AA90 File Offset: 0x00058C90
	public string GetAmmoType()
	{
		if (this.invRow1._MainSkill == "Bow")
		{
			return "arrows";
		}
		if (this.invRow1._MainSkill.Contains("Sling"))
		{
			return "stones";
		}
		return "vials";
	}

	// Token: 0x060003DD RID: 989 RVA: 0x0005AADC File Offset: 0x00058CDC
	public bool HasAmmoOrMelee(Library.Inventory row, bool justCheckAmmo)
	{
		if (row._MeleeRangeEnd >= 5f)
		{
			if (row._MainSkill == "Bow" && row._Ammo1 == "Bow")
			{
				for (int i = 4; i < 8; i++)
				{
					if (this.bag[i * 2] >= Links.x.library.arrowsMin && this.bag[i * 2] <= Links.x.library.arrowsMax)
					{
						return true;
					}
				}
				return false;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 == "Dart")
			{
				for (int j = 4; j < 8; j++)
				{
					if (this.bag[j * 2] == Links.x.library.dartsMin)
					{
						return true;
					}
				}
				return false;
			}
			if (row._MainSkill.Contains("Elixir"))
			{
				for (int k = 4; k < 8; k++)
				{
					if (this.bag[k * 2] >= Links.x.library.vialsMin && this.bag[k * 2] <= Links.x.library.vialsMin + 1)
					{
						return true;
					}
				}
				return false;
			}
			for (int l = 4; l < 8; l++)
			{
				Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.bag[l * 2]);
				if (invRowByIndex._Tag == "Ammunition" && (invRowByIndex._Name == row._Ammo1 || invRowByIndex._Name == row._Ammo2))
				{
					return true;
				}
			}
		}
		return !justCheckAmmo;
	}

	// Token: 0x060003DE RID: 990 RVA: 0x0005AC90 File Offset: 0x00058E90
	public bool NeedsAmmo()
	{
		return this.invRow1._MainSkill == "Bow" || this.invRow1._MainSkill == "Sling" || this.invRow1._MainSkill.Contains("Elixir");
	}

	// Token: 0x060003DF RID: 991 RVA: 0x0005ACE8 File Offset: 0x00058EE8
	public void GetAmmoSlotsNPC(out int slot1, out int slot2, out int slot3, Library.Inventory row)
	{
		slot1 = 0;
		slot2 = 0;
		slot3 = 0;
		for (int i = 0; i < 3; i++)
		{
			int num = this.bag[(i + 4) * 2];
			int num2 = i + 4;
			if (row._MainSkill == "Bow" && row._Ammo1 == "Arrow")
			{
				if (this.bag[num2 * 2] < Links.x.library.arrowsMin || this.bag[num2 * 2] > Links.x.library.arrowsMax || this.bag[num2 * 2] <= 1)
				{
					num = 0;
				}
			}
			else if (row._MainSkill == "Sling" && row._Ammo1 == "Dart")
			{
				if (this.bag[num2 * 2] != Links.x.library.dartsMin)
				{
					num = 0;
				}
			}
			else if (row._MainSkill.Contains("Elixir") && row._Ammo1 != "Dart")
			{
				if (this.bag[num2 * 2] < Links.x.library.vialsMin || this.bag[num2 * 2] > Links.x.library.vialsMin + 1 || this.bag[num2 * 2] <= 1)
				{
					num = 0;
				}
			}
			else
			{
				bool flag = false;
				Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.bag[num2 * 2]);
				if (invRowByIndex._Tag == "Ammunition" && (invRowByIndex._Name == row._Ammo1 || invRowByIndex._Name == row._Ammo2))
				{
					flag = true;
				}
				if (!flag)
				{
					num = 0;
				}
			}
			if (i == 0)
			{
				slot1 = num;
			}
			if (i == 1)
			{
				slot2 = num;
			}
			if (i == 2)
			{
				slot3 = num;
			}
		}
	}

	// Token: 0x060003E0 RID: 992 RVA: 0x0005AEE8 File Offset: 0x000590E8
	public int GetAmmoIndex(Library.Inventory row)
	{
		int num = this.selectedAmmoIndex;
		bool flag = false;
		if (this.selectedAmmoIndex <= 0)
		{
			if (row._MainSkill == "Bow" && row._Ammo1 == "Arrow" && this.bag[8] >= Links.x.library.arrowsMin && this.bag[8] <= Links.x.library.arrowsMax && this.bag[8] > 1)
			{
				return 8;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 == "Dart" && this.bag[8] == Links.x.library.dartsMin)
			{
				return 8;
			}
			if (row._MainSkill.Contains("Elixir") && this.bag[8] >= Links.x.library.vialsMin && this.bag[8] <= Links.x.library.vialsMin + 1 && this.bag[8] > 1)
			{
				return 8;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 != "Dart")
			{
				Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.bag[8]);
				if (invRowByIndex._Tag == "Ammunition" && (invRowByIndex._Name == row._Ammo1 || invRowByIndex._Name == row._Ammo2))
				{
					return 8;
				}
			}
		}
		else if (this.selectedAmmoIndex == 1)
		{
			if (row._MainSkill == "Bow" && row._Ammo1 == "Arrow" && this.bag[10] >= Links.x.library.arrowsMin && this.bag[10] <= Links.x.library.arrowsMax && this.bag[10] > 1)
			{
				return 10;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 == "Dart" && this.bag[10] == Links.x.library.dartsMin)
			{
				return 10;
			}
			if (row._MainSkill.Contains("Elixir") && this.bag[10] >= Links.x.library.vialsMin && this.bag[10] <= Links.x.library.vialsMin + 1 && this.bag[10] > 1)
			{
				return 10;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 != "Dart")
			{
				Library.Inventory invRowByIndex2 = Links.x.library.GetInvRowByIndex(this.bag[10]);
				if (invRowByIndex2._Tag == "Ammunition" && (invRowByIndex2._Name == row._Ammo1 || invRowByIndex2._Name == row._Ammo2))
				{
					return 10;
				}
			}
		}
		else if (this.selectedAmmoIndex == 2)
		{
			if (row._MainSkill == "Bow" && row._Ammo1 == "Arrow" && this.bag[12] >= Links.x.library.arrowsMin && this.bag[12] <= Links.x.library.arrowsMax && this.bag[12] > 1)
			{
				return 12;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 == "Dart" && this.bag[12] == Links.x.library.dartsMin)
			{
				return 12;
			}
			if (row._MainSkill.Contains("Elixir") && this.bag[12] >= Links.x.library.vialsMin && this.bag[12] <= Links.x.library.vialsMin + 1 && this.bag[12] > 1)
			{
				return 12;
			}
			if (row._MainSkill == "Sling" && row._Ammo1 != "Dart")
			{
				Library.Inventory invRowByIndex3 = Links.x.library.GetInvRowByIndex(this.bag[12]);
				if (invRowByIndex3._Tag == "Ammunition" && (invRowByIndex3._Name == row._Ammo1 || invRowByIndex3._Name == row._Ammo2))
				{
					return 12;
				}
			}
		}
		if (!flag)
		{
			if (row._MainSkill == "Bow" && row._Ammo1 == "Arrow")
			{
				for (int i = 4; i < 8; i++)
				{
					if (this.bag[i * 2] >= Links.x.library.arrowsMin && this.bag[i * 2] <= Links.x.library.arrowsMax && this.bag[i * 2] > 1)
					{
						if (i == 4)
						{
							this.selectedAmmoIndex = 0;
						}
						if (i == 5)
						{
							this.selectedAmmoIndex = 1;
						}
						if (i == 6)
						{
							this.selectedAmmoIndex = 2;
						}
						if (this.party && num != this.selectedAmmoIndex)
						{
							this.portrait.skillBag.selectedAmmoIndex = this.selectedAmmoIndex;
							this.portrait.skillBag.SetTrinketGrid(false);
						}
						return i * 2;
					}
				}
			}
			else if (row._MainSkill == "Sling" && row._Ammo1 == "Dart")
			{
				for (int j = 4; j < 8; j++)
				{
					if (this.bag[j * 2] == Links.x.library.dartsMin && this.bag[j * 2] > 1)
					{
						if (j == 4)
						{
							this.selectedAmmoIndex = 0;
						}
						if (j == 5)
						{
							this.selectedAmmoIndex = 1;
						}
						if (j == 6)
						{
							this.selectedAmmoIndex = 2;
						}
						if (this.party && num != this.selectedAmmoIndex)
						{
							this.portrait.skillBag.selectedAmmoIndex = this.selectedAmmoIndex;
							this.portrait.skillBag.SetTrinketGrid(false);
						}
						return j * 2;
					}
				}
			}
			else if (row._MainSkill.Contains("Elixir"))
			{
				for (int k = 4; k < 8; k++)
				{
					if (this.bag[k * 2] >= Links.x.library.vialsMin && this.bag[k * 2] <= Links.x.library.vialsMin + 1 && this.bag[k * 2] > 1)
					{
						if (k == 4)
						{
							this.selectedAmmoIndex = 0;
						}
						if (k == 5)
						{
							this.selectedAmmoIndex = 1;
						}
						if (k == 6)
						{
							this.selectedAmmoIndex = 2;
						}
						if (this.party && num != this.selectedAmmoIndex)
						{
							this.portrait.skillBag.selectedAmmoIndex = this.selectedAmmoIndex;
							this.portrait.skillBag.SetTrinketGrid(false);
						}
						return k * 2;
					}
				}
			}
			else
			{
				for (int l = 4; l < 8; l++)
				{
					Library.Inventory invRowByIndex4 = Links.x.library.GetInvRowByIndex(this.bag[l * 2]);
					if (invRowByIndex4._Tag == "Ammunition" && (invRowByIndex4._Name == row._Ammo1 || invRowByIndex4._Name == row._Ammo2))
					{
						if (l == 4)
						{
							this.selectedAmmoIndex = 0;
						}
						if (l == 5)
						{
							this.selectedAmmoIndex = 1;
						}
						if (l == 6)
						{
							this.selectedAmmoIndex = 2;
						}
						return l * 2;
					}
				}
			}
		}
		if (this.party && num != this.selectedAmmoIndex)
		{
			this.portrait.skillBag.SetTrinketGrid(false);
		}
		return -1;
	}

	// Token: 0x060003E1 RID: 993 RVA: 0x0005B778 File Offset: 0x00059978
	public void UseAmmo(int ammoIndex)
	{
		int num = this.bag[ammoIndex];
		int num2 = this.bag[ammoIndex + 1];
		num2--;
		this.bag[ammoIndex + 1] = num2;
		if (this.party)
		{
			Links.x.inventory.SetBagAmt(ammoIndex / 2, num2, this);
		}
		if (this.bag[ammoIndex + 1] <= 0)
		{
			if (this.party)
			{
				this.bag[ammoIndex] = 0;
				this.bag[ammoIndex + 1] = 0;
				Links.x.inventory.RemoveBagItem(ammoIndex / 2, this);
				this.portrait.skillBag.SetTrinketGrid(false);
			}
			else
			{
				this.bag[ammoIndex] = 0;
				this.bag[ammoIndex + 1] = 0;
			}
			if (this.npc)
			{
				this.LookForAmmoInBag(ammoIndex, this.invRow1._MainSkill, this.invRow1);
			}
		}
		if (this.party)
		{
			this.portrait.skillBag.UpdateAmmoNumbers();
		}
	}

	// Token: 0x060003E2 RID: 994 RVA: 0x0005B884 File Offset: 0x00059A84
	public void LookForAmmoInBag(int ammoIndex, string mainSkill, Library.Inventory weaponRow)
	{
		bool flag = false;
		if (this.npc)
		{
			if (ammoIndex == -1)
			{
				if (this.bag[8] == 0)
				{
					ammoIndex = 8;
				}
				else if (this.bag[10] == 0)
				{
					ammoIndex = 10;
				}
				else
				{
					if (this.bag[12] != 0)
					{
						return;
					}
					ammoIndex = 12;
				}
			}
			int count = this.bag.Count;
			for (int i = 36; i < count; i++)
			{
				if (i % 2 == 0 && !flag)
				{
					Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.bag[i]);
					if (invRowByIndex._Tag == "Ammunition")
					{
						if (mainSkill == "Bow" && weaponRow._Ammo1 == "Arrow")
						{
							if (this.bag[i] >= Links.x.library.arrowsMin && this.bag[i] <= Links.x.library.arrowsMax && this.bag[i] > 1)
							{
								if (this.party && this.inventoryBag)
								{
									this.inventoryBag.SwapBagItem(i / 2, ammoIndex / 2, this, true);
								}
								else
								{
									this.bag[ammoIndex] = this.bag[i];
									this.bag[ammoIndex + 1] = this.bag[i + 1];
								}
							}
						}
						else if (mainSkill == "Sling" && weaponRow._Ammo1 == "Dart")
						{
							if (this.bag[i] == Links.x.library.dartsMin && this.bag[i] > 1)
							{
								if (this.party && this.inventoryBag)
								{
									this.inventoryBag.SwapBagItem(i / 2, ammoIndex / 2, this, true);
								}
								else
								{
									this.bag[ammoIndex] = this.bag[i];
									this.bag[ammoIndex + 1] = this.bag[i + 1];
								}
							}
						}
						else if (mainSkill.Contains("Elixir"))
						{
							if (this.bag[i] >= Links.x.library.vialsMin && this.bag[i] <= Links.x.library.vialsMin + 1 && this.bag[i] > 1)
							{
								if (this.party && this.inventoryBag)
								{
									this.inventoryBag.SwapBagItem(i / 2, ammoIndex / 2, this, true);
								}
								else
								{
									this.bag[ammoIndex] = this.bag[i];
									this.bag[ammoIndex + 1] = this.bag[i + 1];
								}
							}
						}
						else if (invRowByIndex._Name == weaponRow._Ammo1 || invRowByIndex._Name == weaponRow._Ammo2)
						{
							if (this.party && this.inventoryBag)
							{
								this.inventoryBag.SwapBagItem(i / 2, ammoIndex / 2, this, true);
							}
							else
							{
								this.bag[ammoIndex] = this.bag[i];
								this.bag[ammoIndex + 1] = this.bag[i + 1];
							}
						}
					}
				}
			}
		}
	}

	// Token: 0x060003E3 RID: 995 RVA: 0x0005BC28 File Offset: 0x00059E28
	public void RemoveEnchantedJewelryDurability()
	{
		int num = 8;
		if (this.sockets[num * 2].x != 0f)
		{
			Vector3 vector = this.sockets[num * 2 + 1];
		}
		num = 10;
		if (this.sockets[num * 2].x != 0f)
		{
			Vector3 vector2 = this.sockets[num * 2 + 1];
		}
		num = 11;
		if (this.sockets[num * 2].x != 0f)
		{
			Vector3 vector3 = this.sockets[num * 2 + 1];
		}
		num = 12;
		if (this.sockets[num * 2].x != 0f)
		{
			Vector3 vector4 = this.sockets[num * 2 + 1];
		}
	}

	// Token: 0x060003E4 RID: 996 RVA: 0x0005BCEC File Offset: 0x00059EEC
	public void UpdateArmor(int subtractChunk)
	{
		if (this.stamina)
		{
			Vector4 vector = this.durability[9];
			float num = (float)this.stamina.maxArmor / 7f * (float)subtractChunk;
			vector.x -= num;
			if (vector.x < 0f)
			{
				vector.x = 0f;
			}
			this.durability[9] = vector;
			this.stamina.UpdateArmor((int)this.durability[9].x);
		}
	}

	// Token: 0x060003E5 RID: 997 RVA: 0x0005BD7C File Offset: 0x00059F7C
	public void UpdateDurability(int index, int loss, bool isShield, bool physicalDurability)
	{
		if (this.bag[index * 2] > 1)
		{
			int num = (int)this.durability[index].x;
			if (this.invRow1._DurabilityMax < 0)
			{
				return;
			}
			if (index == 0 && this.invRow1._DurabilityMax < 0)
			{
				return;
			}
			num -= loss;
			if (num < 0)
			{
				num = 0;
			}
			this.durability[index] = new Vector4((float)num, this.durability[index].y, this.durability[index].z, this.durability[index].w);
			if (index == 9 && this.stamina && this.stamina.hasArmor)
			{
				this.stamina.UpdateArmor((int)this.durability[index].x);
			}
			if (this.party && this.inventoryBag)
			{
				this.inventoryBag.SetDurability(this.durability[index], index);
				ItemEquipped itemEquipped = this.body.GetItemEquipped(index);
				if (itemEquipped)
				{
					itemEquipped.durability = this.durability[index];
				}
				if (num <= 0)
				{
					if (index < 4 && !isShield)
					{
						this.str.Clear();
						this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
						this.str.Append(this.stats.GetName());
						this.str.Append("</color>");
						this.str.Append("'s weapon needs to be repaired");
						Links.x.gameFeed.AddFeed(this.str.ToString());
					}
					else if (index < 4 && isShield)
					{
						this.str.Clear();
						this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
						this.str.Append(this.stats.GetName());
						this.str.Append("</color>");
						this.str.Append("'s shield needs to be repaired");
						Links.x.gameFeed.AddFeed(this.str.ToString());
					}
					else
					{
						this.str.Clear();
						this.str.Append(Links.x.gameFeed.GetPartyColorText(this));
						this.str.Append(this.stats.GetName());
						this.str.Append("</color>");
						this.str.Append("'s armor needs to be repaired");
						Links.x.gameFeed.AddFeed(this.str.ToString());
					}
					MasterAudio.PlaySound3DAtVector3AndForget("Armor Break", this.tr.position, 1f, new float?(1f), 0f, "", null);
				}
				if (num <= Records.x.durabilityThreshold)
				{
					this.ChangeDurabilityVisual(index);
				}
				if (this.portrait)
				{
					this.portrait.SetWpnDurabilityColor();
				}
			}
			if ((index == 8 || index == 10 || index == 11 || index == 12) && num <= 0)
			{
				this.stats.EnchantJewelryEffects(index * 2, false);
			}
		}
	}

	// Token: 0x060003E6 RID: 998 RVA: 0x0005C0D8 File Offset: 0x0005A2D8
	public void ChangeDurabilityVisual(int index)
	{
		if (this.durability[index].x <= (float)Records.x.durabilityThreshold)
		{
			GameObject gameObject = this.equippedItems[index];
			if (gameObject && gameObject.GetComponent<MeshRenderer>())
			{
				gameObject.GetComponent<MeshRenderer>().material.SetFloat("_Glow", 1f);
			}
		}
		else
		{
			GameObject gameObject2 = this.equippedItems[index];
			if (gameObject2 && gameObject2.GetComponent<MeshRenderer>())
			{
				gameObject2.GetComponent<MeshRenderer>().material.SetFloat("_Glow", 0f);
			}
		}
		if (this.portrait)
		{
			this.portrait.SetWpnDurabilityColor();
		}
	}

	// Token: 0x060003E7 RID: 999 RVA: 0x0005C190 File Offset: 0x0005A390
	public void UseQuickItem(int index)
	{
		int invNum = this.GetInvNum(index * 2);
		if (invNum > 1)
		{
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(invNum);
			if (this.hasActions)
			{
				this.actions.spellScroll = null;
			}
			if (Records.x.pocketPause && !this.mainSelected && (invRowByIndex._Name.Contains("SpellScroll") || invRowByIndex._Name.Contains("PaganScroll")))
			{
				return;
			}
			Links.x.inventory.UseBeltItem(index, this);
			if (this.portrait && !this.hasActions)
			{
				this.portrait.QueueIcon(false);
			}
		}
	}

	// Token: 0x060003E8 RID: 1000 RVA: 0x0005C240 File Offset: 0x0005A440
	public bool ItemHasSocket(int index)
	{
		Vector3 vector = this.sockets[index];
		Vector3 vector2 = this.sockets[index + 1];
		return vector.x > 0f || vector.y > 0f || vector.z > 0f || (vector2.x > 0f || vector2.y > 0f || vector2.z > 0f);
	}

	// Token: 0x060003E9 RID: 1001 RVA: 0x0005C2BC File Offset: 0x0005A4BC
	public int HasSocket(int itemIndex, int socketNum)
	{
		Vector3 vector = this.sockets[itemIndex];
		Vector3 vector2 = this.sockets[itemIndex + 1];
		if (socketNum == 0)
		{
			return (int)vector.x;
		}
		if (socketNum == 1)
		{
			return (int)vector.y;
		}
		if (socketNum == 2)
		{
			return (int)vector.z;
		}
		if (socketNum == 3)
		{
			return (int)vector2.x;
		}
		if (socketNum == 4)
		{
			return (int)vector2.y;
		}
		if (socketNum == 5)
		{
			return (int)vector2.z;
		}
		return 0;
	}

	// Token: 0x060003EA RID: 1002 RVA: 0x0005C32D File Offset: 0x0005A52D
	public int GetInstrumentRow()
	{
		return this.instrumentInUse;
	}

	// Token: 0x060003EB RID: 1003 RVA: 0x0005C338 File Offset: 0x0005A538
	public int InstrumentTypeIndex(string type)
	{
		int invNum = this.GetInvNum(14);
		if (Links.x.library.GetInvRow(invNum)._MainSkill == type)
		{
			return 7;
		}
		int invNum2 = this.GetInvNum(26);
		if (Links.x.library.GetInvRow(invNum2)._MainSkill == type)
		{
			return 13;
		}
		int invNum3 = this.GetInvNum(28);
		if (Links.x.library.GetInvRow(invNum3)._MainSkill == type)
		{
			return 14;
		}
		return -1;
	}

	// Token: 0x060003EC RID: 1004 RVA: 0x0005C3C0 File Offset: 0x0005A5C0
	public int HasRosary()
	{
		int num = this.GetInvNum(14);
		if (num > 0 && Links.x.library.GetInvRow(num)._MainSkill.Contains("Charm"))
		{
			return 7;
		}
		num = this.GetInvNum(26);
		if (num > 0 && Links.x.library.GetInvRow(num)._MainSkill.Contains("Charm"))
		{
			return 13;
		}
		num = this.GetInvNum(28);
		if (num > 0 && Links.x.library.GetInvRow(num)._MainSkill.Contains("Charm"))
		{
			return 14;
		}
		return -1;
	}

	// Token: 0x060003ED RID: 1005 RVA: 0x0005C460 File Offset: 0x0005A660
	public bool HasInstrument()
	{
		int invNum = this.GetInvNum(14);
		Library.Inventory invRow = Links.x.library.GetInvRow(invNum);
		int invNum2 = this.GetInvNum(26);
		Library.Inventory invRow2 = Links.x.library.GetInvRow(invNum2);
		int invNum3 = this.GetInvNum(28);
		Library.Inventory invRow3 = Links.x.library.GetInvRow(invNum3);
		for (int i = 0; i < 3; i++)
		{
			Library.Inventory inventory = invRow;
			if (i == 1)
			{
				inventory = invRow2;
			}
			if (i == 2)
			{
				inventory = invRow3;
			}
			if (inventory._MainSkill.Contains("Flute") || inventory._MainSkill.Contains("Drum") || inventory._MainSkill.Contains("Horn") || inventory._MainSkill.Contains("Pipe"))
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060003EE RID: 1006 RVA: 0x0005C534 File Offset: 0x0005A734
	public bool HasInstrumentType(string n)
	{
		int invNum = this.GetInvNum(14);
		Library.Inventory invRow = Links.x.library.GetInvRow(invNum);
		int invNum2 = this.GetInvNum(26);
		Library.Inventory invRow2 = Links.x.library.GetInvRow(invNum2);
		int invNum3 = this.GetInvNum(28);
		Library.Inventory invRow3 = Links.x.library.GetInvRow(invNum3);
		for (int i = 0; i < 3; i++)
		{
			Library.Inventory inventory = invRow;
			if (i == 1)
			{
				inventory = invRow2;
			}
			if (i == 2)
			{
				inventory = invRow3;
			}
			if (inventory._MainSkill.Contains(n))
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060003EF RID: 1007 RVA: 0x0005C5C8 File Offset: 0x0005A7C8
	public Library.Inventory GetInstrumentType(string n)
	{
		int invNum = this.GetInvNum(14);
		Library.Inventory invRow = Links.x.library.GetInvRow(invNum);
		int invNum2 = this.GetInvNum(26);
		Library.Inventory invRow2 = Links.x.library.GetInvRow(invNum2);
		int invNum3 = this.GetInvNum(28);
		Library.Inventory invRow3 = Links.x.library.GetInvRow(invNum3);
		for (int i = 0; i < 3; i++)
		{
			Library.Inventory inventory = invRow;
			if (i == 1)
			{
				inventory = invRow2;
			}
			if (i == 2)
			{
				inventory = invRow3;
			}
			if (inventory._MainSkill.Contains(n))
			{
				return inventory;
			}
		}
		return null;
	}

	// Token: 0x060003F0 RID: 1008 RVA: 0x0005C65D File Offset: 0x0005A85D
	public int GetInvNum(int rowID)
	{
		return this.bag[rowID];
	}

	// Token: 0x060003F1 RID: 1009 RVA: 0x0005C66C File Offset: 0x0005A86C
	public float GetAllSockets(int rowID)
	{
		Vector3 vector = this.sockets[rowID];
		Vector3 vector2 = this.sockets[rowID + 1];
		return vector.x + vector.y + vector.z + vector2.x + vector2.y + vector2.z;
	}

	// Token: 0x060003F2 RID: 1010 RVA: 0x0005C6BE File Offset: 0x0005A8BE
	public Vector3 GetSocketNum(int rowID)
	{
		return this.sockets[rowID];
	}

	// Token: 0x060003F3 RID: 1011 RVA: 0x0005C6CC File Offset: 0x0005A8CC
	public Vector4 GetDurabilityNum(int rowID)
	{
		return this.durability[rowID];
	}

	// Token: 0x060003F4 RID: 1012 RVA: 0x0005C6DA File Offset: 0x0005A8DA
	public void SetInvNum(int rowID, int total)
	{
		this.bag[rowID] = total;
	}

	// Token: 0x060003F5 RID: 1013 RVA: 0x0005C6EC File Offset: 0x0005A8EC
	public void SetSocketNum(int rowID, int total, int id)
	{
		Vector3 vector = this.sockets[rowID];
		if (id == 0)
		{
			vector.x = (float)total;
		}
		if (id == 1)
		{
			vector.y = (float)total;
		}
		if (id == 2)
		{
			vector.z = (float)total;
		}
		this.sockets[rowID] = vector;
	}

	// Token: 0x060003F6 RID: 1014 RVA: 0x0005C73C File Offset: 0x0005A93C
	public void SwitchItem(int from, int to)
	{
		int num = this.bag[to];
		int num2 = this.bag[to + 2];
		Vector3 vector = this.sockets[to];
		Vector3 vector2 = this.sockets[to + 1];
		int num3 = this.bagPositions[to / 2];
		Vector4 vector3 = this.durability[to / 2];
		int num4 = this.bag[from];
		int num5 = this.bag[from + 1];
		Vector3 vector4 = this.sockets[from];
		Vector3 vector5 = this.sockets[from + 1];
		int num6 = this.bagPositions[from / 2];
		Vector4 vector6 = this.durability[from / 2];
		this.bag[from] = num;
		this.bag[from + 1] = num2;
		this.sockets[from] = vector;
		this.sockets[from + 1] = vector2;
		this.bagPositions[from / 2] = num3;
		this.durability[from / 2] = vector3;
		this.bag[to] = num4;
		this.bag[to + 1] = num5;
		this.sockets[to] = vector4;
		this.sockets[to + 1] = vector5;
		this.bagPositions[to / 2] = num6;
		this.durability[to / 2] = vector6;
		if (this.party)
		{
			this.inventoryBag.SwapBagItem(from / 2, to / 2, this, false);
		}
		if (this.party && this.portrait)
		{
			this.portrait.skillBag.SetSelectedWpnIndex(this.selectedWpnIndex);
		}
	}

	// Token: 0x060003F7 RID: 1015 RVA: 0x0005C8F8 File Offset: 0x0005AAF8
	public void SwitchWeaponsRows()
	{
		Library.Inventory inventory = this.altInvRow1;
		this.altInvRow1 = this.invRow1;
		this.invRow1 = inventory;
		inventory = this.altInvRow2;
		this.altInvRow2 = this.invRow2;
		this.invRow2 = inventory;
		inventory = this.altInvRow3;
		this.altInvRow3 = this.invRow3;
		this.invRow3 = inventory;
		inventory = this.altInvRow4;
		this.altInvRow4 = this.invRow4;
		this.invRow4 = inventory;
	}

	// Token: 0x060003F8 RID: 1016 RVA: 0x0005C970 File Offset: 0x0005AB70
	public void UpdateWeaponVisuals()
	{
		this.CreateEquippedItems(this.bag[2], this.bag[3], this.sockets[2], this.sockets[3], 2, true);
		this.CreateEquippedItems(this.bag[4], this.bag[5], this.sockets[4], this.sockets[5], 4, true);
		this.CreateEquippedItems(this.bag[6], this.bag[7], this.sockets[6], this.sockets[7], 6, true);
		this.CreateEquippedItems(this.bag[0], this.bag[1], this.sockets[0], this.sockets[1], 0, true);
		this.stats.UpdateAbilityTriggers();
	}

	// Token: 0x060003F9 RID: 1017 RVA: 0x0005CA68 File Offset: 0x0005AC68
	public void GetAlternativeWeaponRows()
	{
		if (this.bag[32] >= 1)
		{
			this.altInvRow1 = Links.x.library.GetInvRowByIndex(this.bag[32]);
		}
		if (this.bag[34] >= 1)
		{
			this.altInvRow2 = Links.x.library.GetInvRowByIndex(this.bag[34]);
		}
		if (this.bag[36] >= 1)
		{
			this.altInvRow3 = Links.x.library.GetInvRowByIndex(this.bag[34]);
		}
		if (this.bag[30] >= 1)
		{
			this.altInvRow4 = Links.x.library.GetInvRowByIndex(this.bag[30]);
		}
	}

	// Token: 0x060003FA RID: 1018 RVA: 0x0005CB40 File Offset: 0x0005AD40
	public bool RemoveItem(int itemID, int amt)
	{
		if (this.npc)
		{
			int num = this.HasItem(itemID);
			if (num > -1)
			{
				if (this.bag[num + 1] <= 1)
				{
					this.bag[num] = 0;
					this.bag[num + 1] = 0;
					this.sockets[num] = Vector3.zero;
					this.sockets[num + 1] = Vector3.zero;
					this.bagPositions[num / 2] = 0;
					this.durability[num / 2] = Vector4.zero;
				}
				else
				{
					this.bag[num + 1] = this.bag[num + 1] - 1;
				}
				return true;
			}
			return false;
		}
		else
		{
			global::Item item = Links.x.inventory.CheckListForItem(itemID, this);
			int num2 = Links.x.inventory.GetBagIndex(item, this);
			if (item)
			{
				if (item.stackable)
				{
					if (amt == 1)
					{
						if (item.stackSize == 1)
						{
							item.DestroyItem(true, false);
							Links.x.inventory.RemoveBagItem(num2, this);
						}
						else
						{
							item.stackSize--;
							Links.x.inventory.SetBagAmt(item, item.stackSize, this);
							item.CheckStackSize();
						}
					}
					else if (item.stackSize == amt)
					{
						item.DestroyItem(true, false);
						Links.x.inventory.RemoveBagItem(num2, this);
					}
					else if (item.stackSize > amt)
					{
						item.stackSize -= amt;
						Links.x.inventory.SetBagAmt(item, item.stackSize, this);
						item.CheckStackSize();
					}
					else
					{
						int num3 = amt - item.stackSize;
						item.DestroyItem(true, false);
						Links.x.inventory.RemoveBagItem(num2, this);
						for (int i = 0; i < 100; i++)
						{
							if (num3 > 0)
							{
								item = Links.x.inventory.CheckListForItem(itemID, this);
								num2 = Links.x.inventory.GetBagIndex(item, this);
								if (item)
								{
									if (item.stackSize > num3)
									{
										item.stackSize -= num3;
										Links.x.inventory.SetBagAmt(item, item.stackSize, this);
										item.CheckStackSize();
										num3 = 0;
									}
									else
									{
										num3 -= item.stackSize;
										item.DestroyItem(true, false);
										Links.x.inventory.RemoveBagItem(num2, this);
									}
								}
							}
						}
					}
				}
				else
				{
					item.DestroyItem(true, false);
					Links.x.inventory.RemoveBagItem(num2, this);
				}
				if (this.portrait && num2 < 36)
				{
					this.portrait.skillBag.SetTrinketGrid(false);
				}
				return true;
			}
			num2 = this.HasItem(itemID);
			if (num2 < 36 && num2 > -1)
			{
				if (this.bag[num2 + 1] <= 1)
				{
					this.bag[num2] = 0;
					this.bag[num2 + 1] = 0;
					this.sockets[num2] = Vector3.zero;
					this.sockets[num2 + 1] = Vector3.zero;
					this.bagPositions[num2 / 2] = 0;
					this.durability[num2 / 2] = Vector4.zero;
					this.CreateEquippedItems(this.bag[num2], this.bag[num2 + 1], this.sockets[num2], this.sockets[num2 + 1], num2, true);
					this.UpdateInvLists("", num2 / 2, this.bag[num2], this.bag[num2 + 1], this.durability[num2 / 2], this.sockets[num2], this.sockets[num2 + 1], null);
				}
				else
				{
					this.bag[num2 + 1] = this.bag[num2 + 1] - 1;
					Links.x.inventory.SetListItems(num2 / 2, null, this.bag[num2], this.bag[num2 + 1], this.sockets[num2], this.sockets[num2 + 1], this.bagPositions[num2 / 2], this.durability[num2 / 2], this);
				}
			}
			if (this.portrait && this.portrait.skillBag)
			{
				this.portrait.skillBag.SetTrinketGrid(false);
			}
			return false;
		}
	}

	// Token: 0x060003FB RID: 1019 RVA: 0x0005CFCC File Offset: 0x0005B1CC
	public void UpdateInvLists(string type, int invIndex, int newID, int newAmt, Vector4 dur, Vector3 socketA, Vector3 socketB, global::Item newItem)
	{
		if (invIndex * 2 + 2 >= this.bag.Count || invIndex <= -1)
		{
			return;
		}
		this.bag[invIndex * 2] = newID;
		this.bag[invIndex * 2 + 1] = newAmt;
		this.sockets[invIndex * 2] = socketA;
		this.sockets[invIndex * 2 + 1] = socketB;
		this.durability[invIndex] = dur;
		if (!this.npc)
		{
			bool flag = false;
			if (newItem && newAmt == 0 && newItem.stackable)
			{
				flag = true;
			}
			if (flag || newID == 0 || type == "BagRemove")
			{
				Links.x.inventory.SetListItems(invIndex, null, newID, 0, Vector3.zero, Vector3.zero, 0, Vector4.zero, this);
				if (newID == 0 && (invIndex == 0 || invIndex == 2))
				{
					Links.x.inventory.SetListItems(invIndex, null, newID, 0, Vector3.zero, Vector3.zero, 0, Vector4.zero, this);
					Links.x.inventory.CreateFist(invIndex, true, this, null, true);
				}
				if (newItem)
				{
					newItem.DestroyItem(false, false);
				}
				if (invIndex < 18)
				{
					this.CreateEquippedItems(this.bag[invIndex * 2], this.bag[invIndex * 2 + 1], this.sockets[invIndex * 2], this.sockets[invIndex * 2 + 1], invIndex * 2, true);
					return;
				}
			}
			else if (newItem)
			{
				Links.x.inventory.SetListItems(invIndex, newItem, newID, newAmt, socketA, socketB, 0, newItem.durability, this);
				if (newItem)
				{
					newItem.stackSize = Links.x.inventory.GetBagAmt(invIndex);
					newItem.CheckStackSize();
				}
			}
		}
	}

	// Token: 0x060003FC RID: 1020 RVA: 0x0005D198 File Offset: 0x0005B398
	public void AddTorch()
	{
		if (!this.hasTorch)
		{
			this.stats.AddBlind(-10f);
		}
		if (!this.moonlight)
		{
			Light light = base.gameObject.GetComponent<Light>();
			if (!light)
			{
				light = base.gameObject.AddComponent<Light>();
			}
			light.color = Links.x.torchColor;
			light.type = LightType.Point;
			light.range = 10f;
			light.enabled = false;
			this.moonlight = base.gameObject.GetComponent<Moonlight>();
			if (!this.moonlight)
			{
				this.moonlight = base.gameObject.AddComponent<Moonlight>();
			}
			if (this.desiredGraph == 1)
			{
				this.moonlight.interiorLight = true;
			}
			if (this.party)
			{
				this.moonlight.characterID = Links.x.GetPartyID(this);
			}
			else
			{
				this.moonlight.characterID = -1;
			}
			this.moonlight.yOffset = 4f;
			this.moonlight.dynamicLight = true;
		}
		else
		{
			this.moonlight.l.color = Links.x.torchColor;
			this.moonlight.SetColor();
		}
		this.hasTorch = true;
		Links.x.fellowship.SetPartyLightColor();
	}

	// Token: 0x060003FD RID: 1021 RVA: 0x0005D2E0 File Offset: 0x0005B4E0
	public void ChangeTorchLight()
	{
		if (this.hasTorch || this.hasLight || this.hasIncenseTorch)
		{
			this.moonlight = base.gameObject.GetComponent<Moonlight>();
			if (this.indoorID != "" || Links.x.diorama.underground)
			{
				this.moonlight.interiorLight = true;
			}
			else
			{
				this.moonlight.interiorLight = false;
			}
			this.moonlight.SetupLight(true);
			if (this.hasIncenseTorch)
			{
				this.moonlight = this.incense.gameObject.GetComponent<Moonlight>();
				if (this.indoorID != "" || Links.x.diorama.underground)
				{
					this.moonlight.interiorLight = true;
				}
				else
				{
					this.moonlight.interiorLight = false;
				}
				this.moonlight.SetupLight(true);
			}
		}
	}

	// Token: 0x060003FE RID: 1022 RVA: 0x0005D3CC File Offset: 0x0005B5CC
	public void RemoveTorch()
	{
		if (this.hasTorch)
		{
			this.stats.AddBlind(10f);
		}
		Light component = base.gameObject.GetComponent<Light>();
		if (!this.party)
		{
			if (component)
			{
				Object.Destroy(component);
			}
			this.moonlight = base.gameObject.GetComponent<Moonlight>();
			if (this.moonlight)
			{
				Object.Destroy(this.moonlight);
			}
			MoonlightRevealer component2 = base.gameObject.GetComponent<MoonlightRevealer>();
			if (component2)
			{
				Object.Destroy(component2);
			}
		}
		else
		{
			this.moonlight.l.color = Links.x.partyLightColor;
			this.moonlight.SetColor();
		}
		this.hasTorch = false;
		if (this.party)
		{
			Links.x.fellowship.SetPartyLightColor();
		}
	}

	// Token: 0x060003FF RID: 1023 RVA: 0x0005D49C File Offset: 0x0005B69C
	public void AddIncenseTorch()
	{
		if (!this.hasIncenseTorch)
		{
			this.incense = new GameObject("Incense");
			this.incense.transform.SetParent(this.tr);
			this.incense.transform.localPosition = Vector3.zero;
			this.incense.AddComponent<EnvironmentNodes>().isDynamic = true;
			this.hasIncenseTorch = true;
			Light light = this.incense.gameObject.GetComponent<Light>();
			if (!light)
			{
				light = this.incense.gameObject.AddComponent<Light>();
			}
			light.color = Links.x.incenseTorchColor;
			light.type = LightType.Point;
			light.range = 4f;
			light.enabled = false;
			Moonlight moonlight = this.incense.gameObject.GetComponent<Moonlight>();
			if (!moonlight)
			{
				moonlight = this.incense.gameObject.AddComponent<Moonlight>();
			}
			if (this.desiredGraph == 1 || Links.x.diorama.underground)
			{
				moonlight.interiorLight = true;
			}
			moonlight.yOffset = 4f;
			moonlight.dynamicLight = true;
		}
	}

	// Token: 0x06000400 RID: 1024 RVA: 0x0005D5B7 File Offset: 0x0005B7B7
	public void RemoveIncenseTorch()
	{
		this.hasIncenseTorch = false;
		if (this.incense)
		{
			this.incense.GetComponent<EnvironmentNodes>().Remove();
			Object.Destroy(this.incense);
		}
	}

	// Token: 0x06000401 RID: 1025 RVA: 0x0005D5E8 File Offset: 0x0005B7E8
	private IEnumerator PlayerLight()
	{
		yield return new WaitForSecondsRealtime(0.1f);
		this.AddPlayerLight();
		yield break;
	}

	// Token: 0x06000402 RID: 1026 RVA: 0x0005D5F8 File Offset: 0x0005B7F8
	public void AddPlayerLight()
	{
		this.hasLight = true;
		if (!this.moonlight)
		{
			Light light = base.gameObject.GetComponent<Light>();
			if (!light)
			{
				light = base.gameObject.AddComponent<Light>();
			}
			light.color = Links.x.partyLightColor;
			light.type = LightType.Point;
			light.range = 10f;
			light.enabled = false;
			this.moonlight = base.gameObject.GetComponent<Moonlight>();
			if (!this.moonlight)
			{
				this.moonlight = base.gameObject.AddComponent<Moonlight>();
			}
			if (this.desiredGraph == 1 || Links.x.diorama.underground)
			{
				this.moonlight.interiorLight = true;
			}
			if (this.party)
			{
				this.moonlight.characterID = Links.x.GetPartyID(this);
			}
			else
			{
				this.moonlight.characterID = -1;
			}
			this.moonlight.yOffset = 4f;
			this.moonlight.dynamicLight = true;
		}
		if (this.hasTorch)
		{
			this.moonlight.l.color = Links.x.torchColor;
			this.moonlight.SetColor();
		}
		else
		{
			this.moonlight.l.color = Links.x.partyLightColor;
			this.moonlight.SetColor();
		}
		Links.x.fellowship.SetPartyLightColor();
	}

	// Token: 0x06000403 RID: 1027 RVA: 0x0005D768 File Offset: 0x0005B968
	public void RemovePlayerLight()
	{
		this.hasLight = false;
		Light component = base.gameObject.GetComponent<Light>();
		if (component)
		{
			Object.Destroy(component);
		}
		this.moonlight = base.gameObject.GetComponent<Moonlight>();
		if (this.moonlight)
		{
			Object.Destroy(this.moonlight);
		}
		MoonlightRevealer component2 = base.gameObject.GetComponent<MoonlightRevealer>();
		if (component2)
		{
			Object.Destroy(component2);
		}
		base.StartCoroutine(this.PlayerLight());
	}

	// Token: 0x06000404 RID: 1028 RVA: 0x0005D7E8 File Offset: 0x0005B9E8
	public int GetGlam()
	{
		return (int)(0f + Links.x.library.GetInvRowByIndex(this.GetInvNum(16))._AC + Links.x.library.GetInvRowByIndex(this.GetInvNum(20))._AC + Links.x.library.GetInvRowByIndex(this.GetInvNum(22))._AC + Links.x.library.GetInvRowByIndex(this.GetInvNum(24))._AC);
	}

	// Token: 0x06000405 RID: 1029 RVA: 0x0005D874 File Offset: 0x0005BA74
	public int GetMagicAC()
	{
		return 0 + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(2))._MagicAC + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(14))._MagicAC + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(16))._MagicAC + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(18))._MagicAC + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(20))._MagicAC + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(22))._MagicAC + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(24))._MagicAC;
	}

	// Token: 0x06000406 RID: 1030 RVA: 0x0005D954 File Offset: 0x0005BB54
	public int GetMagicItems()
	{
		return 0 + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(2))._MagicBonus + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(14))._MagicBonus + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(16))._MagicBonus + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(18))._MagicBonus + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(20))._MagicBonus + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(22))._MagicBonus + (int)Links.x.library.GetInvRowByIndex(this.GetInvNum(24))._MagicBonus;
	}

	// Token: 0x06000407 RID: 1031 RVA: 0x0005DA34 File Offset: 0x0005BC34
	public int ItemAmount(int ID)
	{
		int num = 0;
		for (int i = 0; i < this.bag.Count; i++)
		{
			if (this.bag[i] == ID && i % 2 == 0)
			{
				num += this.bag[i + 1];
			}
		}
		return num;
	}

	// Token: 0x06000408 RID: 1032 RVA: 0x0005DA80 File Offset: 0x0005BC80
	public int HasItem(int ID)
	{
		for (int i = 0; i < this.bag.Count; i++)
		{
			if (this.bag[i] == ID && i % 2 == 0)
			{
				return i;
			}
		}
		return -1;
	}

	// Token: 0x06000409 RID: 1033 RVA: 0x0005DABC File Offset: 0x0005BCBC
	public int HasBook(int ID)
	{
		for (int i = 0; i < this.bag.Count; i++)
		{
			if (this.bag[i] == ID && i % 2 == 0 && this.sockets[i].x == (float)this.stats.partyID)
			{
				return i;
			}
		}
		return -1;
	}

	// Token: 0x0600040A RID: 1034 RVA: 0x0005DB18 File Offset: 0x0005BD18
	public int HasItemInBag(int ID)
	{
		for (int i = 0; i < this.bag.Count; i++)
		{
			if (this.bag[i] == ID && i % 2 == 0)
			{
				return i;
			}
		}
		return -1;
	}

	// Token: 0x0600040B RID: 1035 RVA: 0x0005DB54 File Offset: 0x0005BD54
	public int HasItemInBagOnly(int ID)
	{
		for (int i = 18; i < this.bag.Count; i++)
		{
			if (this.bag[i] == ID && i % 2 == 0)
			{
				return i;
			}
		}
		return -1;
	}

	// Token: 0x0600040C RID: 1036 RVA: 0x0005DB90 File Offset: 0x0005BD90
	public int HowManyItemsInBag(int ID, int checkFrom)
	{
		int num = 0;
		for (int i = checkFrom; i < this.bag.Count; i++)
		{
			if (this.bag[i] == ID && i % 2 == 0)
			{
				num += this.bag[i + 1];
				if (this.bag[i + 1] == 0)
				{
					num++;
				}
			}
		}
		return num;
	}

	// Token: 0x0600040D RID: 1037 RVA: 0x0005DBF0 File Offset: 0x0005BDF0
	public int HasHealthItem()
	{
		if (this.npc)
		{
			for (int i = 0; i < this.bag.Count; i++)
			{
				if (i % 2 == 0 && Links.x.library.GetInvRowByIndex(this.bag[i])._Effect.Contains("Health"))
				{
					return i;
				}
			}
		}
		else
		{
			if (this.bag[14] > 1)
			{
				Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.bag[14]);
				if (inventory._Effect.Contains("Health") && inventory._Tag == "Consumable")
				{
					return 14;
				}
			}
			if (this.bag[26] > 1)
			{
				Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.bag[26]);
				if (inventory._Effect.Contains("Health") && inventory._Tag == "Consumable")
				{
					return 26;
				}
			}
			if (this.bag[28] > 1)
			{
				Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.bag[28]);
				if (inventory._Effect.Contains("Health") && inventory._Tag == "Consumable")
				{
					return 28;
				}
			}
		}
		return -1;
	}

	// Token: 0x0600040E RID: 1038 RVA: 0x0005DD54 File Offset: 0x0005BF54
	private bool IsBuffItem(string n)
	{
		if (this.npc)
		{
			if (n.Contains("Spirit"))
			{
				return true;
			}
		}
		else if (n.Contains("Spirit") && this.stats.HasSpellbook() && this.stats.SpiritCurrent() < 30)
		{
			float num = (float)this.stats.HealthCurrent() / (float)this.stats.HealthMax();
			if (!n.Contains("Health") || (n.Contains("Health") && num < (float)this.stats.useItemsAI))
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x0600040F RID: 1039 RVA: 0x0005DDE8 File Offset: 0x0005BFE8
	public int HasBuffItem()
	{
		if (this.npc)
		{
			bool flag = false;
			for (int i = 0; i < this.bag.Count; i++)
			{
				if (i % 2 == 0)
				{
					Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.bag[i]);
					if (invRowByIndex._Tag == "Consumable" && this.IsBuffItem(invRowByIndex._Effect))
					{
						return -1;
					}
				}
			}
			this.stats.hasBuffItem = flag;
		}
		else
		{
			if (this.bag[14] > 1)
			{
				Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.bag[14]);
				if (inventory._Tag == "Consumable" && this.IsBuffItem(inventory._Effect))
				{
					return 14;
				}
			}
			if (this.bag[26] > 1)
			{
				Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.bag[26]);
				if (inventory._Tag == "Consumable" && this.IsBuffItem(inventory._Effect))
				{
					return 26;
				}
			}
			if (this.bag[28] > 1)
			{
				Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.bag[28]);
				if (inventory._Tag == "Consumable" && this.IsBuffItem(inventory._Effect))
				{
					return 28;
				}
			}
		}
		return -1;
	}

	// Token: 0x06000410 RID: 1040 RVA: 0x0005DF60 File Offset: 0x0005C160
	public int BuffItemID(string type)
	{
		for (int i = 0; i < this.bag.Count; i++)
		{
			if (i % 2 == 0 && Links.x.library.GetInvRowByIndex(this.bag[i])._Effect.Contains(type))
			{
				return this.bag[i];
			}
		}
		return -1;
	}

	// Token: 0x06000411 RID: 1041 RVA: 0x0005DFC0 File Offset: 0x0005C1C0
	public int GiveItem(int ID, int stackSize, Vector3 socketA, Vector3 socketB, Vector4 time, bool fromSomeone)
	{
		Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(ID);
		int num = this.HasItem(ID);
		if (num > -1 && invRowByIndex._Stackable && this.bag[num + 2] + stackSize < invRowByIndex._MaxStackSize)
		{
			List<int> list = this.bag;
			int num2 = num + 2;
			list[num2] += stackSize;
			return -1;
		}
		int num3 = this.FreeBagID();
		if (this.CheckControls() && !this.stats.animal && fromSomeone)
		{
			this.StartQuip("Thanks");
		}
		if (num3 == -1)
		{
			this.bag.Add(0);
			this.bag.Add(0);
			this.sockets.Add(Vector3.zero);
			this.sockets.Add(Vector3.zero);
			this.durability.Add(Vector4.zero);
			num3 = this.FreeBagID();
		}
		if (invRowByIndex._Tag == "Weapon" && this.bag[0] <= 1)
		{
			int num4 = this.bag[0];
			int num5 = this.bag[1];
			Vector3 vector = this.sockets[0];
			Vector3 vector2 = this.sockets[1];
			this.bag[0] = ID;
			this.bag[1] = stackSize;
			this.sockets[0] = socketA;
			this.sockets[1] = socketB;
			if (num4 > 1)
			{
				this.bag[num3] = num4;
				this.bag[num3 + 1] = num5;
				this.sockets[num3] = vector;
				this.sockets[num3 + 1] = vector2;
			}
			num3 = 0;
			if (!this.stats.animal && fromSomeone)
			{
				this.StartQuip("I could use this");
			}
		}
		else if (invRowByIndex._Tag == "Shield" && this.bag[1] <= 1)
		{
			int num6 = this.bag[2];
			int num7 = this.bag[3];
			Vector3 vector3 = this.sockets[2];
			Vector3 vector4 = this.sockets[3];
			this.bag[2] = ID;
			this.bag[3] = stackSize;
			this.sockets[2] = socketA;
			this.sockets[3] = socketB;
			if (num6 > 1)
			{
				this.bag[num3] = num6;
				this.bag[num3 + 1] = num7;
				this.sockets[num3] = vector3;
				this.sockets[num3 + 1] = vector4;
			}
			num3 = 2;
			if (!this.stats.animal && fromSomeone)
			{
				this.StartQuip("I could use this");
			}
		}
		else if (invRowByIndex._Tag.Contains("Armor"))
		{
			bool flag = true;
			if (this.bag[invRowByIndex._EquipSlotID * 2] > 1)
			{
				int num8 = this.bag[invRowByIndex._EquipSlotID * 2];
				int num9 = (int)Links.x.library.GetInvRowByIndex(num8)._AC;
				Library.Inventory invRowByIndex2 = Links.x.library.GetInvRowByIndex(ID);
				if (num9 > (int)invRowByIndex2._AC)
				{
					flag = false;
				}
				if (flag)
				{
					this.bag[num3] = num8;
					this.bag[num3 + 1] = this.bag[invRowByIndex._EquipSlotID * 2 + 1];
					this.sockets[num3] = this.sockets[invRowByIndex._EquipSlotID * 2];
					this.sockets[num3 + 1] = this.sockets[invRowByIndex._EquipSlotID * 2 + 1];
					if (!this.stats.animal)
					{
						this.StartQuip("Looks like an upgrade");
					}
				}
			}
			else if (!this.stats.animal && fromSomeone)
			{
				this.StartQuip("I could use this");
			}
			if (flag)
			{
				int num10 = invRowByIndex._EquipSlotID * 2;
				int num11 = this.bag[num10];
				int num12 = this.bag[num10 + 1];
				Vector3 vector5 = this.sockets[num10];
				Vector3 vector6 = this.sockets[num10 + 1];
				this.bag[num10] = ID;
				this.bag[num10 + 1] = stackSize;
				this.sockets[num10] = socketA;
				this.sockets[num10 + 1] = socketB;
				this.bag[num3] = num11;
				this.bag[num3 + 1] = num12;
				this.sockets[num3] = vector5;
				this.sockets[num3 + 1] = vector6;
				num3 = num10;
			}
		}
		else
		{
			this.bag[num3] = ID;
			this.bag[num3 + 1] = stackSize;
			this.sockets[num3] = socketA;
			this.sockets[num3 + 1] = socketB;
			this.durability[num3 / 2] = time;
		}
		return num3;
	}

	// Token: 0x06000412 RID: 1042 RVA: 0x0005E4F0 File Offset: 0x0005C6F0
	public void InitiateDialogue()
	{
		Links.x.dialogue.npc1 = this;
		if (Links.x.hasMain)
		{
			Links.x.dialogue.party = Links.x.main;
		}
		else
		{
			Links.x.dialogue.party = Links.x.GetNearestParty(this.tr.position);
		}
		if (this.stats.initiateDialogue != 1 && this.stats.initiateDialogue != 11)
		{
			this.stats.canTalk = false;
		}
		Links.x.gameplay.StartDialogue(this, Links.x.dialogue.party, null, null, this.stats.dialogueFile);
	}

	// Token: 0x06000413 RID: 1043 RVA: 0x0005E5B0 File Offset: 0x0005C7B0
	public void SetupBasic(bool isParty, int num, string workingName, int pathNodeID, bool resurrecting, int partyID)
	{
		this.tr = base.transform;
		this.tr.gameObject.layer = 6;
		if (this.ghost || resurrecting)
		{
			this.tr.gameObject.layer = 1;
		}
		this.visible = 1;
		this.indoorID = "";
		this.invRow1 = Links.x.library.GetInvRowByIndex(1);
		this.altInvRow1 = Links.x.library.GetInvRowByIndex(1);
		this.vectorZero = Vector3.zero;
		this.headHeight = new Vector3(0f, 3f, 0f);
		this.torsoHeight = new Vector3(0f, 2f, 0f);
		this.upVector = Vector3.up;
		this.yAdd2 = new Vector3(0f, 1.5f, 0f);
		this.yAdd1 = new Vector3(0f, 0.5f, 0f);
		this.yAdd3 = new Vector3(0f, 2.5f, 0f);
		if (!this.audioSource)
		{
			this.audioSource = base.gameObject.AddComponent<AudioSource>();
		}
		this.audioSource.spatialBlend = 1f;
		this.audioSource.loop = false;
		this.audioSource.playOnAwake = false;
		this.audioSource.maxDistance = 40f;
		this.ghost = resurrecting;
		if (workingName.Contains("Ghost") && !workingName.Contains("Radamant"))
		{
			this.ghost = true;
		}
		if (this.ghost)
		{
			this.hostility = 2;
		}
		if (!isParty)
		{
			this.npc = true;
		}
		else
		{
			this.npc = false;
		}
		this.CreateObjects();
		if (!this.seeker)
		{
			this.seeker = base.gameObject.AddComponent<Seeker>();
			this.seeker.pathCallback = new OnPathDelegate(this.PathFinished);
			if (isParty && !this.summoned && !this.ghost)
			{
				this.raycastModifier = base.gameObject.AddComponent<RaycastModifier>();
				this.raycastModifier.enabled = false;
			}
			this.simpleSmoothModifier = base.gameObject.AddComponent<SimpleSmoothModifier>();
		}
		this.rot = this.tr.rotation;
		this.smoothRot = this.tr.rotation;
		if (isParty && !this.summoned)
		{
			pathNodeID += 3;
		}
		this.nodeStationaryID = pathNodeID;
		this.nodeMovingID = pathNodeID + 300;
		this.followingType = "";
		if (!this.stats)
		{
			this.stats = base.gameObject.AddComponent<Stats>();
		}
		this.party = false;
		if (isParty && !this.summoned)
		{
			this.party = true;
		}
		this.stats.SetupStats(this, workingName);
		this.animationPrefix = this.stats.characterRow._AnimationPrefix;
		if (this.stats.race == "Yeti")
		{
			this.animationPrefix = "_VollingYeti";
		}
		if (this.ghost)
		{
			this.hostility = 2;
			this.SetResurrected();
			if (this.creatures)
			{
				this.creatures.SetTemperament(2);
			}
		}
		this.SetupBody();
		this.nodeConstraint = new NNConstraint();
		this.nodeConstraint.walkable = true;
		this.nodeConstraint.constrainTags = true;
		this.nodeConstraint.checkCircleID = 0;
		this.nodeConstraint.passID = this.nodeStationaryID;
		this.nodeConstraint.passID2 = this.nodeMovingID;
		this.nodeConstraint.checkConnections = this.ConnectionNumber();
		this.nodeConstraint.constrainToArea = -1;
		this.desiredGraph = -1;
		this.walkConstraint = new NNConstraint();
		this.quipIndex = Links.x.quips.GetQuipIndex(this.stats.characterRow._QuipID);
		this.hasCinematicQuip = Links.x.quips.HasIdleQuip(this.quipIndex);
		if (!this.npc)
		{
			base.gameObject.name = this.stats.displayName;
		}
		this.UpdateSizeRadius(this.radius);
		this.SceneSetup();
		this.Reincarnate();
		this.InvFromDB();
		if (isParty)
		{
			this.hostility = -1;
			if (num == 0 && !this.summoned && !Links.x.gaia.sceneLoaded)
			{
				this.SetAsLeader();
			}
			if (!this.summoned)
			{
				this.partyColorID = Links.x.GetOpenPartyColor();
				Links.x.fellowship.SetPortraits(true, 0);
				if (!this.cc)
				{
					this.AddCC();
				}
			}
			else
			{
				this.partyColorID = 6;
			}
			if (this.party)
			{
				this.fowRevealer = base.gameObject.AddComponent<FOWRevealer>();
				this.fowRevealer.main = true;
				this.fowRevealer.enabled = false;
				this.fowRevealer.character = this;
				this.fowRevealerInterior = base.gameObject.AddComponent<FOWRevealerInterior>();
				this.fowRevealerInterior.main = true;
				this.fowRevealerInterior.enabled = false;
				this.fowRevealerInterior.character = this;
			}
			this.GetPartyPooledObjects();
			if (this.party)
			{
				this.AddPlayerLight();
			}
		}
		else
		{
			if (this.stats.characterRow._CanJoinParty)
			{
				this.ClearQuips();
			}
			if (!this.npc && this.body.model.Contains("heep"))
			{
				this.GetPartyPooledObjects();
			}
		}
		if (isParty)
		{
			Links.x.diorama.sceneName != "Statues";
		}
		if (Records.x.editor)
		{
			this.sphere.name = ((this != null) ? this.ToString() : null) + " Sphere";
		}
		this.terrain = "Grass";
		this.setupComplete = true;
		if (this.npc || !this.party)
		{
			if (!this.creatures.ambush)
			{
				this.FirstPosition(null);
			}
			this.creatures.canJoinParty = this.stats.characterRow._CanJoinParty;
			this.GetPatrolHoldTime(true);
		}
		if (this.party)
		{
			this.stats.partyID = partyID;
			this.stats.CharacterLoad();
		}
		if (isParty)
		{
			if (this.bracket)
			{
				this.SetBracketPosition();
			}
			bool flag = this.summoned;
		}
		this.CircleAnimation("");
		base.enabled = true;
		if (this.ghost)
		{
			this.stats.soundID = 2;
		}
		if (this.summoned && !this.npc)
		{
			this.stats.SetSummonAllegiance();
		}
		if (this.npc && this.creatures && this.creatures.movesOnWater && !this.stats.flying && !this.waterCollider)
		{
			this.waterCollider = new GameObject("Water Collider " + ((this != null) ? this.ToString() : null));
			CapsuleCollider capsuleCollider = this.waterCollider.AddComponent<CapsuleCollider>();
			capsuleCollider.radius = 1.5f;
			capsuleCollider.height = 1f;
			this.waterColliderRigidbody = this.waterCollider.AddComponent<Rigidbody>();
			this.waterColliderRigidbody.useGravity = false;
			this.waterColliderRigidbody.isKinematic = true;
			this.waterColliderRigidbody.mass = 0.1f;
			this.waterColliderRigidbody.constraints = RigidbodyConstraints.FreezeAll;
			capsuleCollider.material = Links.x.zeroFriction;
			this.waterCollider.layer = 0;
			this.waterCollisions = this.waterCollider.AddComponent<WaterCollisions>();
			this.waterCollisions.character = this;
		}
		if (!this.party)
		{
			if (this.goreObj)
			{
				this.SetMeshState(false);
			}
		}
		else if (!this.grassInteraction)
		{
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(89);
			if (pooledGameObject)
			{
				this.grassInteraction = pooledGameObject.transform;
				pooledGameObject.SetActive(true);
			}
		}
		this.FullAttackTime();
	}

	// Token: 0x06000414 RID: 1044 RVA: 0x0005EDAD File Offset: 0x0005CFAD
	public Vector3 HeadHeight()
	{
		return this.headHeight;
	}

	// Token: 0x06000415 RID: 1045 RVA: 0x0005EDB8 File Offset: 0x0005CFB8
	private void AddCC()
	{
		this.cc = base.gameObject.GetComponent<CharacterController>();
		if (!this.cc)
		{
			this.cc = base.gameObject.AddComponent<CharacterController>();
			this.cc.radius = 0.7f;
			this.cc.center = new Vector3(0f, 2f, 0f);
			this.cc.height = 3.5f;
			this.cc.slopeLimit = 60f;
			this.cc.stepOffset = 0.8f;
			this.cc.minMoveDistance = 0f;
			this.cc.skinWidth = 0.3f;
			this.cc.enabled = false;
			this.cc.transform.position = this.tr.position;
			this.cc.transform.rotation = this.tr.rotation;
			this.cc.enabled = true;
			this.cc.enabled = false;
		}
		this.playerBorders = base.gameObject.GetComponent<PlayerBorders>();
		if (!this.playerBorders)
		{
			this.playerBorders = base.gameObject.AddComponent<PlayerBorders>();
			this.playerBorders.character = this;
			this.playerBorders.enabled = false;
		}
	}

	// Token: 0x06000416 RID: 1046 RVA: 0x0005EF17 File Offset: 0x0005D117
	public string GetBoundCharacter()
	{
		if (this.dockFriend)
		{
			return this.dockFriend.boundCharacterName;
		}
		return "";
	}

	// Token: 0x06000417 RID: 1047 RVA: 0x0005EF38 File Offset: 0x0005D138
	public void GetFriendDock(Character boundToCharacter)
	{
		if (!this.dockFriend && boundToCharacter)
		{
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(121);
			this.dockFriend = pooledGameObject.GetComponent<DockFriend>();
			this.dockFriend.Setup(this, boundToCharacter);
		}
	}

	// Token: 0x06000418 RID: 1048 RVA: 0x0005EF88 File Offset: 0x0005D188
	public void Charmed(Character boundToCharacter)
	{
		this.charmed = true;
		if (!this.heart)
		{
			this.heart = Links.x.cellar.GetPooledGameObject(66);
			this.heart.SetActive(true);
			this.SetHeartPosition();
		}
		this.SetMeshState(true);
		this.body.SetMeshState(true, false);
		this.GetFriendDock(boundToCharacter);
	}

	// Token: 0x06000419 RID: 1049 RVA: 0x0005EFF0 File Offset: 0x0005D1F0
	public void BoroBoat()
	{
		if (!this.boroBoat)
		{
			this.boroBoat = Links.x.cellar.GetPooledGameObject(136);
			this.boroBoat.SetActive(true);
			this.boroBoat.transform.parent = this.body.GetHips();
			this.boroBoat.transform.localPosition = new Vector3(0f, -0.1f, 0f);
			this.boroBoat.transform.localRotation = Quaternion.identity;
			if (this.body)
			{
				this.body.GatherRenderers(false);
			}
		}
	}

	// Token: 0x0600041A RID: 1050 RVA: 0x0005F0A0 File Offset: 0x0005D2A0
	public void ToggleBoat(bool state)
	{
		if (this.sailing)
		{
			state = false;
		}
		if (this.boroBoat)
		{
			this.boroBoat.SetActive(state);
		}
	}

	// Token: 0x0600041B RID: 1051 RVA: 0x0005F0C6 File Offset: 0x0005D2C6
	public void SetBracketPosition()
	{
		this.SetSelectedPosition();
	}

	// Token: 0x0600041C RID: 1052 RVA: 0x0005F0D0 File Offset: 0x0005D2D0
	private void CreateObjects()
	{
		if (!this.sphere)
		{
			this.sphere = Links.x.cellar.GetPooledGameObject(2);
		}
		if (!this.moveFollow)
		{
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(2);
			if (Records.x.editor)
			{
				pooledGameObject.name = ((this != null) ? this.ToString() : null) + " Move Follow";
			}
			this.moveFollow = pooledGameObject.transform;
		}
		if (!this.lookAtTurnTarget)
		{
			GameObject pooledGameObject2 = Links.x.cellar.GetPooledGameObject(2);
			if (Records.x.editor)
			{
				pooledGameObject2.name = ((this != null) ? this.ToString() : null) + " Look At Turn Target";
			}
			this.lookAtTurnTarget = pooledGameObject2.transform;
		}
	}

	// Token: 0x0600041D RID: 1053 RVA: 0x0005F1A8 File Offset: 0x0005D3A8
	private void SetResurrected()
	{
		for (int i = 0; i < this.bag.Count; i++)
		{
			if (i == 0)
			{
				this.bag[i] = 1;
			}
			else
			{
				this.bag[i] = 0;
			}
		}
		if (this.stats.GetSkill(13) < 100f)
		{
			this.stats.SetSkill(13, 120);
		}
		this.dayNightVanishing = false;
		this.vanished = false;
		this.alwaysOn = false;
		this.stats.SetResurrectionFactions();
	}

	// Token: 0x0600041E RID: 1054 RVA: 0x0005F230 File Offset: 0x0005D430
	public void CreateStamina()
	{
		GameObject gameObject = new GameObject("Stamina");
		gameObject.transform.SetParent(Links.x.cellar.tr);
		this.stamina = gameObject.AddComponent<Stamina>();
		this.stamina.Setup(this);
		if (this.bag[18] > 1)
		{
			Library.Inventory invRow = Links.x.library.GetInvRow(this.bag[18]);
			this.stamina.SetupArmor(this, Mathf.RoundToInt((float)invRow._DurabilityMax / 2f), (int)this.durability[9].x);
		}
	}

	// Token: 0x0600041F RID: 1055 RVA: 0x0005F2D8 File Offset: 0x0005D4D8
	public void CreateStatusRing(Effects effect, string spriteName, int arrows)
	{
		if (!this.statusRing)
		{
			GameObject gameObject = new GameObject("Status Ring");
			gameObject.transform.SetParent(Links.x.cellar.tr);
			this.statusRing = gameObject.AddComponent<StatusRing>();
			this.statusRing.character = this;
			if (this.radius == 3f)
			{
				this.statusRing.radius = 1f;
				this.statusRing.speedBoost = 2f;
			}
			if (this.radius == 4f)
			{
				this.statusRing.radius = 0.75f;
				this.statusRing.speedBoost = 1.5f;
			}
			if (this.radius == 8f)
			{
				this.statusRing.radius = 0.5f;
				this.statusRing.speedBoost = 1f;
			}
		}
		this.statusRing.AddEffect(spriteName, effect, true, arrows);
	}

	// Token: 0x06000420 RID: 1056 RVA: 0x0005F3C8 File Offset: 0x0005D5C8
	public void HealStatusRing(Effects effect, string spriteName)
	{
		if (this.statusRing)
		{
			this.statusRing.RemoveEffect(spriteName, effect);
		}
	}

	// Token: 0x06000421 RID: 1057 RVA: 0x0005F3E4 File Offset: 0x0005D5E4
	public void UpdateModel(string n)
	{
		if (this.bodyObj)
		{
			Links.x.archives.RecycleBody(this.bodyObj, this.bodyObj.name, base.gameObject.name);
		}
		this.bodyObj = null;
		this.stats.model = n;
		this.SetupBody();
		this.AddEquippedItems();
		this.SetMeshState(true);
	}

	// Token: 0x06000422 RID: 1058 RVA: 0x0005F450 File Offset: 0x0005D650
	public void SetupBody()
	{
		bool flag = false;
		if (this.bodyObj)
		{
			if (this.boroBoat)
			{
				flag = true;
				Links.x.cellar.ReturnPooledGameObject(136, this.boroBoat);
				this.boroBoat = null;
			}
			Links.x.archives.RecycleBody(this.bodyObj, this.bodyObj.name, base.gameObject.name);
		}
		this.bodyObj = null;
		string text = this.stats.model;
		if (this.ghost && !text.Contains("host"))
		{
			text = "Ghost_A";
			this.stats.model = text;
		}
		this.bodyObj = Links.x.archives.InstantiateBody(text, this.tr);
		if (this.hostility == 2)
		{
			bool flag2 = this.ghost;
		}
		if (!this.bodyObj)
		{
			Debug.Log(string.Concat(new string[]
			{
				(this != null) ? this.ToString() : null,
				" missing model ",
				this.stats.model,
				" ",
				this.stats.xmlName
			}));
		}
		this.bodyObj.transform.localPosition = this.vectorZero;
		this.body = this.bodyObj.GetComponent<Body>();
		this.body.Reset();
		this.body.model = text;
		this.body.character = this;
		this.body.SetupHead(this.stats.headModel);
		this.body.GatherRenderers(true);
		bool flag3 = true;
		if (this.party)
		{
			flag3 = false;
		}
		this.body.SetupTextures(this.stats.race, this.stats.sex, this.stats.characterRow, this.stats.skinTexture, this.stats.hairTexture, flag3);
		if (flag)
		{
			this.BoroBoat();
		}
		this.animator = this.body.anim;
		this.bodyObj.name = text;
		this.bodyObj.SetActive(true);
		this.neck = this.body.GetNeck();
		this.body.tr.localRotation = this.savedRot;
		this.rotateToSlope = this.stats.characterRow._RotateToSlope;
		if (this.bracket)
		{
			this.SetBracketPosition();
		}
		CapsuleCollider component = this.bodyObj.GetComponent<CapsuleCollider>();
		if (component && !this.stats.animal)
		{
			component.enabled = false;
		}
		else if (component)
		{
			component.enabled = false;
			this.body.gameObject.layer = 31;
			if (!this.body.gameObject.GetComponent<SelectionCircle>())
			{
				this.body.gameObject.AddComponent<SelectionCircle>().character = this;
			}
		}
		this.thisCollider = base.gameObject.GetComponent<CapsuleCollider>();
		if (!this.thisCollider)
		{
			this.thisCollider = base.gameObject.AddComponent<CapsuleCollider>();
		}
		if (this.radius <= 3f)
		{
			this.thisCollider.radius = 0.75f;
		}
		if (this.ghost)
		{
			this.thisCollider.radius = 3f;
		}
		this.thisCollider.height = 3.5f;
		if (component)
		{
			this.thisCollider.center = component.center;
		}
		else
		{
			this.thisCollider.center = new Vector3(0f, 1.75f, 0f);
		}
		if (!this.rb)
		{
			this.rb = base.gameObject.AddComponent<Rigidbody>();
		}
		this.rb.isKinematic = true;
		this.thisCollider.enabled = true;
		if (this.ghost)
		{
			this.thisCollider.isTrigger = true;
		}
		if (this.party)
		{
			this.StopMove();
		}
		if (this.stats.race == "Yeti")
		{
			this.animationPrefix = "_VollingYeti";
		}
		string text2 = this.animationPrefix + "_Unarmed";
		AnimatorOverrideController animatorOverrideController = Links.x.archives.GetOverrideController(text2);
		if (animatorOverrideController == null && !this.stats.animal)
		{
			animatorOverrideController = Links.x.archives.GetOverrideController("_Volling_Unarmed");
		}
		this.animator.runtimeAnimatorController = animatorOverrideController;
		if (this.body)
		{
			this.body.anim.Rebind();
			this.body.anim.Update(0f);
			this.body.transform.localPosition = Vector3.zero;
		}
		this.needsRebind = false;
		if (this.animator)
		{
			this.animator.SetBool("Party", this.party);
		}
		if (this.ghost)
		{
			this.body.SetGhost();
		}
		if (this.party && !Links.x.gameplay.spellTargetingParty)
		{
			this.body.SeeThroughColliders(false);
		}
		if (this.stats.hasCustomIdle && !this.sailing)
		{
			this.animator.SetFloat("Idle Variation", 1f);
		}
	}

	// Token: 0x06000423 RID: 1059 RVA: 0x0005F995 File Offset: 0x0005DB95
	public void SetupPartyAfterLoadedVariables()
	{
		this.portrait.SetHealthColor();
		this.SetUpInv();
	}

	// Token: 0x06000424 RID: 1060 RVA: 0x0005F9A8 File Offset: 0x0005DBA8
	public void SetupPartyAfterLoadedVariables2()
	{
		this.stats.UpdateAbilityTriggers();
		if (this.portrait)
		{
			this.portrait.skillBag.UpdateWindowStates();
		}
		if (this.bag[18] > 0)
		{
			if (Links.x.library.GetInvRowByIndex(this.bag[18])._ArmorID != -1)
			{
				this.CreateEquippedItems(this.bag[18], this.bag[19], new Vector3(-1f, -1f, -1f), new Vector3(-1f, -1f, -1f), 18, true);
			}
			else
			{
				this.AddEquippedItems();
			}
		}
		else
		{
			this.AddEquippedItems();
		}
		this.stats.UpdateAbilityTriggers();
		if (this.portrait)
		{
			this.portrait.skillBag.UpdateWindowStates();
		}
		this.portrait.SetFatigue();
		this.portrait.SetHealthColor();
		this.stats.FormationTactics();
		this.animationPrefix = this.stats.characterRow._AnimationPrefix;
		if (this.stats.race == "Yeti")
		{
			this.animationPrefix = "_VollingYeti";
		}
		Links.x.gaia.settingUpParty = false;
	}

	// Token: 0x06000425 RID: 1061 RVA: 0x0005FB00 File Offset: 0x0005DD00
	public void GetPartyPooledObjects()
	{
		this.waypoint = Links.x.cellar.GetPooledGameObject(0);
		this.waypointAnimator = this.waypoint.transform.GetChild(0).gameObject.GetComponent<Animator>();
		this.waypoint.SetActive(true);
		this.waypoint.transform.parent = Links.x.gameplay.transform;
		this.waypointRenderer = this.waypoint.transform.GetChild(0).gameObject.transform.GetChild(0).gameObject.GetComponent<MeshRenderer>();
		this.waypointRenderer.sharedMaterial = Links.x.GetPartyMaterial(this.partyColorID, 4);
		if (this.party)
		{
			this.mapIcon = this.CreateSphere(this.tr.position, 2f);
			if (Records.x.editor)
			{
				this.mapIcon.name = this.stats.GetName() + "'s Map Icon";
			}
			this.mapIcon.SetActive(true);
			this.mapIcon.layer = 15;
			this.mapIcon.transform.parent = Links.x.cellar.tr;
			this.mapIcon.GetComponent<MeshRenderer>().sharedMaterial = Links.x.mapIconMaterial;
		}
	}

	// Token: 0x06000426 RID: 1062 RVA: 0x0005FC64 File Offset: 0x0005DE64
	public void ReturnPartyPooledObjects()
	{
		if (this.mapIcon)
		{
			Object.Destroy(this.mapIcon);
		}
		this.mapIcon = null;
		if (this.waypoint)
		{
			this.waypoint.gameObject.SetActive(false);
			this.waypoint = null;
		}
		if (this.portrait)
		{
			this.portrait.Remove();
			this.characterSheetPortrait.Remove();
		}
		this.portrait = null;
		this.characterSheetPortrait = null;
		if (this.revivalGem)
		{
			Links.x.cellar.ReturnPooledGameObject(123, this.revivalGem.gameObject);
			this.revivalGem = null;
		}
		if (this.statusRing)
		{
			this.statusRing.End();
			this.statusRing = null;
		}
		if (this.stamina)
		{
			this.stamina.End();
			this.stamina = null;
		}
		if (this.stats.boro && this.boroBoat)
		{
			Links.x.cellar.ReturnPooledGameObject(136, this.boroBoat);
			this.boroBoat = null;
		}
	}

	// Token: 0x06000427 RID: 1063 RVA: 0x0005FD90 File Offset: 0x0005DF90
	public void AddEquippedItems()
	{
		for (int i = 0; i < 19; i++)
		{
			if (this.bag[i * 2] > 0 || i == 0 || i == 1)
			{
				if ((i == 0 || i == 1) && this.bag[i * 2] == 0)
				{
					this.bag[i * 2] = 1;
				}
				if (i != 9)
				{
					this.CreateEquippedItems(this.bag[i * 2], this.bag[i * 2 + 1], this.sockets[i * 2], this.sockets[i * 2 + 1], i * 2, true);
				}
			}
		}
	}

	// Token: 0x06000428 RID: 1064 RVA: 0x0005FE3C File Offset: 0x0005E03C
	public void EquipNPC(int i, int moveTo)
	{
		if (i != moveTo)
		{
			int num = this.bag[i * 2];
			int num2 = this.bag[i * 2 + 1];
			Vector3 vector = this.sockets[i * 2];
			Vector3 vector2 = this.sockets[i * 2 + 1];
			Vector4 vector3 = this.durability[i];
			this.bag[i * 2] = this.bag[moveTo * 2];
			this.bag[i * 2 + 1] = this.bag[moveTo * 2 + 1];
			this.sockets[i * 2] = this.sockets[moveTo * 2];
			this.sockets[i * 2 + 1] = this.sockets[moveTo * 2 + 1];
			this.durability[i] = this.durability[moveTo];
			this.bag[moveTo * 2] = num;
			this.bag[moveTo * 2 + 1] = num2;
			this.sockets[moveTo * 2] = vector;
			this.sockets[moveTo * 2 + 1] = vector2;
			this.durability[moveTo] = vector3;
		}
		this.CreateEquippedItems(this.bag[moveTo * 2], this.bag[moveTo * 2 + 1], this.sockets[moveTo * 2], this.sockets[moveTo * 2 + 1], moveTo * 2, true);
	}

	// Token: 0x06000429 RID: 1065 RVA: 0x0005FFC4 File Offset: 0x0005E1C4
	public void UnequipNPC(int i)
	{
		this.CreateEquippedItems(this.bag[i * 2], this.bag[i * 2 + 1], this.sockets[i * 2], this.sockets[i * 2 + 1], i * 2, true);
	}

	// Token: 0x0600042A RID: 1066 RVA: 0x00060018 File Offset: 0x0005E218
	public void SetupNPCAfterLoadedVariables()
	{
		bool flag = this.wasStunned;
		if (!this.stunned)
		{
			for (int i = 0; i < 19; i++)
			{
				if (this.bag[i * 2] > 0 || i == 0)
				{
					this.CreateEquippedItems(this.bag[i * 2], this.bag[i * 2 + 1], this.sockets[i * 2], this.sockets[i * 2 + 1], i * 2, true);
				}
			}
		}
		if (this.portrait)
		{
			this.portrait.skillBag.UpdateWindowStates();
		}
		this.stats.UpdateAbilityTriggers();
		this.stats.Talk();
		this.stats.FormationTactics();
	}

	// Token: 0x0600042B RID: 1067 RVA: 0x000600DC File Offset: 0x0005E2DC
	public void AddToParty()
	{
		this.EndPath();
		this.stats.originalMap = Links.x.diorama.sceneName;
		if (this.creatures)
		{
			this.creatures.SetStateByIndex(0, "Companion");
		}
		this.npc = false;
		this.hostility = -1;
		if (!this.summoned)
		{
			this.party = true;
		}
		Links.x.ChangeNPCList(this, false);
		Links.x.ChangePartyList(this, true, this.party);
		Links.x.ClearNPCs();
		if (this.creatures)
		{
			this.creatures.JoiningParty();
		}
		this.stats.state = "Companion";
		Links.x.gameFeed.AddFeed(this.stats.displayName + " has joined you");
		Links.x.fellowship.SetPortraits(true, 0);
		this.fowRevealer = base.gameObject.AddComponent<FOWRevealer>();
		this.fowRevealer.main = true;
		this.fowRevealer.enabled = true;
		this.fowRevealer.character = this;
		this.fowRevealerInterior = base.gameObject.AddComponent<FOWRevealerInterior>();
		this.fowRevealerInterior.main = true;
		this.fowRevealerInterior.enabled = true;
		this.fowRevealerInterior.character = this;
		if (!this.raycastModifier)
		{
			this.raycastModifier = base.gameObject.AddComponent<RaycastModifier>();
			this.raycastModifier.enabled = false;
		}
		this.waypoint = Links.x.cellar.GetPooledGameObject(0);
		this.waypoint.SetActive(false);
		this.waypoint.transform.parent = Links.x.gameplay.transform;
		this.party = true;
		this.body.GatherRenderers(false);
		this.partyColorID = Links.x.GetOpenPartyColor();
		Links.x.fellowship.SetPortraits(true, 0);
		this.AddPlayerLight();
		if (!this.cc)
		{
			this.AddCC();
		}
		if (Links.x.main == this && !Records.x.InCombat(false))
		{
			Links.x.rtsCamera.Follow(base.transform, this, false);
		}
		this.GetPartyPooledObjects();
		Records.x.RemoveTemporaryCreature(this.stats.creaturesName, this.stats.xmlName, this.stats.originalMap, 0);
		this.tr.SetParent(Links.x.fellowship.transform);
		this.tr.parent = null;
		this.tr.SetAsLastSibling();
		this.SetUpInv();
		this.RemoveFromSelected(false);
		this.stats.partyID = Records.x.partyTotal;
		Records.x.partyTotal++;
		Debug.Log(this.stats.partyID.ToString() + " " + Records.x.partyTotal.ToString());
		if (this.stats.partyID == 1)
		{
			global::Item item;
			ItemEquipped itemEquipped;
			Links.x.inventory.AddFromGround(null, null, 0, false, 0f, Links.x.library.GetInvRowID("Songbook"), 1, new Vector3((float)this.stats.partyID, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector4(0f, 0f, 0f, 0f), this, false, false, out item, out itemEquipped);
			this.stats.UpdateAbilityTriggers();
			this.portrait.skillBag.SetSongGrid();
		}
		Links.x.characterSheet.OrderPortraits();
		this.stats.stamina = 30f;
		this.stats.maxStamina = 30f;
		Links.x.pocketWheel.NewScene();
	}

	// Token: 0x0600042C RID: 1068 RVA: 0x000604D0 File Offset: 0x0005E6D0
	public void RemoveFromParty(bool remainAsNPC)
	{
		Links.x.inventory.ClearBag(this);
		this.portrait.skillBag.Remove();
		if (this.stats.GetName() == "Viorica")
		{
			this.stats.xmlName = "BanquetIsleFriend";
		}
		if (this.stats.GetName() == "Emil")
		{
			this.stats.xmlName = "BanquetIsleFriend2";
		}
		if (this.portrait)
		{
			this.portrait.Remove();
			this.characterSheetPortrait.Remove();
		}
		if (this.waypoint)
		{
			this.waypoint.gameObject.SetActive(false);
			this.waypoint = null;
		}
		this.portrait = null;
		this.characterSheetPortrait = null;
		if (this.raycastModifier)
		{
			this.raycastModifier.enabled = false;
		}
		if (remainAsNPC)
		{
			this.npc = true;
		}
		this.hostility = 0;
		this.ClearQuips();
		Links.x.AddRemovedCompanion(this);
		Links.x.ChangePartyList(this, false, this.party);
		if (remainAsNPC)
		{
			Links.x.ChangeNPCList(this, true);
		}
		if (this.fowRevealer)
		{
			Object.Destroy(this.fowRevealerInterior);
			Object.Destroy(this.fowRevealer);
		}
		if (this.cc)
		{
			Object.Destroy(this.cc);
			Object.Destroy(this.playerBorders);
		}
		if (remainAsNPC)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.stats.originalMap,
				" ",
				Links.x.diorama.sceneName,
				" ",
				this.stats.xmlName
			}));
			if (this.stats.originalMap != Links.x.diorama.sceneName)
			{
				this.stats.GetEffectStrings();
				Records.x.AddTemporaryCreature(this.stats.creaturesName, this.stats.xmlName, this.stats.originalMap, Links.x.diorama.sceneName, 0, this.tr.position, "Normal", "", this.stats.HealthCurrent(), this.stats.savedEffects, 0, 0f, Links.x.diorama.sceneName, this.tr.position, false);
			}
			else
			{
				this.creatures = Links.x.diorama.SetCreatureState(this.stats.xmlName, "Normal", 0);
				this.stats.state = "Normal";
				if (Records.x.banquetIsle)
				{
					this.creatures.SetTemperament(2);
					this.creatures.SetCharacter0(this, 2);
				}
				else
				{
					this.creatures.SetCharacter0(this, 1);
				}
			}
			base.gameObject.transform.parent = Links.x.diorama.creatures;
		}
		Links.x.ReorderPortraits();
		this.ReturnPartyPooledObjects();
		this.RemovePlayerLight();
		if (Links.x.main == this)
		{
			Links.x.protagonist.SetAsLeader();
		}
		this.party = false;
		this.mainSelected = false;
		this.stats.maxStamina = this.stats.characterRow._Stamina;
		this.stats.stamina = this.stats.maxStamina;
		if (Records.x.editor || Records.x.secrets)
		{
			Links.x.gameFeed.AddFeed(this.stats.displayName + " has left the party.");
		}
		Links.x.pocketWheel.NewScene();
	}

	// Token: 0x0600042D RID: 1069 RVA: 0x00060899 File Offset: 0x0005EA99
	public void AddToLists()
	{
		Links.x.ChangeNPCList(this, true);
		this.SceneSetup();
	}

	// Token: 0x0600042E RID: 1070 RVA: 0x000608B0 File Offset: 0x0005EAB0
	public void RemovingScene()
	{
		if (!this.tr)
		{
			return;
		}
		this.TargetReached();
		this.ClearMoveTargets();
		if (this.sphere && this.tr)
		{
			this.sphere.transform.position = this.tr.position;
		}
		this.RemoveLastNode(true);
		this.node = null;
		if (this.hasActions && this.npc && this.actions)
		{
			this.actions.EndActions();
		}
		if (this.dockFriend)
		{
			this.dockFriend.RemovePortrait();
		}
		if (this.npc)
		{
			this.ReturnPooledObjects();
			this.stats.ReturnPooledEffects();
			this.ReturnToPool();
		}
	}

	// Token: 0x0600042F RID: 1071 RVA: 0x00060979 File Offset: 0x0005EB79
	public void DestroyCharacter()
	{
		Records.x.AddDestroyCharacter(this);
	}

	// Token: 0x06000430 RID: 1072 RVA: 0x00060986 File Offset: 0x0005EB86
	public void DestroyCharacterWait()
	{
		base.StartCoroutine(this.DestroyWait());
	}

	// Token: 0x06000431 RID: 1073 RVA: 0x00060995 File Offset: 0x0005EB95
	private IEnumerator DestroyWait()
	{
		float timeToLerp = Random.Range(3f, 5f);
		float percentage = 0f;
		float startTime = Time.time;
		while (percentage < 1f && Links.x.gaia.sceneLoaded)
		{
			percentage = (Time.time - startTime) / timeToLerp;
			yield return null;
		}
		this.DestroyCharacter();
		yield break;
	}

	// Token: 0x06000432 RID: 1074 RVA: 0x000609A4 File Offset: 0x0005EBA4
	public void FinishDestroyingCharacter()
	{
		if (Links.x.gaia.sceneLoaded && Links.x.gameCard.hoverCharacter == this)
		{
			Links.x.gameCard.EndHover(this, false);
		}
		this.TargetReached();
		this.ClearMoveTargets();
		if (this.sphere)
		{
			this.sphere.transform.position = this.tr.position;
		}
		this.RemoveLastNode(true);
		if (this.hasActions && this.actions)
		{
			this.actions.EndActions();
		}
		this.node = null;
		if (this.body)
		{
			this.body.RemoveDeathParts();
		}
		if (this.bouncer)
		{
			this.bouncer.EndNow();
			Object.Destroy(this.bouncer.gameObject);
			this.bouncer = null;
		}
		if (this.hasIncenseTorch)
		{
			this.RemoveIncenseTorch();
		}
		if (this.hasTorch)
		{
			this.RemoveTorch();
		}
		if (this.statusRing)
		{
			this.statusRing.End();
			this.statusRing = null;
		}
		if (this.stamina)
		{
			this.stamina.End();
			this.stamina = null;
		}
		if (this.oar)
		{
			Links.x.cellar.ReturnPooledGameObject(137, this.oar);
			this.oar = null;
		}
		if (this.npc)
		{
			Links.x.ChangeNPCList(this, false);
		}
		else if (this.party)
		{
			this.ReturnPartyPooledObjects();
			Links.x.inventory.ClearBag(this);
			if (this.portrait)
			{
				this.portrait.skillBag.Remove();
			}
		}
		else if (this.creatures && this.summoned)
		{
			Object.Destroy(this.creatures.gameObject);
		}
		if (this.gos != null)
		{
			this.gos.Remove(this);
		}
		Links.x.ChangeDeadList(this, false);
		if (this.portrait)
		{
			Links.x.hudControl.RemovePortrait(this.portrait);
			this.portrait = null;
			this.characterSheetPortrait.Remove();
			this.characterSheetPortrait = null;
		}
		this.ReturnPooledObjects();
		this.stats.ReturnPooledEffects();
		this.ReturnToPool();
	}

	// Token: 0x06000433 RID: 1075 RVA: 0x00060C08 File Offset: 0x0005EE08
	public void SceneSetup()
	{
		this.gos = Links.x.diorama.characters;
		if (this.npc)
		{
			if (!this.setupComplete && !this.gos.Contains(this))
			{
				this.gos.Add(this);
				return;
			}
		}
		else
		{
			this.gos.Add(this);
		}
	}

	// Token: 0x06000434 RID: 1076 RVA: 0x00060C64 File Offset: 0x0005EE64
	private void CheckInTown()
	{
		bool flag = this.inTown;
		if (this.party)
		{
			this.inSporeForest = Links.x.diorama.InSporeForest(this.currentPosition);
			if (this.sporeTime == 0f)
			{
				this.sporeTime = Links.x.gameplay.seconds;
			}
		}
		this.inTown = Links.x.diorama.InTown(this.tr.position);
		if (!this.hasActions && this.inTown)
		{
			if (this.party)
			{
				this.animator.SetBool("Party", true);
			}
			this.animator.SetBool("InTown", true);
		}
		else
		{
			if (this.party)
			{
				this.animator.SetBool("Party", true);
			}
			this.animator.SetBool("InTown", false);
		}
		if (this.mainSelected && this.inTown != flag)
		{
			Links.x.gaia.SetEnvironmentPlaylist(false, this.inTown, false);
		}
		if (this.inTown != flag)
		{
			this.SetAnimatorSpeed(1f);
			this.animator.speed = this.currentAnimatorSpeed;
		}
	}

	// Token: 0x06000435 RID: 1077 RVA: 0x00060D90 File Offset: 0x0005EF90
	public bool InSporeForest()
	{
		return this.inSporeForest;
	}

	// Token: 0x06000436 RID: 1078 RVA: 0x00060D98 File Offset: 0x0005EF98
	public void MakeRandomPathAfterJump()
	{
		this.makePathAfterJump = true;
	}

	// Token: 0x06000437 RID: 1079 RVA: 0x00060DA4 File Offset: 0x0005EFA4
	public void FirstPosition(GraphNode firstNode)
	{
		if (!this.setupComplete || (this.dead && this.npc) || !this.tr)
		{
			return;
		}
		if (this.npc && this.creatures && this.creatures.ambush)
		{
			return;
		}
		this.jumpingAreas = false;
		this.jumpingPosition = true;
		this.jumpPositionTime = Time.timeSinceLevelLoad;
		this.jumpPositionVector = this.tr.position;
		this.movingAreas = false;
		this.meshAlwaysOff = false;
		if (this.cc && this.cc.enabled)
		{
			this.cc.enabled = false;
			this.cc.enabled = true;
		}
		this.nodePoint = this.tr.position;
		if (this.party && !this.hasActions)
		{
			this.timeSinceMoveEnded = -100f;
			if (this.animator)
			{
				this.animator.SetBool("Combat", false);
			}
		}
		GraphNode graphNode = firstNode;
		if (graphNode == null)
		{
			this.moveOnTiles = this.ghost;
			graphNode = this.NearNode(this.nodePoint, true, 0, -1, 0);
			this.moveOnTiles = false;
		}
		if (graphNode != null)
		{
			this.nodePoint = (Vector3)graphNode.position;
		}
		if (this.nodePoint != this.vectorZero && !this.stuckInPlace && !this.sailing)
		{
			this.SetPosition(this.nodePoint, null);
		}
		this.slideNode = null;
		this.slideNodePosition = Vector3.zero;
		this.lastFatiguePosition = this.tr.position;
		this.ClaimNode(graphNode, this.nodePoint, true);
		if (graphNode != null && !this.stuckInPlace && !this.sailing)
		{
			this.SetPosition((Vector3)graphNode.position, graphNode);
		}
		if (this.circleTr)
		{
			this.circleTr.position = this.tr.position;
		}
		this.SetMoveFollowPosition(this.tr.position);
		if (graphNode != null)
		{
			this.SetMoveFollowPosition((Vector3)graphNode.position);
		}
		this.TargetReached();
		if (!this.npc)
		{
			this.GetTerrain();
		}
		if (!this.resting && !Links.x.gaia.sceneLoaded)
		{
			this.PlayAnimation("Idle", Random.Range(0f, 1f));
		}
		if (Links.x.gaia.sceneLoaded)
		{
			this.DoFootsteps();
		}
		this.rot = this.tr.rotation;
		this.smoothRot = this.tr.rotation;
		this.savedRot = this.tr.rotation;
		if (this.mainSelected)
		{
			Links.x.follow.position = this.tr.position + this.headHeight;
		}
		if (this.node != null)
		{
			this.desiredGraph = (int)this.node.GraphIndex;
		}
		this.lastFatiguePosition = this.tr.position;
		if (this.desiredGraph == 1)
		{
			if (Links.x.diorama.GetIndoorView())
			{
				this.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName(this.tr.position);
			}
		}
		else
		{
			this.indoorID = "";
		}
		if (this.sphere)
		{
			this.sphere.transform.position = this.tr.position;
		}
		this.savedPathTarget = this.node;
		this.savedFollowNode = this.node;
		this.body.SetMagicaClothWind();
		if (this.mainSelected)
		{
			this.CheckInTown();
			if (!this.inTown)
			{
				Links.x.gaia.SetEnvironmentPlaylist(Links.x.gameplay.sailing, this.inTown, false);
			}
		}
	}

	// Token: 0x06000438 RID: 1080 RVA: 0x00061178 File Offset: 0x0005F378
	public void SettlePosition()
	{
		if (this.node != null)
		{
			this.desiredGraph = (int)this.node.GraphIndex;
		}
		this.rot = this.tr.rotation;
		this.smoothRot = this.tr.rotation;
		this.savedRot = this.tr.rotation;
		this.SetMoveFollowPosition(this.tr.position);
		if (this.desiredGraph == 1)
		{
			this.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName(this.tr.position);
		}
		else
		{
			this.indoorID = "";
		}
		if (this.sphere)
		{
			this.sphere.transform.position = this.tr.position;
		}
	}

	// Token: 0x06000439 RID: 1081 RVA: 0x00061248 File Offset: 0x0005F448
	public void TurnScriptsOff()
	{
		if (this.party && !this.isBoro && !this.offMap)
		{
			return;
		}
		if (this.deactivating || this.fleeing)
		{
			return;
		}
		if (this.dayNightVanishing || this.alwaysOn)
		{
			return;
		}
		if (this.creatures && this.creatures.activating)
		{
			return;
		}
		if (this.hasActions && this.actions)
		{
			this.actions.EndActions();
		}
		base.enabled = false;
		this.animator.enabled = false;
		this.stats.enabled = false;
		if (this.body)
		{
			this.body.lookAtController.SetAsActive(false);
			this.body.TurnOffIK();
			if (this.body.headAnim)
			{
				this.body.headAnim.enabled = false;
			}
		}
		this.SetMeshState(false);
		this.body.enabled = false;
		this.inactive = true;
		this.TargetReached();
		if (this.thisCollider)
		{
			this.thisCollider.enabled = false;
		}
		this.audioSource.enabled = false;
		if (this.usingCircles && this.circleTr)
		{
			this.circle.SetActive(false);
		}
		this.ClearLKP();
		if (this.party || this.isBoro || this.vanished)
		{
			this.RemoveLastNode(true);
		}
	}

	// Token: 0x0600043A RID: 1082 RVA: 0x000613C4 File Offset: 0x0005F5C4
	public void TurnScriptsOn()
	{
		if (this.offMap || this.vanished)
		{
			return;
		}
		if (Records.x.partySailing && this.summoned && !this.npc)
		{
			return;
		}
		base.enabled = true;
		this.body.enabled = true;
		this.animator.enabled = true;
		this.stats.enabled = true;
		this.audioSource.enabled = true;
		if (this.thisCollider)
		{
			this.thisCollider.enabled = true;
		}
		this.inactive = false;
		if (this.body.headAnim)
		{
			this.body.headAnim.enabled = true;
		}
		if (this.creatures)
		{
			this.creatures.CheckSleep(this);
		}
		if (this.party)
		{
			this.FindCurrentNode(true);
		}
		if (this.circleTr && !this.isBoro && !this.inactive && this.visible == 1 && !this.stunned && this.usingCircles)
		{
			this.circle.SetActive(true);
		}
		this.CircleAnimation("");
	}

	// Token: 0x0600043B RID: 1083 RVA: 0x000614EE File Offset: 0x0005F6EE
	public void Reincarnate()
	{
		if (!this.npc)
		{
			Links.x.ChangePartyList(this, true, this.party);
			return;
		}
		Links.x.ChangeNPCList(this, true);
	}

	// Token: 0x0600043C RID: 1084 RVA: 0x00061518 File Offset: 0x0005F718
	public void ResetCharacter()
	{
		this.setupComplete = false;
		this.outsideBounds = false;
		this.animID = 0;
		this.nodeActions.Clear();
		this.nodePath.Clear();
		this.vectorPath.Clear();
		this.prepPath.Clear();
		this.moving = false;
		this.swarm = false;
		this.inCombat = false;
		if (this.actions)
		{
			this.actions.EndActions();
			this.actions = null;
		}
		this.hasActions = false;
		this.npc = true;
		this.dead = false;
		this.moveNode = null;
		this.movePoint = this.vectorZero;
		this.patrolNode = 0;
		this.canLeave = false;
		this.moveTurn = false;
		this.mainSelected = false;
		this.protagonist = false;
		this.mainSelected = false;
		this.moveTurns = 0f;
		this.hovering = false;
		if (this.mainSelected)
		{
			Debug.Log("sliding");
		}
		this.slideNode = null;
		this.nextNode = null;
		this.prevNodePosition = this.vectorZero;
		this.node = null;
		this.nodePoint = this.vectorZero;
		this.targetNode = null;
		this.moveIndex = -1;
		this.missing = false;
		this.fleeing = false;
		for (int i = 0; i < this.equippedItems.Length; i++)
		{
			if (this.equippedItems[i] != null)
			{
				Object.Destroy(this.equippedItems[i]);
			}
			this.equippedItems[i] = null;
		}
		this.blockedTime = 0f;
		this.tempStop = false;
		this.setupComplete = false;
		this.isHit = false;
		this.downed = false;
		this.resting = false;
		this.doingHit = false;
	}

	// Token: 0x0600043D RID: 1085 RVA: 0x000616C8 File Offset: 0x0005F8C8
	public void ReturnToPool()
	{
		if (this.bodyObj)
		{
			base.enabled = false;
			this.body.enabled = true;
			this.animator.enabled = true;
			this.stats.enabled = true;
			if (this.body)
			{
				this.body.lookAtController.SetAsActive(false);
				this.body.TurnOffIK();
				if (this.body.headAnim)
				{
					this.body.headAnim.enabled = true;
				}
			}
			Links.x.archives.RecycleBody(this.bodyObj, this.bodyObj.name, base.gameObject.name);
		}
		this.bodyObj = null;
		if (this.dead)
		{
			Links.x.ChangeDeadList(this, false);
		}
		if (this.npc)
		{
			Links.x.ChangeNPCList(this, false);
		}
		this.ReturnPooledObjects();
		if (this)
		{
			Object.Destroy(base.gameObject);
		}
	}

	// Token: 0x0600043E RID: 1086 RVA: 0x000617CF File Offset: 0x0005F9CF
	public int GetLKPCount()
	{
		return this.lkPlayer.Count;
	}

	// Token: 0x0600043F RID: 1087 RVA: 0x000617DC File Offset: 0x0005F9DC
	public void UpdateLKP(Character character, GraphNode position, string action, bool seen)
	{
		if (this.hasActions && this.actions.ai.findingAction)
		{
			return;
		}
		if (character == this || !character)
		{
			return;
		}
		int num = this.lkPlayer.IndexOf(character);
		if (num == -1)
		{
			if (seen || action == "Heard")
			{
				if (!seen)
				{
					action = "Search";
				}
				this.lkPlayer.Add(character);
				this.lkPosition.Add(position);
				this.lkAction.Add(action);
				this.lkBool.Add(seen);
			}
		}
		else
		{
			bool flag = true;
			if (!seen)
			{
				if (action.Contains("Heard"))
				{
					if (this.lkBool[num])
					{
						flag = false;
					}
					else
					{
						string text = this.lkAction[num];
						if (!text.Contains("Search"))
						{
							action = "Search";
						}
						else
						{
							action = text;
						}
					}
				}
				else
				{
					string text2 = this.lkAction[num];
					if (!text2.Contains("Search"))
					{
						action = "Search";
					}
					else
					{
						action = text2;
					}
				}
			}
			if (flag)
			{
				this.lkPosition[num] = position;
				this.lkAction[num] = action;
				this.lkBool[num] = seen;
			}
		}
		this.hasLKP = true;
	}

	// Token: 0x06000440 RID: 1088 RVA: 0x00061924 File Offset: 0x0005FB24
	public void TransferLKP(Character source)
	{
		this.lkPlayer.Clear();
		this.lkPosition.Clear();
		this.lkAction.Clear();
		this.lkBool.Clear();
		List<Character> list = source.lkPlayer;
		List<GraphNode> list2 = source.lkPosition;
		List<string> list3 = source.lkAction;
		List<bool> list4 = source.lkBool;
		int count = list.Count;
		for (int i = 0; i < count; i++)
		{
			this.lkPlayer.Add(list[i]);
			this.lkPosition.Add(list2[i]);
			this.lkAction.Add(list3[i]);
			this.lkBool.Add(list4[i]);
		}
	}

	// Token: 0x06000441 RID: 1089 RVA: 0x000619E0 File Offset: 0x0005FBE0
	public void UpdateLKPSpecial(Character character, GraphNode position, string action, bool seen)
	{
		if (this.lkPlayer.IndexOf(character) == -1)
		{
			this.lkPlayer.Add(character);
			this.lkPosition.Add(position);
			this.lkAction.Add(action);
			this.lkBool.Add(seen);
		}
		this.hasLKP = true;
	}

	// Token: 0x06000442 RID: 1090 RVA: 0x00061A34 File Offset: 0x0005FC34
	public void RemoveLKPlayer(Character character)
	{
		int num = this.lkPlayer.IndexOf(character);
		if (num > -1)
		{
			this.lkPlayer.RemoveAt(num);
			this.lkPosition.RemoveAt(num);
			this.lkAction.RemoveAt(num);
			this.lkBool.RemoveAt(num);
		}
	}

	// Token: 0x06000443 RID: 1091 RVA: 0x00061A82 File Offset: 0x0005FC82
	public bool HasLKPlayer(Character character)
	{
		return this.lkPlayer.IndexOf(character) != -1;
	}

	// Token: 0x06000444 RID: 1092 RVA: 0x00061A98 File Offset: 0x0005FC98
	public bool GetLKPlayerBool(Character character)
	{
		int num = this.lkPlayer.IndexOf(character);
		return num != -1 && this.lkBool[num];
	}

	// Token: 0x06000445 RID: 1093 RVA: 0x00061AC4 File Offset: 0x0005FCC4
	public Character GetNearestPartyLKP(Vector3 pt)
	{
		float num = float.PositiveInfinity;
		Character character = null;
		for (int i = 0; i < this.lkPlayer.Count; i++)
		{
			if (this.lkPlayer[i].party && !this.lkPlayer[i].stunned && !this.lkPlayer[i].dead)
			{
				float sqrMagnitude = (this.lkPlayer[i].tr.position - pt).sqrMagnitude;
				if (sqrMagnitude < num)
				{
					num = sqrMagnitude;
					character = this.lkPlayer[i];
				}
			}
		}
		return character;
	}

	// Token: 0x06000446 RID: 1094 RVA: 0x00061B68 File Offset: 0x0005FD68
	public bool HasSomeoneInSight()
	{
		for (int i = 0; i < this.lkPlayer.Count; i++)
		{
			if (!this.lkPlayer[i].npc && !this.lkPlayer[i].stunned && !this.lkPlayer[i].dead && this.lkBool[i])
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000447 RID: 1095 RVA: 0x00061BD8 File Offset: 0x0005FDD8
	public bool HasPartyLKP()
	{
		for (int i = 0; i < this.lkPlayer.Count; i++)
		{
			if (this.lkPlayer[i].party && !this.lkPlayer[i].stunned && !this.lkPlayer[i].dead)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000448 RID: 1096 RVA: 0x00061C37 File Offset: 0x0005FE37
	public void ClearLKP()
	{
		this.hasLKP = false;
		this.lkAction.Clear();
		this.lkPosition.Clear();
		this.lkBool.Clear();
		this.lkPlayer.Clear();
	}

	// Token: 0x06000449 RID: 1097 RVA: 0x00061C6C File Offset: 0x0005FE6C
	public bool CanSee(Character checkCharacter)
	{
		int num = this.lkPlayer.IndexOf(checkCharacter);
		return num > -1 && this.lkBool[num];
	}

	// Token: 0x0600044A RID: 1098 RVA: 0x00061C98 File Offset: 0x0005FE98
	public void ReturnPooledObjects()
	{
		if (this.sleeping)
		{
			this.sleeping = false;
			this.RemoveEffect(40, "", true);
		}
		if (this.splash)
		{
			Links.x.cellar.ReturnPooledGameObject(141, this.splash);
			this.splash = null;
		}
		if (this.quip)
		{
			this.quip.gameObject.SetActive(false);
			this.quip.EndFinal();
			this.quip = null;
		}
		if (this.stunGauge)
		{
			this.stunGauge.gameObject.SetActive(false);
			this.stunGauge = null;
		}
		if (this.dazedGauge)
		{
			this.dazedGauge.gameObject.SetActive(false);
			this.dazedGauge = null;
		}
		if (this.waypoint)
		{
			this.waypoint.gameObject.SetActive(false);
			this.waypoint = null;
		}
		if (this.heart)
		{
			Links.x.cellar.ReturnPooledGameObject(66, this.heart);
			this.heart = null;
		}
		if (this.dodgeFX)
		{
			Links.x.cellar.ReturnPooledGameObject(91, this.dodgeFX);
			this.dodgeFX = null;
		}
		if (this.dazed)
		{
			Links.x.cellar.ReturnPooledGameObject(100, this.dazed.transform.parent.gameObject);
			this.dazed = null;
		}
		this.ReturnHealthBar();
		this.ReturnStaminaBar();
		if (this.grassInteraction)
		{
			Links.x.cellar.ReturnPooledGameObject(89, this.grassInteraction.gameObject);
			this.grassInteraction = null;
		}
		if (this.bracket)
		{
			Links.x.cellar.ReturnPooledGameObject(61, this.bracket);
		}
		if (this.stats.boro && this.boroBoat)
		{
			Links.x.cellar.ReturnPooledGameObject(136, this.boroBoat);
			this.boroBoat = null;
		}
		if (this.dockFriend)
		{
			this.dockFriend.Remove();
			this.dockFriend = null;
		}
		if (this.moveFollow)
		{
			Links.x.cellar.ReturnEmptyPoint(this.moveFollow.gameObject);
			this.moveFollow = null;
		}
		if (this.sphere)
		{
			Links.x.cellar.ReturnEmptyPoint(this.sphere);
			this.sphere = null;
		}
		if (this.lookAtTurnTarget)
		{
			Links.x.cellar.ReturnEmptyPoint(this.lookAtTurnTarget.gameObject);
			this.lookAtTurnTarget = null;
		}
		if (this.heard)
		{
			Links.x.cellar.ReturnPooledGameObject(22, this.heard);
			this.heard.SetActive(false);
			this.heard = null;
		}
		if (this.seen)
		{
			Links.x.cellar.ReturnPooledGameObject(23, this.seen);
			this.seen.SetActive(false);
			this.seen = null;
		}
		if (this.oar)
		{
			Links.x.cellar.ReturnPooledGameObject(137, this.oar);
			this.oar = null;
		}
		this.EndQuip();
	}

	// Token: 0x0600044B RID: 1099 RVA: 0x00062000 File Offset: 0x00060200
	public void UpdateArrowColor()
	{
		int num = this.partyColorID;
		if (this.hoverWaypointRenderer)
		{
			this.hoverWaypointRenderer.sharedMaterial = Links.x.GetPartyMaterial(num, 4);
			this.waypointRenderer.sharedMaterial = Links.x.GetPartyMaterial(num, 4);
		}
	}

	// Token: 0x0600044C RID: 1100 RVA: 0x0006204F File Offset: 0x0006024F
	public void ClearQuips()
	{
		this.hasCinematicQuip = false;
	}

	// Token: 0x0600044D RID: 1101 RVA: 0x00062058 File Offset: 0x00060258
	public void FindQuip()
	{
		if (this.hasCinematicQuip && !Records.x.dialogue && !Records.x.removeControls)
		{
			bool flag = false;
			if (this.stats.xmlName.Contains("Fairy"))
			{
				flag = true;
			}
			bool flag2 = true;
			if (Time.timeSinceLevelLoad < this.lastIdleQuipTime)
			{
				return;
			}
			if (Time.timeSinceLevelLoad < Records.x.lastQuipTime + 3f && !flag)
			{
				return;
			}
			if ((Random.Range(0, 200) > 0 && !flag) || this.quip)
			{
				flag2 = false;
			}
			if (this.hasActions)
			{
				flag2 = false;
			}
			if (flag2)
			{
				Records.x.lastQuipTime = Time.timeSinceLevelLoad;
				this.lastIdleQuipTime = Time.timeSinceLevelLoad + Random.Range(10f, 25f);
				if (flag)
				{
					this.lastIdleQuipTime = Time.timeSinceLevelLoad + Random.Range(15f, 20f);
				}
				string text = "Idle";
				if (this.inCombat)
				{
					text = "Combat";
				}
				string text2 = Links.x.quips.GetQuip(text, this.quipIndex);
				this.StartQuip(text2);
			}
		}
	}

	// Token: 0x0600044E RID: 1102 RVA: 0x00062180 File Offset: 0x00060380
	public GameObject AddEffect(int num, string extra)
	{
		int num2 = -1;
		for (int i = 0; i < this.headEffectsID.Count; i++)
		{
			if (num == this.headEffectsID[i] && extra == this.headEffectsExtras[i])
			{
				num2 = i;
				break;
			}
		}
		if (num2 == -1)
		{
			GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(num);
			if (pooledGameObject)
			{
				pooledGameObject.transform.position = this.neck.position + new Vector3(0f, 1.5f, 0f);
				pooledGameObject.transform.parent = this.tr;
				pooledGameObject.SetActive(true);
				this.headEffectsID.Add(num);
				this.headEffectsExtras.Add(extra);
				this.headEffects.Add(pooledGameObject);
				this.currentEffect = this.headEffects.Count - 2;
				this.RotateEffects();
				if (num == 85)
				{
					Links.x.cameraEffects.AddRemoveGhost(pooledGameObject.transform.GetChild(0).gameObject.GetComponent<MeshRenderer>(), true);
				}
			}
			return pooledGameObject;
		}
		int count = this.headEffects.Count;
		return null;
	}

	// Token: 0x0600044F RID: 1103 RVA: 0x000622B0 File Offset: 0x000604B0
	public void RemoveEffect(int num, string extra, bool returnIt)
	{
		int num2 = -1;
		for (int i = 0; i < this.headEffectsID.Count; i++)
		{
			if (num == this.headEffectsID[i] && extra == this.headEffectsExtras[i])
			{
				num2 = i;
				break;
			}
		}
		if (num2 > -1)
		{
			if (num == 85 && this.headEffects[num2])
			{
				Links.x.cameraEffects.AddRemoveGhost(this.headEffects[num2].transform.GetChild(0).gameObject.GetComponent<MeshRenderer>(), false);
			}
			if (returnIt && this.headEffects[num2])
			{
				Links.x.cellar.ReturnPooledGameObject(num, this.headEffects[num2]);
			}
			this.headEffectsID.RemoveAt(num2);
			this.headEffects.RemoveAt(num2);
			this.headEffectsExtras.RemoveAt(num2);
			this.RotateEffects();
		}
	}

	// Token: 0x06000450 RID: 1104 RVA: 0x000623A8 File Offset: 0x000605A8
	public void RotateEffects()
	{
		this.currentEffect++;
		if (this.currentEffect > this.headEffects.Count - 1)
		{
			this.currentEffect = 0;
		}
		if (this.seen || this.heard)
		{
			this.currentEffect = -1;
		}
		for (int i = 0; i < this.headEffects.Count; i++)
		{
			if (this.headEffectsID[i] == 44 && !this.headEffects[i].activeSelf)
			{
				this.headEffects[i].SetActive(true);
			}
		}
		this.currentEffectTime = Time.realtimeSinceStartup;
	}

	// Token: 0x06000451 RID: 1105 RVA: 0x00062458 File Offset: 0x00060658
	public void PositionEffects()
	{
		for (int i = 0; i < this.headEffects.Count; i++)
		{
			if (this.headEffects[i])
			{
				int num = this.headEffectsID[i];
				if (num == 46 || num == 48)
				{
					this.headEffects[i].transform.position = this.tr.position + new Vector3(0f, 0.1f, 0f);
				}
				else if (num != 43)
				{
					if (num == 44 || num == 85)
					{
						Vector3 eulerAngles = Quaternion.LookRotation(Links.x.worldCamera.transform.position - this.currentPosition).eulerAngles;
						eulerAngles.x = 0f;
						eulerAngles.z = 0f;
						this.headEffects[i].transform.position = this.body.GetHead().position + new Vector3(0f, 0.3f, 0f) + Quaternion.Euler(eulerAngles) * Vector3.forward * 0.4f;
						this.headEffects[i].transform.rotation = Quaternion.Euler(eulerAngles);
					}
					else if (!this.IsSentient())
					{
						if (num == 40)
						{
							Vector3 eulerAngles2 = Quaternion.LookRotation(Links.x.worldCamera.transform.position - this.currentPosition).eulerAngles;
							eulerAngles2.x = 0f;
							eulerAngles2.z = 0f;
							this.headEffects[i].transform.position = this.body.GetHead().position + new Vector3(0f, 1f, 0f) + Quaternion.Euler(eulerAngles2) * Vector3.forward * 0.4f;
							this.headEffects[i].transform.rotation = Quaternion.Euler(eulerAngles2);
						}
						else
						{
							this.headEffects[i].transform.position = this.body.GetHead().position + new Vector3(0f, 1f, 0f);
						}
					}
					else if (this.neck == this.tr || this.neck == this.body.tr)
					{
						float num2 = this.characterHeight;
						if (this.npc && this.hasActions)
						{
							num2 += 0.25f;
						}
						this.headEffects[i].transform.position = this.tr.position + new Vector3(0f, num2, 0f);
					}
					else
					{
						float num3 = 1.5f;
						if (this.npc && this.hasActions)
						{
							num3 += 0.25f;
						}
						if (this.npc && this.stats.pinning)
						{
							num3 += 0.5f;
						}
						this.headEffects[i].transform.position = this.neck.position + new Vector3(0f, num3, 0f);
					}
				}
			}
		}
	}

	// Token: 0x06000452 RID: 1106 RVA: 0x000627E4 File Offset: 0x000609E4
	public Vector3 SubtractVectors(Vector3 a, Vector3 b)
	{
		Vector3 vector;
		vector.x = a.x - b.x;
		vector.y = a.y - b.y;
		vector.z = a.z - b.z;
		return vector;
	}

	// Token: 0x06000453 RID: 1107 RVA: 0x00062830 File Offset: 0x00060A30
	public Vector3 AddVectors(Vector3 a, Vector3 b)
	{
		Vector3 vector;
		vector.x = a.x + b.x;
		vector.y = a.y + b.y;
		vector.z = a.z + b.z;
		return vector;
	}

	// Token: 0x06000454 RID: 1108 RVA: 0x0006287C File Offset: 0x00060A7C
	public Vector3 AddVectorY(Vector3 a, float b)
	{
		Vector3 vector;
		vector.x = a.x;
		vector.y = a.y + b;
		vector.z = a.z;
		return vector;
	}

	// Token: 0x06000455 RID: 1109 RVA: 0x000628B4 File Offset: 0x00060AB4
	public float AngleDir(Vector3 fwd, Vector3 targetDir, Vector3 up)
	{
		float num = Vector3.Dot(Vector3.Cross(fwd, targetDir), up);
		if (num > 0f)
		{
			return 1f;
		}
		if (num <= 0f)
		{
			return -1f;
		}
		return 1f;
	}

	// Token: 0x06000456 RID: 1110 RVA: 0x000628F0 File Offset: 0x00060AF0
	public Vector3 CustomNormalize(Vector3 v)
	{
		double num = Math.Sqrt((double)(v.x * v.x + v.y * v.y + v.z * v.z));
		if (num > 9.99999974737875E-06)
		{
			float num2 = (float)num;
			v.x /= num2;
			v.y /= num2;
			v.z /= num2;
			return v;
		}
		return this.vectorZero;
	}

	// Token: 0x06000457 RID: 1111 RVA: 0x00062968 File Offset: 0x00060B68
	public GameObject CreateSphere(Vector3 position, float size)
	{
		GameObject gameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
		gameObject.transform.parent = Links.x.gameplay.transform;
		gameObject.transform.position = position;
		gameObject.transform.localScale = new Vector3(size, size, size);
		Object.Destroy(gameObject.GetComponent<SphereCollider>());
		gameObject.layer = 2;
		return gameObject;
	}

	// Token: 0x06000458 RID: 1112 RVA: 0x000629C8 File Offset: 0x00060BC8
	public float AttackRange()
	{
		float num = this.invRow1._MeleeRangeEnd;
		if (this.hasActions && this.actions.hasPowerDraw)
		{
			num += 30f;
		}
		return num * Records.x.nodeSize + this.attackRadius + Records.x.nodeSize / 2f;
	}

	// Token: 0x06000459 RID: 1113 RVA: 0x00062A24 File Offset: 0x00060C24
	public bool InAttackShape(Character target, Vector3 targetPosition, Character attacker, Vector3 attackerPosition, Vector3 checkPosition, Library.Inventory row)
	{
		float num = attacker.stats.MultiHitMod();
		if (attacker.stats.HandCount() > 1f)
		{
			if (target != this)
			{
				float num2 = (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius) * (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius);
				if ((attackerPosition - checkPosition).sqrMagnitude < num2)
				{
					float num3 = 80f;
					Vector3 vector = Quaternion.LookRotation(targetPosition - new Vector3(attackerPosition.x, targetPosition.y, attackerPosition.z)) * Vector3.forward;
					float num4 = Vector3.Angle(this.SubtractVectors(checkPosition, new Vector3(attackerPosition.x, checkPosition.y, attackerPosition.z)), vector);
					float num5 = num3 + num / 10f;
					if (num4 <= num5 && num4 >= num5 * -1f)
					{
						return true;
					}
				}
			}
			return false;
		}
		if (row._MainSkill == "Pole")
		{
			if (target != this)
			{
				float num6 = (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius + 5f + num / 10f) * (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius + 5f + num / 10f);
				if ((attackerPosition - checkPosition).sqrMagnitude < num6)
				{
					float num7 = 15f;
					Vector3 vector2 = Quaternion.LookRotation(targetPosition - new Vector3(attackerPosition.x, targetPosition.y, attackerPosition.z)) * Vector3.forward;
					float num8 = Vector3.Angle(this.SubtractVectors(checkPosition, new Vector3(attackerPosition.x, checkPosition.y, attackerPosition.z)), vector2);
					float num9 = num7 + num / 10f;
					if (num8 <= num9 && num8 >= num9 * -1f)
					{
						return true;
					}
				}
			}
			return false;
		}
		if (row._MainSkill == "Sword")
		{
			if (target != this)
			{
				float num10 = (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius + 2.5f) * (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius + 2.5f);
				if ((attackerPosition - checkPosition).sqrMagnitude < num10)
				{
					float num11 = 40f;
					Vector3 vector3 = Quaternion.LookRotation(targetPosition - new Vector3(attackerPosition.x, targetPosition.y, attackerPosition.z)) * Vector3.forward;
					float num12 = Vector3.Angle(this.SubtractVectors(checkPosition, new Vector3(attackerPosition.x, checkPosition.y, attackerPosition.z)), vector3);
					float num13 = num11 + num / 10f;
					if (num12 <= num13 && num12 >= num13 * -1f)
					{
						return true;
					}
				}
			}
			return false;
		}
		if (row._MainSkill == "Bow")
		{
			return false;
		}
		if (row._MainSkill == "Elixir" && Links.x.combat.inPocketAttack)
		{
			if (target != this)
			{
				float num14 = (5f + num / 10f) * (5f + num / 10f);
				if ((targetPosition - checkPosition).sqrMagnitude < num14)
				{
					return true;
				}
			}
			return false;
		}
		if (row._MainSkill == "Sling" && Links.x.combat.inPocketAttack)
		{
			if (target != this)
			{
				float num15 = (5f + num / 10f) * (5f + num / 10f);
				if ((targetPosition - checkPosition).sqrMagnitude < num15)
				{
					return true;
				}
			}
			return false;
		}
		if (row._MainSkill == "ShortSword" || row._MainSkill == "Ax" || row._MainSkill == "Hand-to-Hand")
		{
			if (target != this)
			{
				bool flag = false;
				if (row._Name.Contains("Dagger") || row._Name.Contains("Awl") || row._Name.Contains("Knife"))
				{
					flag = true;
				}
				float num16 = 0f;
				if (flag)
				{
					num16 = Mathf.Round(num / 10f);
				}
				float num17 = (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius + num16) * (row._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + this.attackRadius + num16);
				if ((attackerPosition - checkPosition).sqrMagnitude < num17)
				{
					float num18 = 60f;
					Vector3 vector4 = Quaternion.LookRotation(targetPosition - new Vector3(attackerPosition.x, targetPosition.y, attackerPosition.z)) * Vector3.forward;
					float num19 = Vector3.Angle(this.SubtractVectors(checkPosition, new Vector3(attackerPosition.x, checkPosition.y, attackerPosition.z)), vector4);
					float num20 = num18 + num / 10f;
					if (num19 <= num20 && num19 >= num20 * -1f)
					{
						return true;
					}
				}
			}
			return false;
		}
		if (row._MainSkill == "Scepter")
		{
			if (target != this)
			{
				float num21 = (3f + num / 10f) * (3f + num / 10f);
				if ((attackerPosition + Quaternion.LookRotation(targetPosition - attackerPosition) * Vector3.forward * 2f - checkPosition).sqrMagnitude < num21)
				{
					return true;
				}
			}
			return false;
		}
		if (row._MainSkill == "Whip")
		{
			if (target != this)
			{
				float num22 = (4f + num / 10f) * (4f + num / 10f);
				if ((attackerPosition + Quaternion.LookRotation(targetPosition - attackerPosition) * Vector3.forward * 4f - checkPosition).sqrMagnitude < num22)
				{
					return true;
				}
			}
			return false;
		}
		return false;
	}

	// Token: 0x0600045A RID: 1114 RVA: 0x00063098 File Offset: 0x00061298
	public void GetAttackShapeCone(Vector3 targetPosition, Library.Inventory row, out Vector3 conePosition, out Quaternion coneRotation, out float coneAngle, out float coneDistance, out float sphereRadius)
	{
		conePosition = Vector3.zero;
		coneRotation = Quaternion.LookRotation(targetPosition - new Vector3(this.currentPosition.x, targetPosition.y, this.currentPosition.z));
		coneAngle = 45f;
		coneDistance = 2f;
		sphereRadius = 0f;
		float num = this.stats.MultiHitMod();
		if (this.stats.HandCount() > 1f)
		{
			conePosition = this.currentPosition;
			coneAngle = (80f + num / 10f) * 2f;
			coneDistance = this.attackRadius * 2f + row._MeleeRangeEnd * Records.x.nodeSize;
			return;
		}
		if (row._MainSkill == "Pole")
		{
			conePosition = this.currentPosition;
			coneAngle = (15f + num / 10f) * 2f;
			coneDistance = this.attackRadius * 2f + row._MeleeRangeEnd * Records.x.nodeSize + num / 10f + 5f;
		}
		if (row._MainSkill == "Sword")
		{
			conePosition = this.currentPosition;
			coneAngle = (40f + num / 10f) * 2f;
			coneDistance = this.attackRadius * 2f + row._MeleeRangeEnd * Records.x.nodeSize + 2.5f;
		}
		if (row._MainSkill == "Bow")
		{
			conePosition = Vector3.zero;
		}
		if (row._MainSkill == "Elixir")
		{
			if (!Links.x.combat.inPocketAttack)
			{
				conePosition = Vector3.zero;
			}
			else
			{
				conePosition = targetPosition;
				coneAngle = 360f;
				sphereRadius = 5f + num / 10f;
				coneDistance = 0f;
			}
		}
		if (row._MainSkill == "Sling")
		{
			if (!Links.x.combat.inPocketAttack)
			{
				conePosition = Vector3.zero;
			}
			else
			{
				conePosition = targetPosition;
				coneAngle = 360f;
				sphereRadius = 5f + num / 10f;
				coneDistance = 0f;
			}
		}
		if (row._MainSkill == "ShortSword" || row._MainSkill == "Ax" || row._MainSkill == "Hand-to-Hand")
		{
			bool flag = false;
			if (row._Name.Contains("Dagger") || row._Name.Contains("Awl") || row._Name.Contains("Knife"))
			{
				flag = true;
			}
			if (!flag)
			{
				conePosition = this.currentPosition;
				coneAngle = (60f + num / 10f) * 2f;
				coneDistance = this.attackRadius * 2f + row._MeleeRangeEnd * Records.x.nodeSize;
			}
			else
			{
				conePosition = this.currentPosition;
				coneAngle = 360f;
				sphereRadius = this.attackRadius * 2f + row._MeleeRangeEnd * Records.x.nodeSize + num / 10f;
				coneDistance = 0f;
			}
		}
		if (row._MainSkill == "Scepter")
		{
			Vector3 vector = this.currentPosition + Quaternion.LookRotation(targetPosition - this.currentPosition) * Vector3.forward * 2f;
			conePosition = vector;
			coneAngle = 360f;
			sphereRadius = 3f + num / 10f;
			coneDistance = 0f;
		}
		if (row._MainSkill == "Whip")
		{
			Vector3 vector2 = this.currentPosition + Quaternion.LookRotation(targetPosition - this.currentPosition) * Vector3.forward * 4f;
			conePosition = vector2;
			coneAngle = 360f;
			sphereRadius = 4f + num / 10f;
			coneDistance = 0f;
		}
	}

	// Token: 0x0600045B RID: 1115 RVA: 0x000634BA File Offset: 0x000616BA
	public int GetArcPoints()
	{
		return this.arcPoints.Count;
	}

	// Token: 0x0600045C RID: 1116 RVA: 0x000634C8 File Offset: 0x000616C8
	public void DrawArc(Vector3 arcEndPosition, int traj)
	{
		this.arcTarget = arcEndPosition;
		if (this.isHitFlying)
		{
			this.arcTarget = arcEndPosition + Quaternion.LookRotation(this.tr.position - arcEndPosition) * Vector3.forward * 3f;
		}
		this.arcPoints.Clear();
		Vector3 position = this.tr.position;
		this.trajectoryModifier = 1;
		this.initialVelocity = (float)traj;
		Quaternion quaternion = this.GetBearing(position, this.arcTarget);
		this.moveFollow.rotation = quaternion;
		this.CalculateTrajectory(position, 0);
		if (traj == 0 && !this.isHitFlying && !this.ambushing && this.evading && Mathf.Abs(arcEndPosition.y - position.y) < 2f)
		{
			int num = this.arcPoints.Count - 1;
			float num2 = Vector3.Distance(position, arcEndPosition);
			for (int i = 0; i < this.arcPoints.Count; i++)
			{
				if (i != num)
				{
					Vector3 vector = this.arcPoints[i];
					Vector3 vector2 = vector;
					vector2.y = position.y;
					float num3 = Vector3.Distance(position, vector2);
					Vector3 vector3 = Vector3.Lerp(position, arcEndPosition, num3 / num2);
					float num4 = vector.y - vector3.y;
					num4 /= 2f;
					num4 += vector3.y;
					this.arcPoints[i] = new Vector3(vector.x, num4, vector.z);
				}
			}
		}
		if (this.isHitFlying && this.arcPoints.Count > 3 && Random.Range(0, 3) == 0)
		{
			position = this.arcTarget;
			this.arcTarget = arcEndPosition;
			this.trajectoryModifier = 1;
			this.initialVelocity = 0f;
			quaternion = this.GetBearing(position, this.arcTarget);
			this.moveFollow.rotation = quaternion;
			this.CalculateTrajectory(position, 1);
		}
		this.moveFollow.rotation = Quaternion.identity;
	}

	// Token: 0x0600045D RID: 1117 RVA: 0x000636D8 File Offset: 0x000618D8
	public Quaternion GetBearing(Vector3 start, Vector3 targetPt)
	{
		this.bearing = Quaternion.Euler(Vector3.zero);
		Vector3 vector = targetPt - start;
		float num = Mathf.Sqrt(Mathf.Pow(vector.x, 2f) + Mathf.Pow(vector.z, 2f));
		float num2 = -vector.y;
		float num3 = this.gravity * (this.gravity * Mathf.Pow(num, 2f) + 2f * num2 * Mathf.Pow(this.initialVelocity, 2f));
		float num4 = Mathf.Sqrt(Mathf.Pow(this.initialVelocity, 4f) - num3);
		bool flag = float.IsNaN(num4);
		if (!flag)
		{
			float num5 = (Mathf.Pow(this.initialVelocity, 2f) + (float)this.trajectoryModifier * num4) / (this.gravity * num);
			float num6 = 57.29578f * Mathf.Atan(num5);
			this.bearing = Quaternion.LookRotation(vector);
			Vector3 eulerAngles = this.bearing.eulerAngles;
			eulerAngles.x = num6;
			this.bearing.eulerAngles = eulerAngles;
		}
		if (flag)
		{
			this.initialVelocity += 1f;
			this.GetBearing(start, targetPt);
		}
		return this.bearing;
	}

	// Token: 0x0600045E RID: 1118 RVA: 0x0006380C File Offset: 0x00061A0C
	public RaycastHit CalculateTrajectory(Vector3 start, int x)
	{
		RaycastHit raycastHit = default(RaycastHit);
		float num = -(1f / this.trajectoryPrecision);
		bool flag = false;
		for (int i = 0; i < this.maximumIterations; i++)
		{
			if (!flag)
			{
				num += 1f / this.trajectoryPrecision;
				Vector3 vector = start + this.moveFollow.forward * this.initialVelocity * num + 0.5f * this.gravity2 * Mathf.Pow(num, 2f);
				if ((vector - this.arcTarget).sqrMagnitude < 0.25f)
				{
					flag = true;
					this.prevPos = vector;
				}
				this.arcPoints.Add(vector);
			}
		}
		this.arcPoints.Add(this.arcTarget);
		float num2 = -100000f;
		if (x == 0)
		{
			for (int j = 0; j < this.arcPoints.Count; j++)
			{
				if (this.arcPoints[j].y > num2)
				{
					this.topJumpPoint = this.arcPoints[j];
					num2 = this.topJumpPoint.y;
				}
			}
		}
		return raycastHit;
	}

	// Token: 0x04000526 RID: 1318
	[Header("SETTINGS")]
	public string workingName;

	// Token: 0x04000527 RID: 1319
	public string animationPrefix;

	// Token: 0x04000528 RID: 1320
	public string doorID;

	// Token: 0x04000529 RID: 1321
	public string lastDoorID;

	// Token: 0x0400052A RID: 1322
	public string terrain;

	// Token: 0x0400052B RID: 1323
	public bool protagonist;

	// Token: 0x0400052C RID: 1324
	public bool mainSelected;

	// Token: 0x0400052D RID: 1325
	public bool missing;

	// Token: 0x0400052E RID: 1326
	public bool npc;

	// Token: 0x0400052F RID: 1327
	public bool dead;

	// Token: 0x04000530 RID: 1328
	public bool stunned;

	// Token: 0x04000531 RID: 1329
	public bool swarm;

	// Token: 0x04000532 RID: 1330
	public bool canLeave;

	// Token: 0x04000533 RID: 1331
	public bool party;

	// Token: 0x04000534 RID: 1332
	public bool inCombat;

	// Token: 0x04000535 RID: 1333
	public bool doingHit;

	// Token: 0x04000536 RID: 1334
	public bool hovering;

	// Token: 0x04000537 RID: 1335
	public bool isHit;

	// Token: 0x04000538 RID: 1336
	public bool isHitFlying;

	// Token: 0x04000539 RID: 1337
	public bool downed;

	// Token: 0x0400053A RID: 1338
	public bool resting;

	// Token: 0x0400053B RID: 1339
	public bool sleeping;

	// Token: 0x0400053C RID: 1340
	public bool hasCinematicQuip;

	// Token: 0x0400053D RID: 1341
	public bool running;

	// Token: 0x0400053E RID: 1342
	public bool inactive;

	// Token: 0x0400053F RID: 1343
	public bool deadInactive;

	// Token: 0x04000540 RID: 1344
	public bool alwaysOn;

	// Token: 0x04000541 RID: 1345
	public bool stuckInPlace;

	// Token: 0x04000542 RID: 1346
	public bool cannotAttack;

	// Token: 0x04000543 RID: 1347
	public bool useGrounder;

	// Token: 0x04000544 RID: 1348
	public bool centerOfAttention;

	// Token: 0x04000545 RID: 1349
	public bool isTarget;

	// Token: 0x04000546 RID: 1350
	public bool summoned;

	// Token: 0x04000547 RID: 1351
	public bool pipeSummons;

	// Token: 0x04000548 RID: 1352
	public bool charmed;

	// Token: 0x04000549 RID: 1353
	public bool actionPicked;

	// Token: 0x0400054A RID: 1354
	public bool selected;

	// Token: 0x0400054B RID: 1355
	public bool inAction;

	// Token: 0x0400054C RID: 1356
	public bool inRecovery;

	// Token: 0x0400054D RID: 1357
	public bool inQueuedAbility;

	// Token: 0x0400054E RID: 1358
	public bool offMap;

	// Token: 0x0400054F RID: 1359
	public bool changingMaps;

	// Token: 0x04000550 RID: 1360
	public bool changingTeleports;

	// Token: 0x04000551 RID: 1361
	public bool waitingToUseItem;

	// Token: 0x04000552 RID: 1362
	public bool dayNightVanishing;

	// Token: 0x04000553 RID: 1363
	public bool ghostVanishing;

	// Token: 0x04000554 RID: 1364
	public bool vanished;

	// Token: 0x04000555 RID: 1365
	public bool sailing;

	// Token: 0x04000556 RID: 1366
	public bool boatNavigator;

	// Token: 0x04000557 RID: 1367
	public bool alwaysJump;

	// Token: 0x04000558 RID: 1368
	public bool isBoro;

	// Token: 0x04000559 RID: 1369
	public bool ignoreNodeIDs;

	// Token: 0x0400055A RID: 1370
	public bool interactiveObject;

	// Token: 0x0400055B RID: 1371
	public bool selectedBeforeDoor;

	// Token: 0x0400055C RID: 1372
	public bool ghost;

	// Token: 0x0400055D RID: 1373
	public bool hasIncenseTorch;

	// Token: 0x0400055E RID: 1374
	public bool leashed;

	// Token: 0x0400055F RID: 1375
	public bool deactivating;

	// Token: 0x04000560 RID: 1376
	public bool dodging;

	// Token: 0x04000561 RID: 1377
	public bool hasTorch;

	// Token: 0x04000562 RID: 1378
	public bool pocketPaused;

	// Token: 0x04000563 RID: 1379
	public bool jumpingAreas;

	// Token: 0x04000564 RID: 1380
	public bool jumpedAreas;

	// Token: 0x04000565 RID: 1381
	public bool inTown;

	// Token: 0x04000566 RID: 1382
	public bool ambushing;

	// Token: 0x04000567 RID: 1383
	public bool movingAreas;

	// Token: 0x04000568 RID: 1384
	public bool attackingUntilBribe;

	// Token: 0x04000569 RID: 1385
	public bool meshAlwaysOn;

	// Token: 0x0400056A RID: 1386
	public bool meshAlwaysOff;

	// Token: 0x0400056B RID: 1387
	public bool enraged;

	// Token: 0x0400056C RID: 1388
	public bool wasStunned;

	// Token: 0x0400056D RID: 1389
	public bool droppedItems;

	// Token: 0x0400056E RID: 1390
	public bool moveBackward;

	// Token: 0x0400056F RID: 1391
	public bool evading;

	// Token: 0x04000570 RID: 1392
	public bool charging;

	// Token: 0x04000571 RID: 1393
	public bool vipFollow;

	// Token: 0x04000572 RID: 1394
	public bool inFriendGroup;

	// Token: 0x04000573 RID: 1395
	public bool isFriendGroupLeader;

	// Token: 0x04000574 RID: 1396
	public bool movesOnWater;

	// Token: 0x04000575 RID: 1397
	public bool hasCreatureBuff;

	// Token: 0x04000576 RID: 1398
	public bool inCircle;

	// Token: 0x04000577 RID: 1399
	public bool hasCircleBuff;

	// Token: 0x04000578 RID: 1400
	public bool protectMe;

	// Token: 0x04000579 RID: 1401
	public bool listenForPhysicsEnd;

	// Token: 0x0400057A RID: 1402
	public bool pocketPausedOverride;

	// Token: 0x0400057B RID: 1403
	public bool willBeHostile;

	// Token: 0x0400057C RID: 1404
	public bool alwaysLookAtParty;

	// Token: 0x0400057D RID: 1405
	public bool isHostage;

	// Token: 0x0400057E RID: 1406
	public bool inSporeForest;

	// Token: 0x0400057F RID: 1407
	public int visible;

	// Token: 0x04000580 RID: 1408
	public int nodeMovingID;

	// Token: 0x04000581 RID: 1409
	public int nodeStationaryID;

	// Token: 0x04000582 RID: 1410
	public int hostility;

	// Token: 0x04000583 RID: 1411
	public int koCount;

	// Token: 0x04000584 RID: 1412
	public int moveAnimID;

	// Token: 0x04000585 RID: 1413
	public int patrolNode;

	// Token: 0x04000586 RID: 1414
	public int combatLevel;

	// Token: 0x04000587 RID: 1415
	public int quipSound;

	// Token: 0x04000588 RID: 1416
	public int quipIndex;

	// Token: 0x04000589 RID: 1417
	public int partyColorID;

	// Token: 0x0400058A RID: 1418
	public int tilesMoved;

	// Token: 0x0400058B RID: 1419
	public int desiredGraph;

	// Token: 0x0400058C RID: 1420
	public int selectedAmmoIndex;

	// Token: 0x0400058D RID: 1421
	public int selectedWpnIndex;

	// Token: 0x0400058E RID: 1422
	public int currentDoor;

	// Token: 0x0400058F RID: 1423
	public int startFleeArea;

	// Token: 0x04000590 RID: 1424
	public float distanceToParty;

	// Token: 0x04000591 RID: 1425
	public float knockback;

	// Token: 0x04000592 RID: 1426
	public float timeOfDeath;

	// Token: 0x04000593 RID: 1427
	public float leashDistance;

	// Token: 0x04000594 RID: 1428
	public float numberOfTimesKilled;

	// Token: 0x04000595 RID: 1429
	public float portraitID;

	// Token: 0x04000596 RID: 1430
	public Quaternion circleRot;

	// Token: 0x04000597 RID: 1431
	public float radius = 1f;

	// Token: 0x04000598 RID: 1432
	public float currentAnimatorSpeed;

	// Token: 0x04000599 RID: 1433
	public float fellowshipMod;

	// Token: 0x0400059A RID: 1434
	public float attackRadius = 0.5f;

	// Token: 0x0400059B RID: 1435
	public float characterHeight = 3f;

	// Token: 0x0400059C RID: 1436
	private int prevAnimID;

	// Token: 0x0400059D RID: 1437
	private bool hasLight;

	// Token: 0x0400059E RID: 1438
	private bool needsRebind;

	// Token: 0x0400059F RID: 1439
	private bool exploded;

	// Token: 0x040005A0 RID: 1440
	public string indoorID = "";

	// Token: 0x040005A1 RID: 1441
	public string animControllerName;

	// Token: 0x040005A2 RID: 1442
	public Vector3 currentPosition;

	// Token: 0x040005A3 RID: 1443
	private Color32 terrainColor;

	// Token: 0x040005A4 RID: 1444
	[Header("INVENTORY")]
	public int ammoCount1;

	// Token: 0x040005A5 RID: 1445
	public Library.Inventory invRow1;

	// Token: 0x040005A6 RID: 1446
	public Library.Inventory invRow2;

	// Token: 0x040005A7 RID: 1447
	public Library.Inventory invRow3;

	// Token: 0x040005A8 RID: 1448
	public Library.Inventory invRow4;

	// Token: 0x040005A9 RID: 1449
	public Library.Inventory altInvRow1;

	// Token: 0x040005AA RID: 1450
	public Library.Inventory altInvRow2;

	// Token: 0x040005AB RID: 1451
	public Library.Inventory altInvRow3;

	// Token: 0x040005AC RID: 1452
	public Library.Inventory altInvRow4;

	// Token: 0x040005AD RID: 1453
	public List<int> bag = new List<int>();

	// Token: 0x040005AE RID: 1454
	public List<int> bagPositions = new List<int>();

	// Token: 0x040005AF RID: 1455
	public List<Vector3> sockets = new List<Vector3>();

	// Token: 0x040005B0 RID: 1456
	public List<Vector4> durability = new List<Vector4>();

	// Token: 0x040005B1 RID: 1457
	public GameObject[] equippedItems = new GameObject[19];

	// Token: 0x040005B2 RID: 1458
	private List<int> tempBagID;

	// Token: 0x040005B3 RID: 1459
	private List<global::Item> tempBagItems;

	// Token: 0x040005B4 RID: 1460
	private List<int> tempBagAmoumt;

	// Token: 0x040005B5 RID: 1461
	private List<Vector3> tempSocketA;

	// Token: 0x040005B6 RID: 1462
	private List<Vector3> tempSocketB;

	// Token: 0x040005B7 RID: 1463
	private List<int> tempBagPos;

	// Token: 0x040005B8 RID: 1464
	private List<Vector4> tempDurability;

	// Token: 0x040005B9 RID: 1465
	public float inventoryTime;

	// Token: 0x040005BA RID: 1466
	public InventoryContainer inventoryBag;

	// Token: 0x040005BB RID: 1467
	[Header("LISTS")]
	public List<Character> lkPlayer = new List<Character>();

	// Token: 0x040005BC RID: 1468
	public List<GraphNode> lkPosition = new List<GraphNode>();

	// Token: 0x040005BD RID: 1469
	public List<string> lkAction = new List<string>();

	// Token: 0x040005BE RID: 1470
	public List<bool> lkBool = new List<bool>();

	// Token: 0x040005BF RID: 1471
	public bool hasLKP;

	// Token: 0x040005C0 RID: 1472
	private List<Character> gos;

	// Token: 0x040005C1 RID: 1473
	private Vector3[] nodeFindDirections = new Vector3[4];

	// Token: 0x040005C2 RID: 1474
	[Header("AI")]
	public Actions actions;

	// Token: 0x040005C3 RID: 1475
	public bool hasActions;

	// Token: 0x040005C4 RID: 1476
	public bool searching;

	// Token: 0x040005C5 RID: 1477
	public bool noiseImmune;

	// Token: 0x040005C6 RID: 1478
	public bool outsideDome;

	// Token: 0x040005C7 RID: 1479
	public bool waitingToJoinDome;

	// Token: 0x040005C8 RID: 1480
	public bool doingAction;

	// Token: 0x040005C9 RID: 1481
	public bool waitForPathToCharacter;

	// Token: 0x040005CA RID: 1482
	public bool moveOnTiles;

	// Token: 0x040005CB RID: 1483
	public bool usingKeys;

	// Token: 0x040005CC RID: 1484
	public bool overlapping;

	// Token: 0x040005CD RID: 1485
	public bool canSwitchBackToIdle;

	// Token: 0x040005CE RID: 1486
	public bool justMoved;

	// Token: 0x040005CF RID: 1487
	private float knockbackMax;

	// Token: 0x040005D0 RID: 1488
	public string anim;

	// Token: 0x040005D1 RID: 1489
	public int animID;

	// Token: 0x040005D2 RID: 1490
	public int walkUsed;

	// Token: 0x040005D3 RID: 1491
	public int currentTargetIndex;

	// Token: 0x040005D4 RID: 1492
	private Vector3 targetPosition;

	// Token: 0x040005D5 RID: 1493
	private Vector3 lastFatiguePosition;

	// Token: 0x040005D6 RID: 1494
	public float actionNumber;

	// Token: 0x040005D7 RID: 1495
	public GraphNode savedFollowNode;

	// Token: 0x040005D8 RID: 1496
	private float at;

	// Token: 0x040005D9 RID: 1497
	private float hitTimeReal;

	// Token: 0x040005DA RID: 1498
	private float timeSinceLastMove;

	// Token: 0x040005DB RID: 1499
	private float currentAttackSpeed;

	// Token: 0x040005DC RID: 1500
	public float attackTime;

	// Token: 0x040005DD RID: 1501
	public float hitTime;

	// Token: 0x040005DE RID: 1502
	public Character orbitTarget;

	// Token: 0x040005DF RID: 1503
	[Header("PHYSICS")]
	public bool physicsMove;

	// Token: 0x040005E0 RID: 1504
	public float movingOutOfWayTime;

	// Token: 0x040005E1 RID: 1505
	public bool turningMain;

	// Token: 0x040005E2 RID: 1506
	public bool hittingWall;

	// Token: 0x040005E3 RID: 1507
	private Quaternion lastRotation;

	// Token: 0x040005E4 RID: 1508
	private Vector3 prevMoveSpeed;

	// Token: 0x040005E5 RID: 1509
	private float rbMaxSpeed;

	// Token: 0x040005E6 RID: 1510
	public Vector3 mainMovePoint;

	// Token: 0x040005E7 RID: 1511
	public Vector3 groundPoint;

	// Token: 0x040005E8 RID: 1512
	public CharacterController cc;

	// Token: 0x040005E9 RID: 1513
	public Vector3 physicsY;

	// Token: 0x040005EA RID: 1514
	public PlayerBorders playerBorders;

	// Token: 0x040005EB RID: 1515
	private Vector3 lastFrame;

	// Token: 0x040005EC RID: 1516
	public bool jumpingPosition;

	// Token: 0x040005ED RID: 1517
	private float lastFrameTime;

	// Token: 0x040005EE RID: 1518
	private float jumpPositionTime;

	// Token: 0x040005EF RID: 1519
	private float previouslyMovingStartTime;

	// Token: 0x040005F0 RID: 1520
	private Vector3 jumpPositionVector;

	// Token: 0x040005F1 RID: 1521
	private bool needToEndJump;

	// Token: 0x040005F2 RID: 1522
	[Header("PATHFINDING")]
	public Vector3 nodePoint;

	// Token: 0x040005F3 RID: 1523
	public Vector3 endTurn;

	// Token: 0x040005F4 RID: 1524
	public Vector3 movePoint;

	// Token: 0x040005F5 RID: 1525
	public Vector3 pathTargPosition;

	// Token: 0x040005F6 RID: 1526
	public Vector3 leashCenter;

	// Token: 0x040005F7 RID: 1527
	public Vector3 terrainNormal;

	// Token: 0x040005F8 RID: 1528
	public Vector3 waitPosition;

	// Token: 0x040005F9 RID: 1529
	public int waitingForPath;

	// Token: 0x040005FA RID: 1530
	public int nextOpen;

	// Token: 0x040005FB RID: 1531
	public int nextOpenVisual;

	// Token: 0x040005FC RID: 1532
	public int nexOpenOverlap;

	// Token: 0x040005FD RID: 1533
	public int pushCount;

	// Token: 0x040005FE RID: 1534
	public int blockPathCount;

	// Token: 0x040005FF RID: 1535
	public GraphNode node;

	// Token: 0x04000600 RID: 1536
	public GraphNode mainNode2;

	// Token: 0x04000601 RID: 1537
	public GraphNode mainNode3;

	// Token: 0x04000602 RID: 1538
	public GraphNode mainNode4;

	// Token: 0x04000603 RID: 1539
	public GraphNode moveNode;

	// Token: 0x04000604 RID: 1540
	public GraphNode targetNode;

	// Token: 0x04000605 RID: 1541
	public GraphNode nextNode;

	// Token: 0x04000606 RID: 1542
	public GraphNode savedPathTarget;

	// Token: 0x04000607 RID: 1543
	public GraphNode prevNode;

	// Token: 0x04000608 RID: 1544
	public GraphNode returnToPoint;

	// Token: 0x04000609 RID: 1545
	private Vector3 prevPoint;

	// Token: 0x0400060A RID: 1546
	private Vector3 prevNodePosition;

	// Token: 0x0400060B RID: 1547
	private Vector3 prevFollowPosition;

	// Token: 0x0400060C RID: 1548
	private Vector3 randomRot;

	// Token: 0x0400060D RID: 1549
	public Quaternion rot;

	// Token: 0x0400060E RID: 1550
	public Quaternion look;

	// Token: 0x0400060F RID: 1551
	public Quaternion smoothRot;

	// Token: 0x04000610 RID: 1552
	public Quaternion savedRot;

	// Token: 0x04000611 RID: 1553
	private bool rotLeft;

	// Token: 0x04000612 RID: 1554
	private Quaternion startRot;

	// Token: 0x04000613 RID: 1555
	private Quaternion intervalRot;

	// Token: 0x04000614 RID: 1556
	private Quaternion jumpingAreasRotation;

	// Token: 0x04000615 RID: 1557
	public GraphNode slideNode;

	// Token: 0x04000616 RID: 1558
	public GraphNode lastNode;

	// Token: 0x04000617 RID: 1559
	public GraphNode fleePoint;

	// Token: 0x04000618 RID: 1560
	public GraphNode commandMove;

	// Token: 0x04000619 RID: 1561
	public Vector3 slideNodePosition;

	// Token: 0x0400061A RID: 1562
	private Character collisionCharacter;

	// Token: 0x0400061B RID: 1563
	public Character lookTarget;

	// Token: 0x0400061C RID: 1564
	public Character attackTarget;

	// Token: 0x0400061D RID: 1565
	public Character moveBackTarget;

	// Token: 0x0400061E RID: 1566
	public NNConstraint nodeConstraint;

	// Token: 0x0400061F RID: 1567
	public NNConstraint walkConstraint;

	// Token: 0x04000620 RID: 1568
	public bool forceNodePath;

	// Token: 0x04000621 RID: 1569
	public bool rotateToSlope;

	// Token: 0x04000622 RID: 1570
	public bool moving;

	// Token: 0x04000623 RID: 1571
	public bool alwaysTurn;

	// Token: 0x04000624 RID: 1572
	public bool turning;

	// Token: 0x04000625 RID: 1573
	public bool tempStop;

	// Token: 0x04000626 RID: 1574
	public bool stepReady;

	// Token: 0x04000627 RID: 1575
	public bool doTurn;

	// Token: 0x04000628 RID: 1576
	public bool fleeing;

	// Token: 0x04000629 RID: 1577
	public bool fleeingAroundPoint;

	// Token: 0x0400062A RID: 1578
	public bool prepMove;

	// Token: 0x0400062B RID: 1579
	public bool blocked;

	// Token: 0x0400062C RID: 1580
	public bool ignoreRemoveControls;

	// Token: 0x0400062D RID: 1581
	public bool moveTurn;

	// Token: 0x0400062E RID: 1582
	public bool outsideBounds;

	// Token: 0x0400062F RID: 1583
	public bool movingOutOfWay;

	// Token: 0x04000630 RID: 1584
	public bool moveToObject;

	// Token: 0x04000631 RID: 1585
	public bool movingToPatrolNode;

	// Token: 0x04000632 RID: 1586
	public bool waitingForNewPath;

	// Token: 0x04000633 RID: 1587
	public bool jumping;

	// Token: 0x04000634 RID: 1588
	public bool jumpLanding;

	// Token: 0x04000635 RID: 1589
	public bool showWaypoint;

	// Token: 0x04000636 RID: 1590
	public bool noJumpArc;

	// Token: 0x04000637 RID: 1591
	public bool checkForLeaderPath;

	// Token: 0x04000638 RID: 1592
	public bool changedFleeArea;

	// Token: 0x04000639 RID: 1593
	private bool estimatedPathSave;

	// Token: 0x0400063A RID: 1594
	private bool toDirectionSave;

	// Token: 0x0400063B RID: 1595
	private bool startTurnExit;

	// Token: 0x0400063C RID: 1596
	private bool startWithRotate;

	// Token: 0x0400063D RID: 1597
	private bool turningComplete;

	// Token: 0x0400063E RID: 1598
	private bool makePathAfterJump;

	// Token: 0x0400063F RID: 1599
	private float ammoMessageTime;

	// Token: 0x04000640 RID: 1600
	private float lookTargetTime;

	// Token: 0x04000641 RID: 1601
	private float jumpTime;

	// Token: 0x04000642 RID: 1602
	private float timeSinceLastEvade;

	// Token: 0x04000643 RID: 1603
	private float attackTargetTime;

	// Token: 0x04000644 RID: 1604
	private float t;

	// Token: 0x04000645 RID: 1605
	private float intervalY;

	// Token: 0x04000646 RID: 1606
	private float startRotY;

	// Token: 0x04000647 RID: 1607
	private float rotationTime;

	// Token: 0x04000648 RID: 1608
	private float seenTime;

	// Token: 0x04000649 RID: 1609
	private float waitForPathTime;

	// Token: 0x0400064A RID: 1610
	private float ttime;

	// Token: 0x0400064B RID: 1611
	private float moveFollowTime;

	// Token: 0x0400064C RID: 1612
	private float moveTurnSpeed;

	// Token: 0x0400064D RID: 1613
	private float moveTurns;

	// Token: 0x0400064E RID: 1614
	private float totalDist;

	// Token: 0x0400064F RID: 1615
	private float totalDistNodes;

	// Token: 0x04000650 RID: 1616
	private float fleeTime;

	// Token: 0x04000651 RID: 1617
	private float fleeStartTime;

	// Token: 0x04000652 RID: 1618
	private float returnToPointTime;

	// Token: 0x04000653 RID: 1619
	private float turnDirection;

	// Token: 0x04000654 RID: 1620
	private float timeSinceLastDirectiveCheck;

	// Token: 0x04000655 RID: 1621
	private int moveCount;

	// Token: 0x04000656 RID: 1622
	private int moveIndex;

	// Token: 0x04000657 RID: 1623
	private int maxNodesSave;

	// Token: 0x04000658 RID: 1624
	public int setArea = -1;

	// Token: 0x04000659 RID: 1625
	private float jumpingAreasTime;

	// Token: 0x0400065A RID: 1626
	private float patrolSpeed;

	// Token: 0x0400065B RID: 1627
	private GraphNode jumpAreasNode;

	// Token: 0x0400065C RID: 1628
	private float turnTimeStarted;

	// Token: 0x0400065D RID: 1629
	private float waitToNextDodge;

	// Token: 0x0400065E RID: 1630
	private float jumpSpeed;

	// Token: 0x0400065F RID: 1631
	public float waitingForNewPathTime;

	// Token: 0x04000660 RID: 1632
	private List<GraphNode> prepPathTemp;

	// Token: 0x04000661 RID: 1633
	private List<Vector3> prepVectorPathTemp;

	// Token: 0x04000662 RID: 1634
	public List<string> nodeActions = new List<string>();

	// Token: 0x04000663 RID: 1635
	public List<GraphNode> nodePath = new List<GraphNode>();

	// Token: 0x04000664 RID: 1636
	public List<GraphNode> prepPath = new List<GraphNode>();

	// Token: 0x04000665 RID: 1637
	public List<Vector3> vectorPath = new List<Vector3>();

	// Token: 0x04000666 RID: 1638
	public List<Vector3> prepVectorPath = new List<Vector3>();

	// Token: 0x04000667 RID: 1639
	private List<Vector3> pathpointVectors;

	// Token: 0x04000668 RID: 1640
	private List<Vector3> pointsTemp = new List<Vector3>();

	// Token: 0x04000669 RID: 1641
	private List<GraphNode> nodesTemp = new List<GraphNode>();

	// Token: 0x0400066A RID: 1642
	public global::Item clickedItem;

	// Token: 0x0400066B RID: 1643
	public Character followingCharacter;

	// Token: 0x0400066C RID: 1644
	public string followingType;

	// Token: 0x0400066D RID: 1645
	private float followingTime;

	// Token: 0x0400066E RID: 1646
	public GraphNode followingNode;

	// Token: 0x0400066F RID: 1647
	public global::Item followingItem;

	// Token: 0x04000670 RID: 1648
	public PuzzleActions followingInteractive;

	// Token: 0x04000671 RID: 1649
	public BreakableActions followingBreakable;

	// Token: 0x04000672 RID: 1650
	public ChestActions followingChest;

	// Token: 0x04000673 RID: 1651
	public DoorActions followingDoor;

	// Token: 0x04000674 RID: 1652
	public Boat followingBoat;

	// Token: 0x04000675 RID: 1653
	public MapExitActions followingExit;

	// Token: 0x04000676 RID: 1654
	private List<GraphNode> tempPath;

	// Token: 0x04000677 RID: 1655
	private List<GraphNode> tempPath2;

	// Token: 0x04000678 RID: 1656
	public Interact moveToInteract;

	// Token: 0x04000679 RID: 1657
	public Transform moveFollow;

	// Token: 0x0400067A RID: 1658
	public int pathTries;

	// Token: 0x0400067B RID: 1659
	public int attackRadiusTries;

	// Token: 0x0400067C RID: 1660
	private Seeker seeker;

	// Token: 0x0400067D RID: 1661
	private SimpleSmoothModifier simpleSmoothModifier;

	// Token: 0x0400067E RID: 1662
	private RaycastModifier raycastModifier;

	// Token: 0x0400067F RID: 1663
	public float blockedTime;

	// Token: 0x04000680 RID: 1664
	public float timeSinceFollowPath;

	// Token: 0x04000681 RID: 1665
	private bool canPush = true;

	// Token: 0x04000682 RID: 1666
	public IEnumerator pathToCharacterCoroutine;

	// Token: 0x04000683 RID: 1667
	public IEnumerator worldUIFade;

	// Token: 0x04000684 RID: 1668
	public float delayPath;

	// Token: 0x04000685 RID: 1669
	public Vector3 clickedPoint;

	// Token: 0x04000686 RID: 1670
	private NNConstraint interactConstraint = new NNConstraint();

	// Token: 0x04000687 RID: 1671
	private List<GraphNode> allNodes;

	// Token: 0x04000688 RID: 1672
	private List<GraphNode> suitableNodes = new List<GraphNode>();

	// Token: 0x04000689 RID: 1673
	private List<bool> used = new List<bool>();

	// Token: 0x0400068A RID: 1674
	private List<GraphNode> bestNodes = new List<GraphNode>();

	// Token: 0x0400068B RID: 1675
	private List<GraphNode> nearNodes = new List<GraphNode>();

	// Token: 0x0400068C RID: 1676
	[Header("MISC")]
	public bool setupComplete;

	// Token: 0x0400068D RID: 1677
	private Vector3 vectorZero;

	// Token: 0x0400068E RID: 1678
	private Vector3 upVector;

	// Token: 0x0400068F RID: 1679
	private Vector3 yAdd3;

	// Token: 0x04000690 RID: 1680
	private Vector3 yAdd2;

	// Token: 0x04000691 RID: 1681
	private Vector3 yAdd1;

	// Token: 0x04000692 RID: 1682
	private Vector3 headHeight;

	// Token: 0x04000693 RID: 1683
	private Vector3 torsoHeight;

	// Token: 0x04000694 RID: 1684
	private RaycastHit rayHit;

	// Token: 0x04000695 RID: 1685
	public string goreType;

	// Token: 0x04000696 RID: 1686
	public int updateCount;

	// Token: 0x04000697 RID: 1687
	public Vector3 torsoPosition;

	// Token: 0x04000698 RID: 1688
	public Vector3 raycastPosition;

	// Token: 0x04000699 RID: 1689
	private float updateTime;

	// Token: 0x0400069A RID: 1690
	private float quipStartTime;

	// Token: 0x0400069B RID: 1691
	private float tileCheckUpdateTime;

	// Token: 0x0400069C RID: 1692
	private float sporeTime;

	// Token: 0x0400069D RID: 1693
	public float postHitTime;

	// Token: 0x0400069E RID: 1694
	public float heightAdd;

	// Token: 0x0400069F RID: 1695
	public float attackSpeed;

	// Token: 0x040006A0 RID: 1696
	public float timeSinceMoveEnded;

	// Token: 0x040006A1 RID: 1697
	public float patrolHoldTime;

	// Token: 0x040006A2 RID: 1698
	public float spinTime;

	// Token: 0x040006A3 RID: 1699
	public float timeSinceCircle;

	// Token: 0x040006A4 RID: 1700
	private bool currentlyInDialogue;

	// Token: 0x040006A5 RID: 1701
	private bool slowLook;

	// Token: 0x040006A6 RID: 1702
	private bool huddleOn;

	// Token: 0x040006A7 RID: 1703
	private bool waitingForSpinUp;

	// Token: 0x040006A8 RID: 1704
	public IEnumerator delayPathCoroutine;

	// Token: 0x040006A9 RID: 1705
	private float timeSinceHeardTime;

	// Token: 0x040006AA RID: 1706
	private float collidedTime;

	// Token: 0x040006AB RID: 1707
	private float timeSinceSeenTime;

	// Token: 0x040006AC RID: 1708
	private float lastIdleQuipTime;

	// Token: 0x040006AD RID: 1709
	private float attentionTime;

	// Token: 0x040006AE RID: 1710
	private float prevAnimSpeed;

	// Token: 0x040006AF RID: 1711
	private float prePausedSpeed;

	// Token: 0x040006B0 RID: 1712
	private float lastExcuseTime;

	// Token: 0x040006B1 RID: 1713
	private float kickUseTime;

	// Token: 0x040006B2 RID: 1714
	private float soundTime;

	// Token: 0x040006B3 RID: 1715
	private float fatigueUpdateTime;

	// Token: 0x040006B4 RID: 1716
	private float lastGhostFleeTime;

	// Token: 0x040006B5 RID: 1717
	private float chargeTime;

	// Token: 0x040006B6 RID: 1718
	public int attentionCount;

	// Token: 0x040006B7 RID: 1719
	public int waitingToUseBeltItemID;

	// Token: 0x040006B8 RID: 1720
	public int waitingToUseBeltItemIndex;

	// Token: 0x040006B9 RID: 1721
	public global::Item waitingToUseBagItem;

	// Token: 0x040006BA RID: 1722
	private StringFast str = new StringFast(64);

	// Token: 0x040006BB RID: 1723
	public int instrumentInUse;

	// Token: 0x040006BC RID: 1724
	public bool emphasizeQuip;

	// Token: 0x040006BD RID: 1725
	public float blockDodgeStartTime;

	// Token: 0x040006BE RID: 1726
	private bool waitingForDodgeUp;

	// Token: 0x040006BF RID: 1727
	public float inQueuedAbilityTime;

	// Token: 0x040006C0 RID: 1728
	public float inActionTime;

	// Token: 0x040006C1 RID: 1729
	public float inRecoveryTime;

	// Token: 0x040006C2 RID: 1730
	public float dazedTime;

	// Token: 0x040006C3 RID: 1731
	public float pickupTime;

	// Token: 0x040006C4 RID: 1732
	public float missingTime;

	// Token: 0x040006C5 RID: 1733
	public int dazedCount;

	// Token: 0x040006C6 RID: 1734
	[Header("OBJECTS")]
	public Transform tr;

	// Token: 0x040006C7 RID: 1735
	public GameObject sphere;

	// Token: 0x040006C8 RID: 1736
	public GameObject waypoint;

	// Token: 0x040006C9 RID: 1737
	public GameObject bodyObj;

	// Token: 0x040006CA RID: 1738
	public GameObject goreObj;

	// Token: 0x040006CB RID: 1739
	public OverHeadUI quip;

	// Token: 0x040006CC RID: 1740
	public Boat boat;

	// Token: 0x040006CD RID: 1741
	private Gauge stunGauge;

	// Token: 0x040006CE RID: 1742
	private Gauge sneakGauge;

	// Token: 0x040006CF RID: 1743
	private Gauge itemGauge;

	// Token: 0x040006D0 RID: 1744
	private Gauge dazedGauge;

	// Token: 0x040006D1 RID: 1745
	public Body body;

	// Token: 0x040006D2 RID: 1746
	public Transform grassInteraction;

	// Token: 0x040006D3 RID: 1747
	public Animator animator;

	// Token: 0x040006D4 RID: 1748
	private Animator waypointAnimator;

	// Token: 0x040006D5 RID: 1749
	public Stats stats;

	// Token: 0x040006D6 RID: 1750
	public GameObject seen;

	// Token: 0x040006D7 RID: 1751
	public GameObject heard;

	// Token: 0x040006D8 RID: 1752
	public Portrait characterSheetPortrait;

	// Token: 0x040006D9 RID: 1753
	public Portrait portrait;

	// Token: 0x040006DA RID: 1754
	public DockFriend dockFriend;

	// Token: 0x040006DB RID: 1755
	public Rigidbody rb;

	// Token: 0x040006DC RID: 1756
	public AudioSource audioSource;

	// Token: 0x040006DD RID: 1757
	public CreatureActions creatures;

	// Token: 0x040006DE RID: 1758
	public TimelineIcon timelineIcon;

	// Token: 0x040006DF RID: 1759
	public CapsuleCollider thisCollider;

	// Token: 0x040006E0 RID: 1760
	public FOWRevealer fowRevealer;

	// Token: 0x040006E1 RID: 1761
	public FOWRevealerInterior fowRevealerInterior;

	// Token: 0x040006E2 RID: 1762
	public Moonlight moonlight;

	// Token: 0x040006E3 RID: 1763
	public GameObject mapIcon;

	// Token: 0x040006E4 RID: 1764
	public Transform lookAtTurnTarget;

	// Token: 0x040006E5 RID: 1765
	public Animator circleAnimator;

	// Token: 0x040006E6 RID: 1766
	public Transform circleTr;

	// Token: 0x040006E7 RID: 1767
	private GameObject circle;

	// Token: 0x040006E8 RID: 1768
	private List<MeshRenderer> circleRenderers = new List<MeshRenderer>();

	// Token: 0x040006E9 RID: 1769
	private MeshRenderer waypointRenderer;

	// Token: 0x040006EA RID: 1770
	private MeshRenderer hoverWaypointRenderer;

	// Token: 0x040006EB RID: 1771
	private bool usingCircles;

	// Token: 0x040006EC RID: 1772
	public GameObject bracket;

	// Token: 0x040006ED RID: 1773
	public GameObject heart;

	// Token: 0x040006EE RID: 1774
	public Animator dazed;

	// Token: 0x040006EF RID: 1775
	private GameObject incense;

	// Token: 0x040006F0 RID: 1776
	public GameObject healthBar;

	// Token: 0x040006F1 RID: 1777
	public GameObject healthBarTarget;

	// Token: 0x040006F2 RID: 1778
	public Transform healthBarTr;

	// Token: 0x040006F3 RID: 1779
	private Vector3 healthBarScale;

	// Token: 0x040006F4 RID: 1780
	public GameObject staminaBar;

	// Token: 0x040006F5 RID: 1781
	public Transform staminaBarTr;

	// Token: 0x040006F6 RID: 1782
	private Vector3 staminaBarScale;

	// Token: 0x040006F7 RID: 1783
	public Transform neck;

	// Token: 0x040006F8 RID: 1784
	public List<GameObject> headEffects = new List<GameObject>();

	// Token: 0x040006F9 RID: 1785
	private List<int> headEffectsID = new List<int>();

	// Token: 0x040006FA RID: 1786
	private List<string> headEffectsExtras = new List<string>();

	// Token: 0x040006FB RID: 1787
	private int currentEffect;

	// Token: 0x040006FC RID: 1788
	private float currentEffectTime;

	// Token: 0x040006FD RID: 1789
	private GameObject dodgeFX;

	// Token: 0x040006FE RID: 1790
	private GameObject boroBoat;

	// Token: 0x040006FF RID: 1791
	public bool hasInfoCard;

	// Token: 0x04000700 RID: 1792
	public Character friendLeader;

	// Token: 0x04000701 RID: 1793
	public EnemyGroup group;

	// Token: 0x04000702 RID: 1794
	public PuzzleActions revivalGem;

	// Token: 0x04000703 RID: 1795
	public StatusRing statusRing;

	// Token: 0x04000704 RID: 1796
	public Stamina stamina;

	// Token: 0x04000705 RID: 1797
	public GameObject oar;

	// Token: 0x04000706 RID: 1798
	public GameObject splash;

	// Token: 0x04000707 RID: 1799
	public GameObject waterCollider;

	// Token: 0x04000708 RID: 1800
	private Rigidbody waterColliderRigidbody;

	// Token: 0x04000709 RID: 1801
	private WaterCollisions waterCollisions;

	// Token: 0x0400070A RID: 1802
	[Header("ARC")]
	private float gravity = -9.81f;

	// Token: 0x0400070B RID: 1803
	private float initialVelocity = 3f;

	// Token: 0x0400070C RID: 1804
	private Quaternion bearing;

	// Token: 0x0400070D RID: 1805
	private int trajectoryModifier = 1;

	// Token: 0x0400070E RID: 1806
	private Vector3 projectileVelocity;

	// Token: 0x0400070F RID: 1807
	private Vector3 arcTarget;

	// Token: 0x04000710 RID: 1808
	private float trajectoryPrecision = 20f;

	// Token: 0x04000711 RID: 1809
	private int maximumIterations = 50;

	// Token: 0x04000712 RID: 1810
	private Vector3 gravity2 = new Vector3(0f, -9.81f, 0f);

	// Token: 0x04000713 RID: 1811
	public LineRenderer lineRendererToDrawTrajectory;

	// Token: 0x04000714 RID: 1812
	private Vector3 prevPos;

	// Token: 0x04000715 RID: 1813
	public List<Vector3> arcPoints = new List<Vector3>();

	// Token: 0x04000716 RID: 1814
	public int currentArcIndex;

	// Token: 0x04000717 RID: 1815
	private Vector3 previousPosition;

	// Token: 0x04000718 RID: 1816
	private Vector3 topJumpPoint;

	// Token: 0x04000719 RID: 1817
	public CollisionListener bouncer;

	// Token: 0x0400071A RID: 1818
	private Vector3 savedBounceVel;

	// Token: 0x0400071B RID: 1819
	private Vector3 savedBounceAngVel;
}
