using System;
using System.Collections.Generic;
using HutongGames.PlayMaker;
using UnityEngine;

// Token: 0x0200005B RID: 91
[AddComponentMenu("PlayMaker/PlayMakerFSM")]
public class PlayMakerFSM : MonoBehaviour
{
	// Token: 0x170000FC RID: 252
	// (get) Token: 0x060003D6 RID: 982 RVA: 0x000113D4 File Offset: 0x0000F5D4
	public static List<PlayMakerFSM> FsmList
	{
		get
		{
			return PlayMakerFSM.fsmList;
		}
	}

	// Token: 0x060003D7 RID: 983 RVA: 0x000113DC File Offset: 0x0000F5DC
	public static PlayMakerFSM FindFsmOnGameObject(GameObject go, string fsmName)
	{
		foreach (PlayMakerFSM playMakerFSM in PlayMakerFSM.fsmList)
		{
			if (playMakerFSM.gameObject == go && playMakerFSM.FsmName == fsmName)
			{
				return playMakerFSM;
			}
		}
		return null;
	}

	// Token: 0x170000FD RID: 253
	// (get) Token: 0x060003D8 RID: 984 RVA: 0x0001144C File Offset: 0x0000F64C
	public FsmTemplate FsmTemplate
	{
		get
		{
			return this.fsmTemplate;
		}
	}

	// Token: 0x170000FE RID: 254
	// (get) Token: 0x060003D9 RID: 985 RVA: 0x00011454 File Offset: 0x0000F654
	// (set) Token: 0x060003DA RID: 986 RVA: 0x0001145C File Offset: 0x0000F65C
	public GUITexture GuiTexture { get; private set; }

	// Token: 0x170000FF RID: 255
	// (get) Token: 0x060003DB RID: 987 RVA: 0x00011468 File Offset: 0x0000F668
	// (set) Token: 0x060003DC RID: 988 RVA: 0x00011470 File Offset: 0x0000F670
	public GUIText GuiText { get; private set; }

	// Token: 0x17000100 RID: 256
	// (get) Token: 0x060003DD RID: 989 RVA: 0x0001147C File Offset: 0x0000F67C
	// (set) Token: 0x060003DE RID: 990 RVA: 0x00011484 File Offset: 0x0000F684
	public static bool DrawGizmos { get; set; }

	// Token: 0x060003DF RID: 991 RVA: 0x0001148C File Offset: 0x0000F68C
	public void Reset()
	{
		if (this.fsm == null)
		{
			this.fsm = new Fsm();
		}
		this.fsmTemplate = null;
		this.fsm.Reset(this);
	}

	// Token: 0x060003E0 RID: 992 RVA: 0x000114B4 File Offset: 0x0000F6B4
	private void Awake()
	{
		this.Init();
	}

	// Token: 0x060003E1 RID: 993 RVA: 0x000114BC File Offset: 0x0000F6BC
	private void Init()
	{
		bool flag = Application.platform == RuntimePlatform.FlashPlayer;
		if (flag)
		{
			Debug.LogError("PlayMaker: This build platform is not supported. Please check the Asset Store for Add-Ons to support Blackberry, Windows Phone 8, and Windows 8 Store platforms.");
			base.enabled = false;
			return;
		}
		if (this.fsmTemplate != null)
		{
			if (Application.isPlaying)
			{
				string name = this.fsm.Name;
				this.fsm = new Fsm(this.fsmTemplate.fsm, this.fsm.Variables)
				{
					Name = name,
					UsedInTemplate = null
				};
			}
		}
		else
		{
			if (this.fsm == null)
			{
				this.Reset();
			}
			if (this.fsm == null)
			{
				Debug.LogError("Could not initialize FSM!");
				base.enabled = false;
				return;
			}
		}
		this.fsm.Init(this);
		if (this.fsm.MouseEvents && base.GetComponent<PlayMakerMouseEvents>() == null)
		{
			base.gameObject.AddComponent<PlayMakerMouseEvents>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleCollisionEnter && base.GetComponent<PlayMakerCollisionEnter>() == null)
		{
			base.gameObject.AddComponent<PlayMakerCollisionEnter>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleCollisionExit && base.GetComponent<PlayMakerCollisionExit>() == null)
		{
			base.gameObject.AddComponent<PlayMakerCollisionExit>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleCollisionStay && base.GetComponent<PlayMakerCollisionStay>() == null)
		{
			base.gameObject.AddComponent<PlayMakerCollisionStay>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleTriggerEnter && base.GetComponent<PlayMakerTriggerEnter>() == null)
		{
			base.gameObject.AddComponent<PlayMakerTriggerEnter>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleTriggerExit && base.GetComponent<PlayMakerTriggerExit>() == null)
		{
			base.gameObject.AddComponent<PlayMakerTriggerExit>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleTriggerStay && base.GetComponent<PlayMakerTriggerStay>() == null)
		{
			base.gameObject.AddComponent<PlayMakerTriggerStay>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleFixedUpdate && base.GetComponent<PlayMakerFixedUpdate>() == null)
		{
			base.gameObject.AddComponent<PlayMakerFixedUpdate>().hideFlags = HideFlags.HideInInspector;
		}
		if (this.fsm.HandleOnGUI && base.GetComponent<PlayMakerOnGUI>() == null)
		{
			PlayMakerOnGUI playMakerOnGUI = base.gameObject.AddComponent<PlayMakerOnGUI>();
			playMakerOnGUI.playMakerFSM = this;
		}
		if (this.fsm.HandleApplicationEvents && base.GetComponent<PlayMakerApplicationEvents>() == null)
		{
			base.gameObject.AddComponent<PlayMakerApplicationEvents>().hideFlags = HideFlags.HideInInspector;
		}
	}

