private void CreateNodeCreationMenu()
        {
            Assembly assembly = Assembly.GetExecutingAssembly();

            foreach (var type in assembly.GetTypes())
            {
                if (type.GetCustomAttribute <NodeAttribute>() != null)
                {
                    NodeMenuItem menuItem = new NodeMenuItem(type.GetCustomAttribute <NodeAttribute>().Type)
                    {
                        Header = type.GetCustomAttribute <NodeAttribute>().MenuName,
                    };
                    menuItem.Click += HandleNodeMenu;

                    if (type.IsSubclassOf(typeof(Nodes.ActionNodes.ActionNode)))
                    {
                        actionNodesMenu.Items.Add(menuItem);
                    }
                    else if (type.IsSubclassOf(typeof(Nodes.EventNodes.EventNode)))
                    {
                        eventNodesMenu.Items.Add(menuItem);
                    }
                    else if (type.IsSubclassOf(typeof(Nodes.TargetNodes.TargetNode)))
                    {
                        targetNodesMenu.Items.Add(menuItem);
                    }
                }
            }
        }
        /// <summary>
        /// Shows a node selection menu in the editor at the mouse position with all node which has a connection possibilities with the passed NodeConnector.
        /// </summary>
        /// <param name="connector"></param>
        public void ShowNodeSelectionMenuInNodeEditor(NodeConnector connector)
        {
            ClearNodeEditorContexMenu();

            Assembly assembly = Assembly.GetExecutingAssembly();

            foreach (var type in assembly.GetTypes())
            {
                if (type.GetCustomAttribute <NodeAttribute>() == null || type.GetCustomAttribute <NodeAttribute>().AllowedTypes == null)
                {
                    continue;
                }

                if (connector.CanConnect(type.GetCustomAttribute <NodeAttribute>().Type) && (type.GetCustomAttribute <NodeAttribute>().AllowedTypes.Contains(connector.ParentNodeType) || type.GetCustomAttribute <NodeAttribute>().AllowedTypes.Contains(Node.GetSuperiorType(connector.ParentNodeType))))
                {
                    NodeMenuItem menuItem = new NodeMenuItem(type.GetCustomAttribute <NodeAttribute>().Type, connector.ParentNode)
                    {
                        Header = type.GetCustomAttribute <NodeAttribute>().MenuName,
                    };
                    menuItem.Click += HandleNodeMenu;

                    if (type.Namespace.Contains("AIOwnerNodes"))
                    {
                        selectionMenuOwnerNodes.Items.Add(menuItem);
                    }
                    else if (type.Namespace.Contains("ActionNodes"))
                    {
                        selectionMenuActionNodes.Items.Add(menuItem);
                    }
                    else if (type.Namespace.Contains("EventNodes"))
                    {
                        selectionMenuEventNodes.Items.Add(menuItem);
                    }
                    else if (type.Namespace.Contains("TargetNodes"))
                    {
                        selectionMenuTargetNodes.Items.Add(menuItem);
                    }
                }
            }
        }
        /// <summary>
        /// Shows a node selection menu in the editor at the mouse position which allows to create any node at the mouse position
        /// </summary>
        /// <param name="connector"></param>
        public void ShowNodeSelectionMenuInNodeEditor(Point mousePosition)
        {
            ClearNodeEditorContexMenu();

            Assembly assembly = Assembly.GetExecutingAssembly();

            foreach (var type in assembly.GetTypes())
            {
                if (type.GetCustomAttribute <NodeAttribute>() == null)
                {
                    continue;
                }

                NodeMenuItem menuItem = new NodeMenuItem(type.GetCustomAttribute <NodeAttribute>().Type, mousePosition)
                {
                    Header = type.GetCustomAttribute <NodeAttribute>().MenuName,
                };
                menuItem.Click += HandleNodeMenu;
                if (type.Namespace.Contains("AIOwnerNodes"))
                {
                    selectionMenuOwnerNodes.Items.Add(menuItem);
                }
                else if (type.Namespace.Contains("ActionNodes"))
                {
                    selectionMenuActionNodes.Items.Add(menuItem);
                }
                else if (type.Namespace.Contains("EventNodes"))
                {
                    selectionMenuEventNodes.Items.Add(menuItem);
                }
                else if (type.Namespace.Contains("TargetNodes"))
                {
                    selectionMenuTargetNodes.Items.Add(menuItem);
                }
            }
        }