public override void OnStart(StartState state)
 {
     base.OnStart(state);
     if (state == StartState.None)
     {
         return;
     }
     //init compressor
     if (Compressor.Valid)
     {
         Compressor.Init(part);
         if (CompressorSound != string.Empty)
         {
             Utils.createFXSound(part, fxSndCompressor, CompressorSound, true);
             fxSndCompressor.audio.volume = GameSettings.SHIP_VOLUME * SoundVolume;
         }
     }
     //get controlled modules
     if (!string.IsNullOrEmpty(ControlledModules))
     {
         foreach (string module_name in Utils.ParseLine(ControlledModules, Utils.Delimiters))
         {
             if (module_name == "")
             {
                 continue;
             }
             if (!part.Modules.Contains(module_name))
             {
                 this.Log("OnStart: {} does not contain {} module.", part.name, module_name);
                 continue;
             }
             var modules = new List <IControllableModule>();
             foreach (PartModule pm in part.Modules)
             {
                 if (pm.moduleName == module_name)
                 {
                     var controllableModule = pm as IControllableModule;
                     if (controllableModule != null)
                     {
                         modules.Add(controllableModule);
                         if (State != AnimatorState.Opened)
                         {
                             controllableModule.Enable(false);
                         }
                     }
                     else
                     {
                         this.Log("OnStart: {} is not a ControllableModule. Skipping it.", pm.moduleName);
                     }
                 }
             }
             controlled_modules.AddRange(modules);
         }
     }
     //get animated nodes
     foreach (string node_name in Utils.ParseLine(AnimatedNodes, Utils.Delimiters))
     {
         if (node_name == "")
         {
             continue;
         }
         Transform node_transform = part.FindModelTransform(node_name);
         if (node_transform == null)
         {
             this.Log("OnStart: no transform '{}' in {}", node_name, part.name);
             continue;
         }
         AttachNode node = part.FindAttachNode(node_name);
         if (node == null)
         {
             node = part.srfAttachNode.id == node_name ? part.srfAttachNode : null;
         }
         if (node == null)
         {
             this.Log("OnStart: no node '{}' in {}", node_name, part.name);
             continue;
         }
         var a_node = new AnimatedNode(node, node_transform, part);
         animated_nodes.Add(a_node);
     }
     //calculate prefab metric
     prefab        = part.partInfo.partPrefab;
     prefab_metric = new Metric(prefab);
     //get compressed gas for the first time
     if (CompressedGas < 0 &&
         (state == StartState.Editor ||
          vessel != null && vessel.staticPressurekPa > 1e-6))
     {
         CompressedGas = InflatableVolume;
     }
     //prevent accidental looping of animation
     Loop = false;
     //update part, GUI and set the flag
     UpdatePart();
     ToggleEvents();
     StartCoroutine(SlowUpdate());
     StartCoroutine(FirstTimeUpdateNodes());
     isEnabled = false;
 }