	// Token: 0x060003E2 RID: 994 RVA: 0x0001172C File Offset: 0x0000F92C
	public void SetFsmTemplate(FsmTemplate template)
	{
		this.fsmTemplate = template;
		if (template != null)
		{
			this.Fsm.Variables = new FsmVariables(this.fsmTemplate.fsm.Variables);
		}
		else
		{
			this.Fsm.Reset(this);
		}
		this.Init();
	}

	// Token: 0x060003E3 RID: 995 RVA: 0x00011780 File Offset: 0x0000F980
	private void Start()
	{
		this.GuiTexture = base.GetComponent<GUITexture>();
		this.GuiText = base.GetComponent<GUIText>();
		if (!this.fsm.Started)
		{
			this.fsm.Start();
		}
	}

	// Token: 0x060003E4 RID: 996 RVA: 0x000117B4 File Offset: 0x0000F9B4
	private void OnEnable()
	{
		PlayMakerFSM.fsmList.Add(this);
		this.fsm.OnEnable();
	}

	// Token: 0x060003E5 RID: 997 RVA: 0x000117CC File Offset: 0x0000F9CC
	private void Update()
	{
		if (!this.fsm.Finished)
		{
			this.fsm.Update();
		}
	}

	// Token: 0x060003E6 RID: 998 RVA: 0x000117E8 File Offset: 0x0000F9E8
	private void LateUpdate()
	{
		FsmVariables.GlobalVariablesSynced = false;
		if (!this.fsm.Finished)
		{
			this.fsm.LateUpdate();
		}
	}

	// Token: 0x060003E7 RID: 999 RVA: 0x00011808 File Offset: 0x0000FA08
	private void OnDisable()
	{
		PlayMakerFSM.fsmList.Remove(this);
		if (this.fsm != null && !this.fsm.Finished)
		{
			this.fsm.OnDisable();
		}
	}

	// Token: 0x060003E8 RID: 1000 RVA: 0x00011838 File Offset: 0x0000FA38
	private void OnDestroy()
	{
		PlayMakerFSM.fsmList.Remove(this);
		if (this.fsm != null)
		{
			this.fsm.OnDestroy();
		}
	}

	// Token: 0x060003E9 RID: 1001 RVA: 0x0001185C File Offset: 0x0000FA5C
	private void OnApplicationQuit()
	{
		this.fsm.Event(FsmEvent.ApplicationQuit);
		PlayMakerFSM.ApplicationIsQuitting = true;
	}

	// Token: 0x060003EA RID: 1002 RVA: 0x00011874 File Offset: 0x0000FA74
	private void OnDrawGizmos()
	{
		if (this.fsm != null)
		{
			this.fsm.OnDrawGizmos();
		}
	}

	// Token: 0x060003EB RID: 1003 RVA: 0x0001188C File Offset: 0x0000FA8C
	public void ChangeState(FsmEvent fsmEvent)
	{
		this.fsm.Event(fsmEvent);
	}

	// Token: 0x060003EC RID: 1004 RVA: 0x0001189C File Offset: 0x0000FA9C
	[Obsolete("Use SendEvent(string) instead.")]
	public void ChangeState(string eventName)
	{
		this.fsm.Event(eventName);
	}

