public override void OnInspectorGUI()
    {
        OSSkillTree tree = (OSSkillTree)target;

        tree.definitions = (OSDefinitions)EditorGUILayout.ObjectField("Definitions", tree.definitions, typeof(OSDefinitions), false);

        if (!tree.definitions)
        {
            GUI.color = Color.red;
            EditorGUILayout.LabelField("You need to link an OSDefinitions prefab with this item", EditorStyles.boldLabel);
            GUI.color = Color.white;
        }
        else
        {
            tree.eventHandler = (GameObject)EditorGUILayout.ObjectField("Event handler", tree.eventHandler, typeof(GameObject), true);

            EditorGUILayout.Space();

            string[] rootStrings = new string [tree.roots.Length];

            for (int i = 0; i < rootStrings.Length; i++)
            {
                rootStrings[i] = tree.roots[i].name;
            }

            EditorGUILayout.BeginHorizontal();

            rootIndex = EditorGUILayout.Popup("Root", rootIndex, rootStrings);

            GUI.backgroundColor = Color.red;
            if (GUILayout.Button("x", GUILayout.Width(28), GUILayout.Height(14)))
            {
                if (tree.roots.Length > 1)
                {
                    List <OSSkillTree.Root> tmp = new List <OSSkillTree.Root> (tree.roots);

                    tmp.RemoveAt(rootIndex);

                    tree.roots = tmp.ToArray();

                    rootIndex = Mathf.Clamp(0, tree.roots.Length - 1, rootIndex);
                }
            }
            GUI.backgroundColor = Color.white;

            EditorGUILayout.EndHorizontal();

            GUI.backgroundColor = Color.green;
            if (GUILayout.Button("+", GUILayout.Width(28), GUILayout.Height(14)))
            {
                List <OSSkillTree.Root> tmp = new List <OSSkillTree.Root> (tree.roots);

                OSSkillTree.Root newRoot = new OSSkillTree.Root();
                newRoot.name = "New Root";
                tmp.Add(newRoot);

                rootIndex = tree.roots.Length;

                tree.roots = tmp.ToArray();
            }
            GUI.backgroundColor = Color.white;

            if (tree.roots.Length < 1)
            {
                return;
            }

            GUILayout.Space(20);

            tree.roots[rootIndex].name = EditorGUILayout.TextField("Name", tree.roots[rootIndex].name);

            EditorGUILayout.Space();

            EditorGUILayout.LabelField("Skills");

            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(20);

            EditorGUILayout.BeginVertical();

            foreach (OSSkillTree.Skill skill in tree.roots[rootIndex].skills)
            {
                skill.name        = EditorGUILayout.TextField("Name", skill.name);
                skill.description = EditorGUILayout.TextField("Description", skill.description);
                skill.level       = EditorGUILayout.IntField("Level", skill.level);
                skill.mpCost      = EditorGUILayout.FloatField("MP Cost", skill.mpCost);
                skill.active      = EditorGUILayout.Toggle("Active", skill.active);
                skill.enabled     = EditorGUILayout.Toggle("Enabled", skill.enabled);

                EditorGUILayout.Space();

                EditorGUILayout.LabelField("Attributes", GUILayout.Width(100));

                EditorGUILayout.BeginHorizontal();

                GUILayout.Space(20);

                EditorGUILayout.BeginVertical();

                int i = 0;

                foreach (OSAttribute attr in skill.attributes)
                {
                    EditorGUILayout.BeginHorizontal();

                    attr.definitions = tree.definitions;
                    attr.index       = EditorGUILayout.Popup(attr.index, tree.definitions.GetAttributeStrings());
                    attr.value       = EditorGUILayout.FloatField(attr.value);
                    EditorGUILayout.LabelField(attr.suffix, GUILayout.Width(80));

                    GUI.backgroundColor = Color.red;
                    if (GUILayout.Button("x", GUILayout.Width(28), GUILayout.Height(14)))
                    {
                        List <OSAttribute> tmpAttr = new List <OSAttribute> (skill.attributes);

                        tmpAttr.RemoveAt(i);

                        skill.attributes = tmpAttr.ToArray();
                        return;
                    }
                    GUI.backgroundColor = Color.white;

                    EditorGUILayout.EndHorizontal();

                    i++;
                }

                GUI.backgroundColor = Color.green;
                if (GUILayout.Button("+", GUILayout.Width(28), GUILayout.Height(14)))
                {
                    List <OSAttribute> tmpAttr = new List <OSAttribute> (skill.attributes);

                    tmpAttr.Add(new OSAttribute(tree.definitions));

                    skill.attributes = tmpAttr.ToArray();
                }
                GUI.backgroundColor = Color.white;

                EditorGUILayout.EndVertical();

                EditorGUILayout.EndHorizontal();

                GUILayout.Space(20);
            }

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndHorizontal();

            GUI.backgroundColor = Color.green;
            if (GUILayout.Button("+", GUILayout.Width(28), GUILayout.Height(14)))
            {
                List <OSSkillTree.Skill> skillTmp = new List <OSSkillTree.Skill> (tree.roots[rootIndex].skills);

                OSSkillTree.Skill newSkill = new OSSkillTree.Skill();
                newSkill.name = "New Skill";
                skillTmp.Add(newSkill);

                tree.roots[rootIndex].skills = skillTmp.ToArray();
            }
            GUI.backgroundColor = Color.white;
        }

        if (GUI.changed)
        {
            OSInventoryInspector.SavePrefab(target);
        }
    }
	public override void OnInspectorGUI () {
		OSSkillTree tree = (OSSkillTree) target;
		
		tree.definitions = (OSDefinitions) EditorGUILayout.ObjectField ( "Definitions", tree.definitions, typeof ( OSDefinitions ), false );
		
		if ( !tree.definitions ) {
			GUI.color = Color.red;
			EditorGUILayout.LabelField ( "You need to link an OSDefinitions prefab with this item", EditorStyles.boldLabel );
			GUI.color = Color.white;

		} else {
			tree.eventHandler = (GameObject) EditorGUILayout.ObjectField ( "Event handler", tree.eventHandler, typeof ( GameObject ), true );
			
			EditorGUILayout.Space ();

			string[] rootStrings = new string [tree.roots.Length];

			for ( int i = 0; i < rootStrings.Length; i++ ) {
				rootStrings[i] = tree.roots[i].name;
			}

			EditorGUILayout.BeginHorizontal ();
			
			rootIndex = EditorGUILayout.Popup ( "Root", rootIndex, rootStrings );
			
			GUI.backgroundColor = Color.red;
			if ( GUILayout.Button ( "x", GUILayout.Width ( 28 ), GUILayout.Height ( 14 ) ) ) {
				if ( tree.roots.Length > 1 ) {
					List< OSSkillTree.Root > tmp = new List< OSSkillTree.Root > ( tree.roots );
		
					tmp.RemoveAt ( rootIndex );

					tree.roots = tmp.ToArray ();
					
					rootIndex = Mathf.Clamp ( 0, tree.roots.Length - 1, rootIndex );
				}
			}
			GUI.backgroundColor = Color.white;

			EditorGUILayout.EndHorizontal ();
			
			GUI.backgroundColor = Color.green;
			if ( GUILayout.Button ( "+", GUILayout.Width ( 28 ), GUILayout.Height ( 14 ) ) ) {
				List< OSSkillTree.Root > tmp = new List< OSSkillTree.Root > ( tree.roots );
	
				OSSkillTree.Root newRoot = new OSSkillTree.Root ();
				newRoot.name = "New Root";
				tmp.Add ( newRoot );

				rootIndex = tree.roots.Length;

				tree.roots = tmp.ToArray ();
			}
			GUI.backgroundColor = Color.white;

			if ( tree.roots.Length < 1 ) {
				return;
			}

			GUILayout.Space ( 20 );
			
			tree.roots[rootIndex].name = EditorGUILayout.TextField ( "Name", tree.roots[rootIndex].name );

			EditorGUILayout.Space ();
			
			EditorGUILayout.LabelField ( "Skills" );

			EditorGUILayout.BeginHorizontal ();

			GUILayout.Space ( 20 );

			EditorGUILayout.BeginVertical ();

			foreach ( OSSkillTree.Skill skill in tree.roots[rootIndex].skills ) {
				skill.name = EditorGUILayout.TextField ( "Name", skill.name );
				skill.description = EditorGUILayout.TextField ( "Description", skill.description );
				skill.level = EditorGUILayout.IntField ( "Level", skill.level );
				skill.mpCost = EditorGUILayout.FloatField ( "MP Cost", skill.mpCost );
				skill.active = EditorGUILayout.Toggle ( "Active", skill.active );
				skill.enabled = EditorGUILayout.Toggle ( "Enabled", skill.enabled );
				
				EditorGUILayout.Space ();
				
				EditorGUILayout.LabelField ( "Attributes", GUILayout.Width ( 100 ) );

				EditorGUILayout.BeginHorizontal ();

				GUILayout.Space ( 20 );

				EditorGUILayout.BeginVertical ();

				int i = 0;

				foreach ( OSAttribute attr in skill.attributes ) {
					EditorGUILayout.BeginHorizontal ();
					
					attr.definitions = tree.definitions;
					attr.index = EditorGUILayout.Popup ( attr.index, tree.definitions.GetAttributeStrings () );
					attr.value = EditorGUILayout.FloatField ( attr.value );
					EditorGUILayout.LabelField ( attr.suffix, GUILayout.Width ( 80 ) );
					
					GUI.backgroundColor = Color.red;
					if ( GUILayout.Button ( "x" , GUILayout.Width ( 28 ), GUILayout.Height ( 14 ) ) ) {
						List< OSAttribute > tmpAttr = new List< OSAttribute > ( skill.attributes );

						tmpAttr.RemoveAt ( i );

						skill.attributes = tmpAttr.ToArray ();
						return;
					}
					GUI.backgroundColor = Color.white;
					
					EditorGUILayout.EndHorizontal ();

					i++;
				}
				
				GUI.backgroundColor = Color.green;
				if ( GUILayout.Button ( "+" , GUILayout.Width ( 28 ), GUILayout.Height ( 14 ) ) ) {
					List< OSAttribute > tmpAttr = new List< OSAttribute > ( skill.attributes );

					tmpAttr.Add ( new OSAttribute ( tree.definitions ) );

					skill.attributes = tmpAttr.ToArray ();
				}
				GUI.backgroundColor = Color.white;
				
				EditorGUILayout.EndVertical ();
				
				EditorGUILayout.EndHorizontal ();

				GUILayout.Space ( 20 );
			}
			
			EditorGUILayout.EndVertical ();
			
			EditorGUILayout.EndHorizontal ();
			
			GUI.backgroundColor = Color.green;
			if ( GUILayout.Button ( "+", GUILayout.Width ( 28 ), GUILayout.Height ( 14 ) ) ) {
				List< OSSkillTree.Skill > skillTmp = new List< OSSkillTree.Skill > ( tree.roots[rootIndex].skills );
	
				OSSkillTree.Skill newSkill = new OSSkillTree.Skill ();
				newSkill.name = "New Skill";
				skillTmp.Add ( newSkill );

				tree.roots[rootIndex].skills = skillTmp.ToArray ();
			}
			GUI.backgroundColor = Color.white;
		}
		
		if ( GUI.changed ) {
			OSInventoryInspector.SavePrefab ( target );
		}
	}