public override void OnLoad(ConfigNode node)
        {
            base.OnLoad(node);

            if (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight)
            {
                return;
            }

            foreach (ConfigNode node2 in node.GetNodes("MATERIAL"))
            {
                IEnumerable <Renderer> renderers = GetRenderers(node2);

                if (node2.GetValue("shader") is string newShaderName)
                {
                    if (Shader.Find(newShaderName) is Shader newShader)
                    {
                        foreach (Renderer renderer in renderers)
                        {
                            renderer.material.shader = newShader;
                        }
                    }
                    else
                    {
                        this.LogError($"Can't find shader {newShaderName}");
                        continue;
                    }
                }

                MaterialModifierParser parser = new MaterialModifierParser();

                foreach (ConfigNode node3 in node2.nodes)
                {
                    IMaterialModifier modifier;
                    try
                    {
                        modifier = parser.Parse(node3);
                    }
                    catch (Exception ex)
                    {
                        this.LogException($"cannot parse node as material modifier: \n{node3.ToString()}\n", ex);
                        continue;
                    }

                    foreach (Renderer renderer in renderers)
                    {
                        modifier.Modify(renderer.material);
                    }
                }
            }

            isEnabled       = false;
            moduleIsEnabled = false;
        }
        private IEnumerator WaitAndUpdateMaterials()
        {
            yield return(null);

            if (string.IsNullOrEmpty(serializedNode))
            {
                this.LogError("Serialized node is null or empty!");
                yield break;
            }

            ConfigNode node = ConfigNode.Parse(serializedNode).nodes[0];

            ModuleProceduralFairing fairingModule = part.FindModuleImplementing <ModuleProceduralFairing>();

            if (fairingModule == null)
            {
                this.LogError("No fairing module found on part!");
                yield break;
            }

            MaterialModifierParser parser = new MaterialModifierParser();

            foreach (ConfigNode node2 in node.nodes)
            {
                IMaterialModifier modifier;
                try
                {
                    modifier = parser.Parse(node2);
                }
                catch (Exception ex)
                {
                    this.LogException($"cannot parse node as material modifier: \n{node2.ToString()}\n", ex);
                    continue;
                }

                modifier.Modify(fairingModule.FairingMaterial);
                modifier.Modify(fairingModule.FairingConeMaterial);
                modifier.Modify(fairingModule.FairingFlightMaterial);
                modifier.Modify(fairingModule.FairingFlightConeMaterial);

                foreach (ProceduralFairings.FairingPanel fairingPanel in fairingModule.Panels)
                {
                    MeshRenderer renderer = fairingPanel.go.GetComponent <MeshRenderer>();
                    modifier.Modify(renderer.material);
                }
            }
        }