	// Token: 0x060003ED RID: 1005 RVA: 0x000118AC File Offset: 0x0000FAAC
	public void SendEvent(string eventName)
	{
		this.fsm.Event(eventName);
	}

	// Token: 0x060003EE RID: 1006 RVA: 0x000118BC File Offset: 0x0000FABC
	[RPC]
	public void SendRemoteFsmEvent(string eventName)
	{
		this.fsm.Event(eventName);
	}

	// Token: 0x060003EF RID: 1007 RVA: 0x000118CC File Offset: 0x0000FACC
	public static void BroadcastEvent(string fsmEventName)
	{
		if (!string.IsNullOrEmpty(fsmEventName))
		{
			PlayMakerFSM.BroadcastEvent(FsmEvent.GetFsmEvent(fsmEventName));
		}
	}

	// Token: 0x060003F0 RID: 1008 RVA: 0x000118E4 File Offset: 0x0000FAE4
	public static void BroadcastEvent(FsmEvent fsmEvent)
	{
		List<PlayMakerFSM> list = new List<PlayMakerFSM>(PlayMakerFSM.FsmList);
		foreach (PlayMakerFSM playMakerFSM in list)
		{
			if (!(playMakerFSM == null) && playMakerFSM.Fsm != null)
			{
				playMakerFSM.Fsm.ProcessEvent(fsmEvent, null);
			}
		}
	}

	// Token: 0x060003F1 RID: 1009 RVA: 0x00011954 File Offset: 0x0000FB54
	private void OnBecameVisible()
	{
		this.fsm.Event(FsmEvent.BecameVisible);
	}

	// Token: 0x060003F2 RID: 1010 RVA: 0x00011968 File Offset: 0x0000FB68
	private void OnBecameInvisible()
	{
		this.fsm.Event(FsmEvent.BecameInvisible);
	}

	// Token: 0x060003F3 RID: 1011 RVA: 0x0001197C File Offset: 0x0000FB7C
	private void OnLevelWasLoaded()
	{
		this.fsm.Event(FsmEvent.LevelLoaded);
	}

	// Token: 0x060003F4 RID: 1012 RVA: 0x00011990 File Offset: 0x0000FB90
	private void OnControllerColliderHit(ControllerColliderHit hitCollider)
	{
		this.fsm.OnControllerColliderHit(hitCollider);
	}

	// Token: 0x060003F5 RID: 1013 RVA: 0x000119A0 File Offset: 0x0000FBA0
	private void OnPlayerConnected(NetworkPlayer player)
	{
		Fsm.EventData.Player = player;
		this.fsm.Event(FsmEvent.PlayerConnected);
	}

	// Token: 0x060003F6 RID: 1014 RVA: 0x000119C0 File Offset: 0x0000FBC0
	private void OnServerInitialized()
	{
		this.fsm.Event(FsmEvent.ServerInitialized);
	}

	// Token: 0x060003F7 RID: 1015 RVA: 0x000119D4 File Offset: 0x0000FBD4
	private void OnConnectedToServer()
	{
		this.fsm.Event(FsmEvent.ConnectedToServer);
	}

	// Token: 0x060003F8 RID: 1016 RVA: 0x000119E8 File Offset: 0x0000FBE8
	private void OnPlayerDisconnected(NetworkPlayer player)
	{
		Fsm.EventData.Player = player;
		this.fsm.Event(FsmEvent.PlayerDisconnected);
	}

	// Token: 0x060003F9 RID: 1017 RVA: 0x00011A08 File Offset: 0x0000FC08
	private void OnDisconnectedFromServer(NetworkDisconnection info)
	{
		Fsm.EventData.DisconnectionInfo = info;
		this.fsm.Event(FsmEvent.DisconnectedFromServer);
	}

	// Token: 0x060003FA RID: 1018 RVA: 0x00011A28 File Offset: 0x0000FC28
	private void OnFailedToConnect(NetworkConnectionError error)
	{
		Fsm.EventData.ConnectionError = error;
		this.fsm.Event(FsmEvent.FailedToConnect);
	}

	// Token: 0x060003FB RID: 1019 RVA: 0x00011A48 File Offset: 0x0000FC48
	private void OnNetworkInstantiate(NetworkMessageInfo info)
	{
		Fsm.EventData.NetworkMessageInfo = info;
		this.fsm.Event(FsmEvent.NetworkInstantiate);
	}

	// Token: 0x060003FC RID: 1020 RVA: 0x00011A68 File Offset: 0x0000FC68
	private void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
	{
		if (!FsmVariables.GlobalVariablesSynced)
		{
			FsmVariables.GlobalVariablesSynced = true;
			PlayMakerFSM.NetworkSyncVariables(stream, FsmVariables.GlobalVariables);
		}
		PlayMakerFSM.NetworkSyncVariables(stream, this.Fsm.Variables);
	}

