public bool Restore(string machineName, IEnumerable <MyObjectBuilder_ScriptSMCursor> cursors)
        {
            MyObjectBuilder_ScriptSM machineDefinition;

            if (!m_machineDefinitions.TryGetValue(machineName, out machineDefinition))
            {
                return(false);
            }

            var definitionWithoutCursors = new MyObjectBuilder_ScriptSM
            {
                Name        = machineDefinition.Name,
                Nodes       = machineDefinition.Nodes,
                Transitions = machineDefinition.Transitions
            };

            var newMachine = new MyVSStateMachine();

            newMachine.Init(definitionWithoutCursors);

            foreach (var newCursorData in cursors)
            {
                if (newMachine.RestoreCursor(newCursorData.NodeName) == null)
                {
                    return(false);
                }
            }

            m_runningMachines.Add(newMachine);
            return(true);
        }
        public void Init(MyObjectBuilder_ScriptSM ob, long?ownerId = null)
        {
            m_objectBuilder = ob;
            Name            = ob.Name;

            if (ob.Nodes != null)
            {
                foreach (var nodeData in ob.Nodes)
                {
                    MyStateMachineNode stateNode;

                    if (nodeData is MyObjectBuilder_ScriptSMFinalNode)
                    {
                        stateNode = new MyVSStateMachineFinalNode(nodeData.Name);
                    }
                    else if (nodeData is MyObjectBuilder_ScriptSMSpreadNode)
                    {
                        stateNode = new MyVSStateMachineSpreadNode(nodeData.Name);
                    }
                    else if (nodeData is MyObjectBuilder_ScriptSMBarrierNode)
                    {
                        stateNode = new MyVSStateMachineBarrierNode(nodeData.Name);
                    }
                    else
                    {
                        var scriptType  = MyVSAssemblyProvider.GetType("VisualScripting.CustomScripts." + nodeData.ScriptClassName);
                        var missionNode = new MyVSStateMachineNode(nodeData.Name, scriptType);
                        if (missionNode.ScriptInstance != null)
                        {
                            if (ownerId == null)
                            {
                                missionNode.ScriptInstance.OwnerId = ob.OwnerId;
                            }
                            else
                            {
                                missionNode.ScriptInstance.OwnerId = ownerId.Value;
                            }
                        }

                        stateNode = missionNode;
                    }

                    AddNode(stateNode);
                }
            }

            if (ob.Transitions != null)
            {
                foreach (var transitionData in ob.Transitions)
                {
                    AddTransition(transitionData.From, transitionData.To, name: transitionData.Name);
                }
            }

            if (ob.Cursors != null)
            {
                foreach (var cursorData in ob.Cursors)
                {
                    CreateCursor(cursorData.NodeName);
                }
            }
        }