	// Token: 0x060003FD RID: 1021 RVA: 0x00011A94 File Offset: 0x0000FC94
	private static void NetworkSyncVariables(BitStream stream, FsmVariables variables)
	{
		if (stream.isWriting)
		{
			foreach (FsmString fsmString in variables.StringVariables)
			{
				if (fsmString.NetworkSync)
				{
					char[] array = fsmString.Value.ToCharArray();
					int num = array.Length;
					stream.Serialize(ref num);
					for (int j = 0; j < num; j++)
					{
						stream.Serialize(ref array[j]);
					}
				}
			}
			foreach (FsmBool fsmBool in variables.BoolVariables)
			{
				if (fsmBool.NetworkSync)
				{
					bool value = fsmBool.Value;
					stream.Serialize(ref value);
				}
			}
			foreach (FsmFloat fsmFloat in variables.FloatVariables)
			{
				if (fsmFloat.NetworkSync)
				{
					float value2 = fsmFloat.Value;
					stream.Serialize(ref value2);
				}
			}
			foreach (FsmInt fsmInt in variables.IntVariables)
			{
				if (fsmInt.NetworkSync)
				{
					int value3 = fsmInt.Value;
					stream.Serialize(ref value3);
				}
			}
			foreach (FsmQuaternion fsmQuaternion in variables.QuaternionVariables)
			{
				if (fsmQuaternion.NetworkSync)
				{
					Quaternion value4 = fsmQuaternion.Value;
					stream.Serialize(ref value4);
				}
			}
			foreach (FsmVector3 fsmVector in variables.Vector3Variables)
			{
				if (fsmVector.NetworkSync)
				{
					Vector3 value5 = fsmVector.Value;
					stream.Serialize(ref value5);
				}
			}
			foreach (FsmColor fsmColor in variables.ColorVariables)
			{
				if (fsmColor.NetworkSync)
				{
					Color value6 = fsmColor.Value;
					stream.Serialize(ref value6.r);
					stream.Serialize(ref value6.g);
					stream.Serialize(ref value6.b);
					stream.Serialize(ref value6.a);
				}
			}
			foreach (FsmVector2 fsmVector2 in variables.Vector2Variables)
			{
				if (fsmVector2.NetworkSync)
				{
					Vector2 value7 = fsmVector2.Value;
					stream.Serialize(ref value7.x);
					stream.Serialize(ref value7.y);
				}
			}
			return;
		}
		foreach (FsmString fsmString2 in variables.StringVariables)
		{
			if (fsmString2.NetworkSync)
			{
				int num6 = 0;
				stream.Serialize(ref num6);
				char[] array2 = new char[num6];
				for (int num7 = 0; num7 < num6; num7++)
				{
					stream.Serialize(ref array2[num7]);
				}
				fsmString2.Value = new string(array2);
			}
		}
		foreach (FsmBool fsmBool2 in variables.BoolVariables)
		{
			if (fsmBool2.NetworkSync)
			{
				bool value8 = false;
				stream.Serialize(ref value8);
				fsmBool2.Value = value8;
			}
		}
		foreach (FsmFloat fsmFloat2 in variables.FloatVariables)
		{
			if (fsmFloat2.NetworkSync)
			{
				float value9 = 0f;
				stream.Serialize(ref value9);
				fsmFloat2.Value = value9;
			}
		}
		foreach (FsmInt fsmInt2 in variables.IntVariables)
		{
			if (fsmInt2.NetworkSync)
			{
				int value10 = 0;
				stream.Serialize(ref value10);
				fsmInt2.Value = value10;
			}
		}
		foreach (FsmQuaternion fsmQuaternion2 in variables.QuaternionVariables)
		{
			if (fsmQuaternion2.NetworkSync)
			{
				Quaternion identity = Quaternion.identity;
				stream.Serialize(ref identity);
				fsmQuaternion2.Value = identity;
			}
		}
		foreach (FsmVector3 fsmVector3 in variables.Vector3Variables)
		{
			if (fsmVector3.NetworkSync)
			{
				Vector3 zero = Vector3.zero;
				stream.Serialize(ref zero);
				fsmVector3.Value = zero;
			}
		}
		foreach (FsmColor fsmColor2 in variables.ColorVariables)
		{
			if (fsmColor2.NetworkSync)
			{
				float r = 0f;
				stream.Serialize(ref r);
				float g = 0f;
				stream.Serialize(ref g);
				float b = 0f;
				stream.Serialize(ref b);
				float a = 0f;
				stream.Serialize(ref a);
				fsmColor2.Value = new Color(r, g, b, a);
			}
		}
		foreach (FsmVector2 fsmVector4 in variables.Vector2Variables)
		{
			if (fsmVector4.NetworkSync)
			{
				float x = 0f;
				stream.Serialize(ref x);
				float y = 0f;
				stream.Serialize(ref y);
				fsmVector4.Value = new Vector2(x, y);
			}
		}
	}

	// Token: 0x060003FE RID: 1022 RVA: 0x00011F74 File Offset: 0x00010174
	private void OnMasterServerEvent(MasterServerEvent masterServerEvent)
	{
		Fsm.EventData.MasterServerEvent = masterServerEvent;
		this.fsm.Event(FsmEvent.MasterServerEvent);
	}

	// Token: 0x17000101 RID: 257
	// (get) Token: 0x060003FF RID: 1023 RVA: 0x00011F94 File Offset: 0x00010194
	public Fsm Fsm
	{
		get
		{
			this.fsm.Owner = this;
			return this.fsm;
		}
	}

	// Token: 0x17000102 RID: 258
	// (get) Token: 0x06000400 RID: 1024 RVA: 0x00011FA8 File Offset: 0x000101A8
	// (set) Token: 0x06000401 RID: 1025 RVA: 0x00011FB8 File Offset: 0x000101B8
	public string FsmName
	{
		get
		{
			return this.fsm.Name;
		}
		set
		{
			this.fsm.Name = value;
		}
	}

	// Token: 0x17000103 RID: 259
	// (get) Token: 0x06000402 RID: 1026 RVA: 0x00011FC8 File Offset: 0x000101C8
	// (set) Token: 0x06000403 RID: 1027 RVA: 0x00011FD8 File Offset: 0x000101D8
	public string FsmDescription
	{
		get
		{
			return this.fsm.Description;
		}
		set
		{
			this.fsm.Description = value;
		}
	}

	// Token: 0x17000104 RID: 260
	// (get) Token: 0x06000404 RID: 1028 RVA: 0x00011FE8 File Offset: 0x000101E8
	public bool Active
	{
		get
		{
			return this.fsm.Active;
		}
	}

	// Token: 0x17000105 RID: 261
	// (get) Token: 0x06000405 RID: 1029 RVA: 0x00011FF8 File Offset: 0x000101F8
	public string ActiveStateName
	{
		get
		{
			if (this.fsm.ActiveState != null)
			{
				return this.fsm.ActiveState.Name;
			}
			return "";
		}
	}

	// Token: 0x17000106 RID: 262
	// (get) Token: 0x06000406 RID: 1030 RVA: 0x00012020 File Offset: 0x00010220
	public FsmState[] FsmStates
	{
		get
		{
			return this.fsm.States;
		}
	}

	// Token: 0x17000107 RID: 263
	// (get) Token: 0x06000407 RID: 1031 RVA: 0x00012030 File Offset: 0x00010230
	public FsmEvent[] FsmEvents
	{
		get
		{
			return this.fsm.Events;
		}
	}

	// Token: 0x17000108 RID: 264
	// (get) Token: 0x06000408 RID: 1032 RVA: 0x00012040 File Offset: 0x00010240
	public FsmTransition[] FsmGlobalTransitions
	{
		get
		{
			return this.fsm.GlobalTransitions;
		}
	}

	// Token: 0x17000109 RID: 265
	// (get) Token: 0x06000409 RID: 1033 RVA: 0x00012050 File Offset: 0x00010250
	public FsmVariables FsmVariables
	{
		get
		{
			return this.fsm.Variables;
		}
	}

	// Token: 0x1700010A RID: 266
	// (get) Token: 0x0600040A RID: 1034 RVA: 0x00012060 File Offset: 0x00010260
	public bool UsesTemplate
	{
		get
		{
			return this.fsmTemplate != null;
		}
	}

	// Token: 0x0400024E RID: 590
	private static readonly List<PlayMakerFSM> fsmList = new List<PlayMakerFSM>();

	// Token: 0x0400024F RID: 591
	public static bool ApplicationIsQuitting;

	// Token: 0x04000250 RID: 592
	[SerializeField]
	[HideInInspector]
	private Fsm fsm;

	// Token: 0x04000251 RID: 593
	[SerializeField]
	private FsmTemplate fsmTemplate;
}